UIButton拖动响应事件,距离问题

问题描述:

最近开发遇到个问题,就是UIButton响应了UIContolEventTouchDragEnter、UIControlEventTouchDragExit事件后,在拖出按钮的时候不会立即响应事件,而是真正超出70px的才会响应。

猜测苹果这样做的原因是估计到小按钮手指点击容易有抖动,会不小心有移出按钮的误操作。

效果是这样的:(盗个图)

03140303_5loH.gif

解决办法:

响应UIContolEventTouchDragInside、UIControlEventTouchDragOutSide方法(大家会问和enter、exit的区别)

UIControlEventTouchDragInside
当一次触摸在控件窗口内拖动时。
UIControlEventTouchDragOutside
当一次触摸在控件窗口之外拖动时。
UIControlEventTouchDragEnter
当一次触摸从控件窗口之外拖动到内部时。
UIControlEventTouchDragExit
当一次触摸从控件窗口内部拖动到外部时。

响应到一个函数里:

[btn addTarget:self action:@selector(sendButtonDrag:withEvent:) forControlEvents:UIControlEventTouchDragInside]; 
[btn addTarget:self action:@selector(sendButtonDrag:withEvent:) forControlEvents:UIControlEventTouchDragOutside];
- (IBAction)sendButtonDrag:(UIButton *)sender withEvent:(UIEvent *)event {
    if ([self isInButtonBounds:sender event:event]) {
        // 在里面
    } else {
        // 在外面
    }
}

- (BOOL)isInButtonBounds:(UIButton *)button event:(UIEvent *)event {
    UITouch *touch = [[event allTouches] anyObject];
    CGFloat boundsExtension = 5.0f; //扩展范围阀值
    CGRect outerBounds = CGRectInset(button.bounds, -1 * boundsExtension, -1 * boundsExtension);
    BOOL touchOutside = !CGRectContainsPoint(outerBounds, [touch locationInView:button]);
    if (touchOutside) {
        BOOL previewTouchInside = CGRectContainsPoint(outerBounds, [touch previousLocationInView:button]);
        if (previewTouchInside) {
            // UIControlEventTouchDragExit
        } else {
            // UIControlEventTouchDragOutside
        }
        return NO;
    } else {
        BOOL previewTouchOutside = !CGRectContainsPoint(outerBounds, [touch previousLocationInView:button]);
        if (previewTouchOutside) {
            // UIControlEventTouchDragEnter
        } else {
            // UIControlEventTouchDragInside
        }
        return YES;
    }
}

当然也要在 UIControlEventTouchUpInside的响应函数里做上面判断,不然的话会显示离开,但是抬手还是会响应点击函数的。

- (IBAction)sendAudioRecordButton:(id)sender withEvent:(UIEvent *)event {
    if ([self isInButtonBounds:sender event:event]) {
        // 点击按钮
    }
}


转载于:https://my.oschina.net/iq19900204/blog/525261

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值