I think the problem is that the UIButton's built-in selected property is interfering with your custom one. I tried changing the name to 'selacted' (just to make it different) and changed all the corresponding code, as seen below, and it seemed to work as you expect it to.
@interface MyButton : UIButton
@property (getter=isSelacted, setter=setSelacted:) BOOL selacted;
@end
@implementation MyButton
@synthesize selacted = _selacted;
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self.selacted = NO;
}
return self;
}
-(void) setSelacted:(BOOL)selacted
{
if (selacted)
{
[self setImage:[UIImage imageNamed:@"image1"] forState:UIControlStateNormal];
}
else
{
[self setImage:[UIImage imageNamed:@"image2"] forState:UIControlStateNormal];
}
_selacted = selacted;
}
-(BOOL) isSelacted
{
return _selacted;
}
And then in your viewController:
- (IBAction) touchChangeStateButton
{
BOOL b = btn.isSelacted;
btn.selacted = !b;
}