xcode 为什么UIButton的exclusiveTouch属性在默认情况下不设置为YES?

1u4esq0p  于 2022-12-14  发布在  其他
关注(0)|答案(4)|浏览(106)

我相信有很多原因可以解释为什么有人希望有多个按钮同时接受触摸。然而,我们大多数人一次只需要按下一个按钮(用于导航,用于模态呈现,用于呈现弹出窗口,视图等)。
那么,为什么Apple会将UIButtonexclusiveTouch属性默认设置为NO呢?

8ljdwjyq

8ljdwjyq1#

很老的问题,但值得澄清海事组织。

尽管Apple提供的方法文档非常容易误导但设置了exclusiveTouch的视图“A”将阻止其他视图接收事件只要A正在处理某个事件本身(例如,将按钮设置为exclusiveTouch并将手指放在上面,这将阻止与窗口中的其他视图进行交互,但是一旦手指从独占触摸项移开,与它们的交互将遵循通常的模式)。

另一个效果是,只要与其他视图交互,视图A就无法接收事件(按住未设置exclusiveTouch的按钮,则设置了exclusiveTouch的按钮也无法接收事件)。
您仍然可以将视图中的按钮设置为exclusiveTouch并与其他按钮交互,只是不能同时进行,正如这个简单的测试UIViewController将证明的那样(一旦IB中为Outlets和Actions设置了正确的绑定):

#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分钟前发生在我身上的那样?:())。
希望能有所帮助

fumotvh3

fumotvh32#

UIView属性exclusiveTouch意味着视图(按钮)是该窗口中唯一可以交互的东西,如果它被设置为YES。如文档中所述:将此属性设置为YES会导致接收器阻止将触摸事件发送到同一窗口中的其他视图。此属性的默认值为NO。
因此,常见的行为是,您可能在一个窗口中有多个按钮或交互控件/视图,并希望将exclusiveTouch设置为NO
如果将窗口中任何UIView子类的该属性设置为YES,则只要该属性设置为YES,就不能与窗口中的任何其他内容进行交互。这意味着,如果使用exclusiveTouch = YES初始化按钮,但同时具有表格视图、其他按钮、滚动视图或任何其他基于交互的视图,则它将不会响应任何触摸。

um6iljoc

um6iljoc3#

exclusiveTouch只是意味着UIButton下面的任何视图都不会接收到触摸事件。
默认设置为no,因为您通常希望下面的视图接收这些事件。例如,如果您在滚动视图的顶部有一个UIButton,并且用户希望滚动。您希望scrollView滚动,即使他们的手指开始放在UIButton上。

ncgqoxb0

ncgqoxb04#

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

相关问题