我们想要定制按钮,可以在“开”和“关”之间切换,但是UISwitch又不符合我们的设计,这时候就得自定义这样的按钮,可以通过继承UIButton来实现。
XYToggleButton.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#import <UIKit/UIKit.h>
@interface XYToggleButton : UIButton
@property (nonatomic, getter = isOn)
BOOL
on;
@property (nonatomic, getter = isAutotoggleEnabled)
BOOL
autotoggleEnabled;
+ (id)buttonWithOnImage:(UIImage *)onImage
offImage:(UIImage *)offImage
highlightedImage:(UIImage *)highlightedImage;
- (
BOOL
)toggle;
@end
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
#import "XYToggleButton.h"
@interface XYToggleButton ()
@property (nonatomic, retain) UIImage *onImage;
@property (nonatomic, retain) UIImage *offImage;
@end
@implementation XYToggleButton
@synthesize onImage = _onImage;
@synthesize offImage = _offImage;
@synthesize on = _on;
@synthesize autotoggleEnabled = _autotoggleEnabled;
+ (id)buttonWithOnImage:(UIImage *)onImage offImage:(UIImage *)offImage highlightedImage:(UIImage *)highlightedImage{
XYToggleButton *button;
button = [XYToggleButton buttonWithType:UIButtonTypeCustom];
button.onImage = onImage;
button.offImage = offImage;
[button setBackgroundImage:highlightedImage forState:UIControlStateHighlighted];
[button setBackgroundImage:offImage forState:UIControlStateNormal];
button.autotoggleEnabled = YES;
return
button;
}
- (
void
)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event{
[super endTrackingWithTouch:touch withEvent:event];
if
(self.touchInside && self.autotoggleEnabled) {
[self toggle];
}
}
- (
BOOL
)toggle{
self.on = !self.on;
return
self.on;
}
- (
void
)setOn:(
BOOL
)on{
if
(_on != on) {
_on = on;
[self setBackgroundImage:(_on ? self.onImage : self.offImage) forState:UIControlStateNormal];
}
}
//添加对IB的支持
#pragma mark - initFromNib
- (
void
)awakeFromNib{
self.autotoggleEnabled = YES;
self.onImage = [self backgroundImageForState:UIControlStateSelected];
self.offImage = [self backgroundImageForState:UIControlStateNormal];
[self setBackgroundImage:nil forState:UIControlStateSelected];
}
@end
|