我敢肯定,为什么有人想要多个按钮同时接受触摸是有很多原因的。但是,我们大多数人一次只需要按下一个按钮(用于导航,以模态呈现某些内容,呈现弹出窗口,视图等)。

那么,为什么苹果默认将exclusiveTouchUIButton属性设置为NO?

最佳答案

很老的问题,但国际海事组织应予以澄清。

尽管Apple提供了非常误导的方法文档,但只要A本身正在处理某些事件(例如,设置带有ExclusiveTouch的按钮并放在其上,则带有ExclusiveTouch设置的视图“ A”将阻止其他视图接收事件)不会与窗口中的视图进行交互,但是一旦移开exlusiveTouch-item的手指,与它们的交互将遵循通常的模式)。

只要其他视图与之交互,另一个效果就是阻止视图A接收事件(保留一个未按下ExclusiveTouch设置的按钮,具有ExclusiveTouch的按钮也将无法接收事件)。

您仍然可以在视图中将按钮设置为ExclusiveTouch并与其他按钮进行交互,而不能同时进行,因为此简单的测试UIViewController会证明(一旦为Outlet和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


鉴于此,恕我直言,苹果恕我直言,不要为每个UIView子类都将ExclusiveTouch设置为YES的唯一好理由是,它将使复杂手势的实现成为真正的PITA,其中可能包括我们已经习惯于复合的某些手势UIView子类(如UIWebView),因为将选中的视图设置为ExclusiveTouch = NO(如按钮)比对几乎所有启用多点触控的方法进行递归ExclusiveTouch = YES更快。

这样做的缺点是,在许多情况下,UIButton和UITableViewCells的反直观行为(尤其是...)可能会引入怪异的错误并使测试变得更加棘手(就像10分钟前发生在我身上的事情一样::() 。

希望能帮助到你

07-26 02:52