I have a UIButton
that has a default image, and another image for highlight/selected image. When pressing the button, the button's image changes to the highlighted, then to the selected if the touchUp was inside. The usual stuff.. All setup within IB.
However, I am trying to set a label over the button, in a very tricky place (not aligned, hard coded).
I tried adding a Label over the button in IB. Problem: I need the label's text color to change as the button's control state changes.
So, I created a UIButton
subclass, added a UILabel
Outlet, and by overriding the following methods:
- (void)touchesBegan/Moved/Cancelled/Ended:...;
- (void)setSelected:...
I was able to achieve what I want... BUT! When I quickly click the button, the change is not reflected. and sometimes it doesn't work properly... I even used asynchronous calls... No use.
So, I headed to the UIButton
's titleLabel
. I tried to use it with no luck.
So, I tried UIButton setTitle: forState:
, no use ... Help?
Extra Details:
- (id)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; if (self) { [self.titleLabel setFrame:CGRectMake(0, 0, 100, 100)]; [self.titleLabel setText:@"THE TITLE LABEL"]; [self.titleLabel setHidden:NO]; [self.imageView setAlpha:0.2f]; NSLog(@"%@", self.subviews); [self setTitle:@"DEFAULT!!" forState:UIControlStateNormal]; } return self; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [super touchesBegan:touches withEvent:event]; [self performSelector:@selector(check) withObject:nil afterDelay:0.1]; } - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { [super touchesMoved:touches withEvent:event]; [self performSelector:@selector(check) withObject:nil afterDelay:0.1]; } - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { [super touchesCancelled:touches withEvent:event]; [self performSelector:@selector(check) withObject:nil afterDelay:0.1]; } - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { [super touchesEnded:touches withEvent:event]; [self performSelector:@selector(check) withObject:nil afterDelay:0.1]; } - (void)setSelected:(BOOL)selected { [super setSelected:selected]; [self performSelector:@selector(check) withObject:nil afterDelay:0.1]; } - (void)check { if (self.isSelected || self.state == UIControlStateHighlighted || self.state == UIControlStateSelected) { [_label setHighlighted:YES]; } else { [_label setHighlighted:NO]; } }
OUTPUT:
(
"<UIImageView: 0x8b24930; frame = (0 0; 243 39); clipsToBounds = YES; alpha = 0.2; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x8b248e0>>",
"<UIButtonLabel: 0x8b247a0; frame = (0 0; 100 100); text = 'THE TITLE LABEL'; clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x8b25000>>"
)
The best answer I found, after all these months, is to override:
To position the label the way I want. This makes me able to make use of:
For the more curious: