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

问题描述:

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

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

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

解决办法:

响应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]) {
        // 点击按钮
    }
}
时间: 2024-11-08 22:36:52

UIButton拖动响应事件,距离问题的相关文章

iOS开发随笔 31:UIButton无法响应点击事件

问题描述 因为项目需要,需要UITableView上添加固定的筛选表头,一直固定,不能随UITableView滚动.所以直接将表头与UITableView分离,将它添加到控制器的UIView上,即添加到UITableView的父视图上,与UITableView同级.然后表头上添加三个UIButton,效果达到预期,但问题随即出现.筛选表头上的UIButton无法响应点击事件,刚开始以为造成的原因是手误把UIButton的父视图或者UIButton属性userInteractionEnabled被

UIButton 未响应原因分析

1.父视图响应者链被阻断;例如:在 UILabel,UIImageView 控件添加UIButton,因为UILabel(userInteractionEnabled属性值为NO) 阻断了响应者链,所以 UIButton 无法响应点击事件.可以通过修改UILable属性userInteractionEnabled 的值为 YES,实现其子视图 UIButton 响应事件. 2.button范围超出父视图范围;

关于UITableView选中效果以及自定义cell上的控件响应事件

tableView默认的点击效果是:点击cell:A,出现点击效果,点另一个cell:B的时候,A的点击效果才会消失. 1.对于tableView,比较常用的效果,是点击表格行,出现效果,点击完毕,效果消失 那么就要在代码里做一些设置.代码如下: -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath

UIView独占响应事件

exclusiveTouch A Boolean value that indicates whether the receiver handles touch events exclusively.Setting this property to YES causes the receiver to block the delivery of touch events to other views in the same window. The default value of this pr

利用Associative机制为UIAlertView添加一个Block属性,将AlertView与button的响应事件关联

1.详解:associative objective-c有两个扩展机制:category和associative.我们可以通过category对已经存在的类添加和扩展方法,但是它有一个很大的局限性,那就是不能扩展属性.于是,就有了专门用来扩展属性的机制:associative.关联对象是Runtime中一个非常实用的特性. associative的主要原理,就是在运行时把两个对象相互关联起来,使得其中的一个对象(A)作为另外一个对象(B)的一部分.即A对象通过给定的key连接到B对象上,作为B对

Cocos Creator 按钮响应事件

Cocos Creator版本:v1.7.0-rc.2 一.方法一 1.在LoginSceneCavans的脚本文件LoginScene.js中增加btnClick函数 btnClick(event, customEventData){ console.log("event=",event.type," data=",customEventData); }, 2.按步骤在(按钮wx_btn的属性检查器)上进行操作 ①在Click Events中填上1,然后编辑器自动

输入坐标和输出坐标——图片框上动态加载按钮及响应事件

在实际的项目中总会遇到一些需要动态加载一些控件,并且加载控件的响应事件的代码.现在写一个简单的例子,主要说一下里面的一些关键点:使用鼠标在窗体上的图片框中动态的添加按钮 .动态的去加载事件,肯定是需要使用对象类动态的生成,动态事件,必须要使用委托去实现.还有一个就是"动态"的实现过程,打算鼠标点下去,在鼠标单击的位置添加上按钮. 环境:Visual Studio 2010, .Net FrameWork 3.5 private void pictureBox1_MouseDown(ob

ExtJS学习笔记2:响应事件、使用AJAX加载数据

响应事件: 1.设置一个html标记 <div id="my-div">Ext JS 4 Cookbook</div> 2.使用get函数获取此标记对象 var el = Ext.get('my-div'); 3.将响应函数和对象的事件绑定 el.on('click', function(e, target, options){ alert('The Element was clicked!'); alert(this.id); }, this); 4.一次也可

iOS:利用代码UIBarButtonItem如何响应事件?

在storyboard中,可以通过拖拽的方法响应事件. 如果是纯代码构建的UI,UIBarButtonItem 无法调用 addTarget: action: forControlEvents: 这个方法. 如下图所示,用代码创建的left按钮: 我想让导航栏中的『left』响应事件. 网上搜了一大堆方法,都好繁琐. 刚才奇思妙想试了一下,没想到居然可以╰( ̄▽ ̄)╮ 只写了两行代码: 1 left.target = self; 2 left.action = @selector(myMetho