我敢肯定,为什么有人想要多个按钮同时接受触摸是有很多原因的。但是,我们大多数人一次只需要按下一个按钮(用于导航,以模态呈现某些内容,呈现弹出窗口,视图等)。
那么,为什么苹果默认将exclusiveTouch
的UIButton
属性设置为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分钟前发生在我身上的事情一样::() 。
希望能帮助到你