나는 더 간단한 버전을 구현했습니다. 이 하위 클래스는 selected
, highlighted
및 enabled
과 비슷한 기능을 제공하는 BOOL outlined
속성을 제공합니다.
[customButtton setImage:[UIImage imageNamed:@"MyOutlinedButton.png"] forState:UIControlStateOutlined]
과 같은 것을 사용하면 outlined
속성을 업데이트 할 때 자동으로 작동합니다.
기타 상태 + 속성을 추가 할 수 있습니다.
UICustomButton.h
extern const UIControlState UIControlStateOutlined;
@interface UICustomButton : UIButton
@property (nonatomic) BOOL outlined;
@end
UICustomButton.m 닉의 답변
const UIControlState UIControlStateOutlined = (1 << 16);
@interface OEButton()
@property UIControlState customState;
@end
@implementation OEButton
- (void)setOutlined:(BOOL)outlined
{
if (outlined)
{
self.customState |= UIControlStateOutlined;
}
else
{
self.customState &= ~UIControlStateOutlined;
}
[self stateWasUpdated];
}
- (BOOL)outlined
{
return (self.customState & UIControlStateOutlined) == UIControlStateOutlined;
}
- (UIControlState)state {
return [super state] | self.customState;
}
- (void)stateWasUpdated
{
[self setNeedsLayout];
}
// These are only needed if you have additional code on -(void)stateWasUpdated
// - (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];
// }
@end
UIControlState 열거 앱 제어 상태가 마스크 0x00FF0000를 사용하도록 지정합니다. 이것은 1 << 16 to 1 << 23을 의미합니다. 1 << 3이 유효합니까? 그것은 아마도 사과가 추가 할 수있는 미래의 통제 상태와 충돌 할 수 있습니까? –
또한주의해야합니다. 사용자 정의 상태를 사용하여 UIButton에서 제목, 배경 이미지, 이미지, titleShadow 또는 attributedTitle과 같은 사용자 정의 자원을 제어하려는 경우. 사용자 정의 상태를 변경 한 후에 setNeedsLayout을 호출해야합니다. 그렇지 않으면 버튼을 다시 탭한 후 모양이 업데이트됩니다. –
확실히 향후 버전의 OS에서 충돌하는 Adam 상태로 1 << 3을 사용하지 마십시오. 비트 마스크 범위 0x00FF0000의 숫자를 사용하십시오. – christophercotton