Dựa trên @Nick answer Tôi đã triển khai một phiên bản đơn giản hơn. Phân lớp này hiển thị thuộc tính BOOL outlined
tương tự chức năng với selected
, highlighted
và enabled
.
Làm những việc như [customButtton setImage:[UIImage imageNamed:@"MyOutlinedButton.png"] forState:UIControlStateOutlined]
làm cho nó tự động hoạt động khi bạn cập nhật thuộc tính outlined
.
Nhiều trong số này trạng thái + tài sản có thể được thêm nếu cần.
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
Nguồn
2014-07-15 12:39:25
Các UIControlState enum xác định rằng các quốc gia kiểm soát ứng dụng sử dụng mặt nạ 0x00FF0000. Điều đó có nghĩa là 1 << 16 đến 1 << 23. Bạn sử dụng 1 << 3 có hợp lệ không? Có thể nó có thể xung đột với các trạng thái kiểm soát trong tương lai mà táo có thể thêm vào không? –
Cũng cần lưu ý; Nếu bạn định sử dụng các trạng thái tùy chỉnh để kiểm soát các tài nguyên tùy chỉnh trong UIButton chẳng hạn như tiêu đề, hình nền, hình ảnh, titleShadow hoặc attributedTitle. Bạn phải gọi setNeedsLayout sau khi thay đổi trạng thái tùy chỉnh của bạn. Nếu không, nút sẽ chỉ cập nhật hình dạng của nó sau khi nó được khai thác một lần nữa. –
Chắc chắn không sử dụng 1 << 3, như Adam nói rằng sẽ xung đột trong các phiên bản tương lai của hệ điều hành. Sử dụng một số trong phạm vi mặt nạ bit 0x00FF0000. – christophercotton