UIButton触发边界事件时,事件并没有触发,而是到了远离button近70个像素时才收到回调。这是因为在UIButton周围会有70px的扩展范围。
与边界有关的事件:
UIControlEventTouchDragInside
UIControlEventTouchDragOutside
UIControlEventTouchDragEnter
UIControlEventTouchDragExit
UIControlEventTouchUpInside
UIControlEventTouchUpOutside
点击一个button的时候,“手指按下”会触发touchDown事件,“手指抬起”分两种,一种是内部抬起,对应TouchUpInside,另一种是外部抬起,对应TouchUpOutside。
当手指按下不松开,慢慢移动,对应事件为TouchDragxxx,其实有四种状态,分别是在内部拖拽TouchDragInside,在外部拖拽TouchDragOutside,拖拽移出(由内部而外)TouchDragExit,拖拽移进(由外向内部)TouchDragEnter。
“内部”和“外部”如何区分,其边界是什么?
开始已经说过了,在UIButton周围-从button的frame向四周扩展有一个70像素的响应范围,在button内部手指按下不抬起,接着慢慢拖动,会发现手指已经离开button的bounds了,但是button还是选中状态,直到超过(边界+70)的距离才会触发touchDragExit事件,也就是“手指离开button区域”了。
有些特殊时候,需要立即触发边界事件时.只需要在接收事件中 判断触摸的点有没有超出边界即可
[btn addTarget:self.action:@selector(btnDragged:withEvent:).forControlEvents:UIControlEventTouchDragOutside];
- (void)btnDragged:(UIButton*)sender withEvent:(UIEvent *)event
{
UITouch *touch = [[event allTouches] anyObject];
CGFloat boundsExtension = 25.0f;
CGRect outerBounds = CGRectInset(sender.bounds, -1 * boundsExtension, -1 * boundsExtension);
BOOL touchOutside = !CGRectContainsPoint(outerBounds, [touch locationInView:sender]);
if (touchOutside)
{//出边界了
}
}