防止同时触摸多个按钮

41

在iOS中,有没有办法防止同时点击一个包含多个按钮(兄弟视图)的UIView?例如,两个不重叠的并排按钮可以同时被两个触摸点点击。

可以设置UIView的exclusiveTouch属性为YES,这将会使得该视图内部的所有子视图(包括按钮)变得互斥,即同一时间只能响应一个子视图的点击事件。你可以在初始化或者创建视图后使用下面代码来实现:
```objc myView.exclusiveTouch = YES; ```
7个回答

102

设置UIView.exclusiveTouch。


太棒了!我为什么没想到那个按钮呢?! - happycodelucky
5
太好了!那就像是一笔隐藏的财富,从来不知道这个房产,非常感谢。 - RVN
10
请注意要将其设置在每个“UIButton”上!而不是它们所在的UIView :) (在该UIView的所有子视图上设置即可)像这样 -> [self.controlView.subviews makeObjectsPerformSelector:@selector(setExclusiveTouch:) withObject:[NSNumber numberWithBool:YES]]; - Hlung
@Hlung:那不一定会起作用;-setExclusiveTouch:需要一个BOOL,而不是NSNumber(如果数字恰好被解释为YES,则可能会起作用,但这并不保证)。我称其为UIView.exclusiveTouch,因为该属性所定义的类是UIView(UIButton是UIView的子类)。 - tc.
@tc。是的,这是有保障的。据我所知,在使用 makeObjectsPerformSelector:withObject: 发送 BOOL 时,发送任何具有非零地址的对象都将被解释为 YES(是的,[NSNumber numberWithBool:NO] 将表示 YES)。因此,发送 nil 将为 NO。在我的示例中,我只想清楚地表明它是一个 YES。至少这是我的风格,因为我不知道更合适的做法 :) - Hlung
2
@Hlung:文档中绝对没有保证,文档中说:“该方法必须接受一个类型为id的单一参数”。在x86上,如果地址可被256整除,则等同于NO(因为BOOL是有符号字符,所以它只查看底部8位)。我还听说过UIKit将2解释为NO(即代码仅查看底部位;这并不奇怪)。 - tc.

12

您也可以使用以下方法。如果您有两个或更多按钮,以防止同时多次按下。

例如:

[Button1 setExclusiveTouch:YES];

[Button2 setExclusiveTouch:YES];

将这个方法设置在你的viewDidLoad或者viewWillAppear中。


4

Swift 4 语法:

    buttonA.isExclusiveTouch = true
    buttonB.isExclusiveTouch = true

那个答案并没有为已有的答案提供任何补充。 - Striezel

2
for(UIView* v in self.view.subviews)
    {
    if([v isKindOfClass:[UIButton class]])
    {
        UIButton* btn = (UIButton*)v;
        [yourButton setExclusiveTouch:YES];
    }
}

0
你需要在该视图中找到所有的按钮,并将“exclusiveTouch”属性设置为true,以防止同时多点触控。
func exclusiveTouchForButtons(view: UIView) {
    for cmp in view.subviews {
        if let cmpButton = cmp as? UIButton {
            cmpButton.exclusiveTouch = true
        } else {
            exclusiveTouchForButtons(cmp)
        }
    }
}

0

为了启用独占触摸,您需要为每个元素设置属性isExclusiveTouch

myView.isExclusiveTouch = true

如果您想要更改默认行为,可以使用UIView类的UIAppearance。

UIView.appearance().isExclusiveTouch = true

0
I have tried both  multiTouchEnabled and exclusiveTouch but unfortunately 
none of them workout for me.I have tried the following code worked 
perfectly.

将此代码放置在.h文件中

BOOL ClickedBool;

在方法开始处设置以下代码。

if(ClickedBool==TRUE)
{
     return;
}
else
{
    ClickedBool=TRUE;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接