最近因?yàn)轫?xiàng)目需求,需要仿照微信語音聊天界面渔嚷,就研究了一下UIButton的事件響應(yīng)进鸠。“按住說話”形病,“松開結(jié)束”客年,“向上移動(dòng),取消發(fā)送”這種邏輯漠吻,一看使用UIButton的響應(yīng)事件做應(yīng)該最簡(jiǎn)單量瓜。可是嘗試過使用UIButton的響應(yīng)事件UIControlEventTouchUpInside等響應(yīng)事件區(qū)域的朋友可能就不會(huì)這樣認(rèn)為了途乃。下面是我對(duì)UIButton響應(yīng)事件區(qū)域的詳細(xì)研究绍傲。
UIButton響應(yīng)事件:
UIControlEventTouchUpInside
UIControlEventTouchUpOutside
UIControlEventTouchDragInside
UIControlEventTouchDragOutside
UIControlEventTouchDragEnter
UIControlEventTouchDragExit
先說結(jié)論:事件UpInside和UpOutside的切換的臨界值為70;事件DragInside和DragOutside的切換的臨界值為70耍共;事件DragEnter和DragExit的切換的臨界值為70唧取。可能蘋果覺得人的手指比較小划提,所以事件的邊界值設(shè)置多出了70個(gè)像素。所以如果要想自定義這個(gè)臨界值邢享,可以參考下面的代碼(主要邏輯:計(jì)算手指的位置和超出button的距離)鹏往。
貼上代碼:
CGFloat const kBoundsExtension = 10.f;
// create button
UIButton *button = [UIButton new];
[self.view addSubview:button];
button.frame = CGRectMake(0, 0, 100, 40);
button.center = self.view.center;
[button setTitle:@"按鈕" forState:UIControlStateNormal];
button.backgroundColor = [UIColor lightGrayColor];
// add actions
[button addTarget:self action:@selector(buttonTouchUp:withEvent:) forControlEvents:UIControlEventTouchUpInside];
[button addTarget:self action:@selector(buttonTouchUp:withEvent:) forControlEvents:UIControlEventTouchUpOutside];
[button addTarget:self action:@selector(buttonDrag:withEvent:) forControlEvents:UIControlEventTouchDragInside];
[button addTarget:self action:@selector(buttonDrag:withEvent:) forControlEvents:UIControlEventTouchDragOutside];
// upinside / upoutside
- (void)buttonTouchUp:(UIButton *)sender withEvent:(UIEvent *)event {
UITouch *touch = [[event allTouches] anyObject];
CGRect outerBounds = CGRectInset(sender.bounds, -1 * kBoundsExtension, -1 * kBoundsExtension);
BOOL touchOutside = !CGRectContainsPoint(outerBounds, [touch locationInView:sender]);
if (touchOutside) {
// UIControlEventTouchUpOutside
NSLog(@"----UpOutside");
} else {
// UIControlEventTouchUpInside
NSLog(@"----UpInside");
}
}
// dragin / dragout / dragEnter / dragExit
- (void)buttonDrag:(UIButton *)sender withEvent:(UIEvent *)event {
UITouch *touch = [[event allTouches] anyObject];
CGRect outerBounds = CGRectInset(sender.bounds, -1 * kBoundsExtension, -1 * kBoundsExtension);
BOOL touchOutside = !CGRectContainsPoint(outerBounds, [touch locationInView:sender]);
if (touchOutside) {
BOOL previewTouchInside = CGRectContainsPoint(outerBounds, [touch previousLocationInView:sender]);
if (previewTouchInside) {
NSLog(@"----DragExit");
// UIControlEventTouchDragExit
} else {
// UIControlEventTouchDragOutside
NSLog(@"----DragOutside");
}
} else {
BOOL previewTouchOutside = !CGRectContainsPoint(outerBounds, [touch previousLocationInView:sender]);
if (previewTouchOutside) {
// UIControlEventTouchDragEnter
NSLog(@"----DragEnter");
} else {
// UIControlEventTouchDragInside
NSLog(@"----DragInside");
}
}
}