Can I use custom values of UIControlState for my own control?

cocoa-touch, ios, objective-c, uicontrol

Solution

You can make use of the custom states in a subclass of UIControl.

- Create a variable called `customState` in which you will manage your custom states.

- If you need to set a state, do your flag operations against this variable, and call `[self stateWasUpdated]`.

- Override the `state` property to return `[super state]` bitwise OR'd against your `customState`

- Override the `enabled`, `selected` and `highlighted` setters so that they call `[self stateWasUpdated]`. This will allow you to respond to any changes in state, not just changes to `customState`

- Implement `stateWasUpdated` with logic to respond to changes in state

In the header:

#define kUIControlStateCustomState (1 << 16)

@interface MyControl : UIControl {
    UIControlState customState;
}

In the implementation:

@implementation MyControl

-(void)setCustomState {
    customState |= kUIControlStateCustomState;
    [self stateWasUpdated];
}

-(void)unsetCustomState {
    customState &= ~kUIControlStateCustomState;
    [self stateWasUpdated];
}

- (UIControlState)state {
    return [super state] | customState;
}

- (void)setSelected:(BOOL)newSelected {
    [super setSelected:newSelected];
    [self stateWasUpdated];
}

- (void)setHighlighted:(BOOL)newHighlighted {
    [super setHighlighted:newHighlighted];
    [self stateWasUpdated];
}

- (void)setEnabled:(BOOL)newEnabled {
    [super setEnabled:newEnabled];
    [self stateWasUpdated];
}

- (void)stateWasUpdated {
    // Add your custom code here to respond to the change in state
}

@end

Problem

Is there a way to set a custom states -- not one of the existing `UIControlState` values -- for a `UIControl`? In the `UIControlSate` enum, there are 16 bits that can be used for custom control states: ``` UIControlStateApplication = 0x00FF0000, // additional flags available for application use ``` The problem is that `UIControl`'s `state` property is readonly. I want to set different background images to my `UIButton` for custom states.

Original source

Related problems