Iphone 为什么不是';t按钮';s exclusiveTouch属性默认设置为“是”?
我相信有很多原因可以解释为什么有人希望同时有多个按钮接受触摸。然而,我们大多数人一次只需要按下一个按钮(用于导航,用于以模式显示的内容,用于显示弹出框、视图等)Iphone 为什么不是';t按钮';s exclusiveTouch属性默认设置为“是”?,iphone,xcode,ipad,uibutton,Iphone,Xcode,Ipad,Uibutton,我相信有很多原因可以解释为什么有人希望同时有多个按钮接受触摸。然而,我们大多数人一次只需要按下一个按钮(用于导航,用于以模式显示的内容,用于显示弹出框、视图等) 那么,为什么苹果会在默认情况下将UIButton的exclusiveTouch属性设置为NO?UIView属性exclusiveTouch意味着如果将视图(按钮)设置为YES,那么它是该窗口中唯一可以交互的对象。如文档中所述:将此属性设置为“是”会导致接收器阻止将触摸事件传递到同一窗口中的其他视图。此属性的默认值为“否” 因此,一个窗口
那么,为什么苹果会在默认情况下将
UIButton
的exclusiveTouch
属性设置为NO?UIView属性exclusiveTouch
意味着如果将视图(按钮)设置为YES
,那么它是该窗口中唯一可以交互的对象。如文档中所述:将此属性设置为“是”会导致接收器阻止将触摸事件传递到同一窗口中的其他视图。此属性的默认值为“否”
因此,一个窗口中可能有多个按钮或交互控件/视图,并且希望exclusiveTouch
设置为NO
,这是常见的行为
如果为窗口中的任何UIView子类将此属性设置为
YES
,则只要该属性设置为YES
,就不能与窗口中的任何其他对象交互。这意味着,如果您使用exclusiveTouch=YES
初始化一个按钮,但同时还有一个表视图、另一个按钮、滚动视图或任何其他基于交互的视图,它将不会响应任何触摸。exclusiveTouch仅意味着UIButton下面的任何视图都不会接收触摸事件
默认情况下,它设置为“否”,因为您通常希望下面的视图接收这些事件。例如,如果您在滚动视图顶部有一个UIButton,并且用户想要滚动。您希望滚动视图滚动,即使他们用手指按UIButton开始。我刚刚阅读了iOS 5的发行说明,在此版本中,默认情况下,exclusiveTouch将设置为YES。所以请记住,它将随着新版iOS的推出而改变。这是一个非常古老的问题,但值得澄清 尽管苹果公司的方法文档存在误导性但是,只要a本身正在处理某个事件,一个具有排他设置的视图“a”将阻止其他视图接收事件(例如,将一个按钮设置为exclusiveTouch并将手指放在其上,这将防止与窗口中的其他视图交互,但一旦从exlusiveTouch项目中移除手指,则与它们的交互将遵循通常的模式) 另一个效果是,只要与其他视图交互,视图A就无法接收事件(保持按钮未按下exclusiveTouch设置,并且具有exclusiveTouch的视图也将无法接收事件) 您仍然可以将视图中的一个按钮设置为exclusiveTouch,并与其他按钮进行交互,只是不能同时进行,正如这个简单的测试UIViewController将证明的那样(一旦IB中为出口和操作设置了正确的绑定): 有鉴于此,苹果公司不为每个UIView子类将exclusiveTouch设置为YES的唯一好理由是,它将使复杂手势的实现成为一个真正的PITA,包括我们在复合UIView子类(如UIWebView)中已经习惯的一些手势,因为将所选视图设置为exclusiveTouch=NO(类似于按钮)比在几乎所有情况下执行递归exclusiveTouch=YES(仅启用多点触摸)要快 这样做的缺点是,在许多情况下,UIButtons和UITableViewCells(以及其他…)的反直觉行为可能会引入奇怪的bug,并使测试变得更加棘手(就像10分钟前发生在我身上的那样?:())
希望能有所帮助假设我有两个按钮作为同一视图的子视图。如果我没有在两个按钮上都将
exclusiveTouch
设置为“否”,然后如果用户同时按下这两个按钮,这两个按钮都将调用其操作方法。如果它们的操作方法因某种原因发生冲突(假设两者都将不同的视图控制器推送到导航堆栈)Jesse:你的解释与文档一致,所以这不是你的错,但由于原始文档误导了IMO,你仍然提供错误信息:exlusiveTouch不会阻止视图中其他按钮的触摸事件(正如你的解释和文档似乎暗示的那样),它只是防止其他视图接收事件,而带有exclusiveTouch的视图正在处理一些事件(以及防止exlusiveTouch视图接收事件,如果其他视图也在处理一些事件…)也不正确-文档具有误导性。更正:“如果接收器当前正在接收触摸事件本身,则会导致接收器阻止触摸事件的传递”。要进行测试运行并证明此答案是错误的,请使用两个按钮、两个记录两条不同消息的iBaction设置一个xib,在viewDidLoad中设置ExclusiveTouch:YES。使用“alt+单击”“在模拟器上进行多点触摸并点击两个按钮(使用shift键重新居中多点触摸控制)。您可以在每个按钮上单独进行交互,但不能与多点触摸进行交互(但如果您设置ExclusiveTouch:NO,则可以)我不认为这是准确的,@Jesse说得对。将此属性设置为“是”会导致接收器阻止将触摸事件传递到同一窗口中的其他视图。这种方式不起作用(尽管文档中有说明):仅标志的作用是保证其他视图不会与标志所有者同时接收触摸事件(或多或少)。我确实测试过:查看我的答案了解详细信息。只是反映我上面的评论-这不是此属性影响视图的方式。如果用户积极参与,它将阻止其他视图的交互。如果未触及排他视图,则其他视图(和视图)将被删除
#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