为什么UIButton的exclusiveTouch属性默认设置为YES?

时间:2011-06-28 14:08:56

标签: iphone xcode ipad uibutton

我确信有很多理由说明为什么有人希望同时有多个按钮接受触摸。但是,我们大多数人只需要一次按下一个按钮(用于导航,用于呈现模态,呈现弹出窗口,视图等)。

那么,为什么Apple会默认将exclusiveTouch的{​​{1}}属性设置为NO?

4 个答案:

答案 0 :(得分:8)

很老的问题,但值得澄清IMO。

尽管来自Apple 的方法文档非常具有误导性,但使用exclusiveTouch设置的视图“A”会阻止其他视图接收事件只要A正在自行处理某个事件(例如,设置一个带有exclusiveTouch的按钮并在其上放置一个手指,这将阻止窗口中的其他视图与之交互,但是一旦移除了来自exlusiveTouch项目的手指,与它们的交互将遵循通常的模式。)

另一个效果是阻止视图A接收事件,只要一些其他视图与之交互(保持按钮没有设置了exclusiveTouch设置,而具有exclusiveTouch的按钮也不能接收事件)。

您仍然可以在视图中将一个按钮设置为exclusiveTouch并与其他人进行交互,而不是同时进行,因为这个简单的测试UIViewController将证明(一旦为Outlets和Actions设置了正确的IB绑定) :

#import "FTSViewController.h"

@interface FTSViewController ()
- (IBAction)button1up:(id)sender;
- (IBAction)button2up:(id)sender;
- (IBAction)button1down:(id)sender;
- (IBAction)button2down:(id)sender;

@property (nonatomic, strong) IBOutlet UIButton *button1, *button2;
@end

@implementation FTSViewController

- (IBAction)button1up:(id)sender {
    NSLog(@"Button1 up");
}

- (IBAction)button2up:(id)sender {
    NSLog(@"Button2 up");
}

- (IBAction)button1down:(id)sender {
    NSLog(@"Button1 down");
}

- (IBAction)button2down:(id)sender {
    NSLog(@"Button2 down");
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Guarantees that button 1 will not receive events *unless* it's the only receiver, as well as
    // preventing other views in the hierarchy from receiving touches *as long as button1 is receiving events*
    // IT DOESN'T PREVENT button2 from being pressed as long as no event is being intercepted by button1!!!
    self.button1.exclusiveTouch = YES;
    // This is the default. Set for clarity only
    self.button2.exclusiveTouch = NO;
}
@end

鉴于此,恕我直言,对于Apple而言,不为每个UIView子类设置exclusiveTouch为YES的唯一理由是它会使复杂手势的实现成为真正的PITA,包括我们已经习惯的一些手势在复合UIView子类(如UIWebView)中,将所选视图设置为exclusiveTouch = NO(如按钮)比在几乎所有内容上执行递归exclusiveTouch = YES更快,只是为了启用多点触控。

这样做的缺点是,在许多情况下,UIButtons和UITableViewCells(以及其他......)的反直觉行为可能会引入奇怪的错误并使测试更加棘手(因为它发生在我身上......就像10分钟前一样? :()。

希望有所帮助

答案 1 :(得分:-1)

UIView属性exclusiveTouch表示视图(按钮)是该窗口中唯一可以与其进行交互的内容(如果设置为YES)。如文档中所述:将此属性设置为YES会导致接收方阻止将触摸事件传递到同一窗口中的其他视图。此属性的默认值为NO。

因此,您可能在窗口中拥有多个按钮或互动控件/视图,并希望exclusiveTouch设置为NO,这是常见的行为。

如果为窗口中的任何UIView子类将此属性设置为YES,则只要该属性设置为YES,就无法与窗口中的任何其他内容进行交互。这意味着如果您使用exclusiveTouch = YES初始化按钮,但也有一个表视图或其他按钮或滚动视图或任何其他基于交互的视图,它将不会响应任何触摸。

答案 2 :(得分:-1)

exclusiveTouch只是意味着UIButton下面的任何视图都不会收到触摸事件。

默认设置为no,因为您通常希望下面的视图接收这些事件。例如,如果您在滚动视图上有一个UIButton,并且用户想要滚动。您希望scrollView滚动,即使它们以UIButton开头。

答案 3 :(得分:-1)

我刚刚阅读iOS 5的发行说明,从这个版本开始,exclusiveTouch默认设置为YES。所以请记住,它会随着iOS的新版本而改变。