#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
4条答案
按热度按时间8ljdwjyq1#
很老的问题,但值得澄清海事组织。
尽管Apple提供的方法文档非常容易误导但设置了exclusiveTouch的视图“A”将阻止其他视图接收事件只要A正在处理某个事件本身(例如,将按钮设置为exclusiveTouch并将手指放在上面,这将阻止与窗口中的其他视图进行交互,但是一旦手指从独占触摸项移开,与它们的交互将遵循通常的模式)。
另一个效果是,只要与其他视图交互,视图A就无法接收事件(按住未设置exclusiveTouch的按钮,则设置了exclusiveTouch的按钮也无法接收事件)。
您仍然可以将视图中的按钮设置为exclusiveTouch并与其他按钮交互,只是不能同时进行,正如这个简单的测试UIViewController将证明的那样(一旦IB中为Outlets和Actions设置了正确的绑定):
有鉴于此,恕我直言,Apple不将每个UIView子类的exclusiveTouch设置为YES的唯一合理理由是,这会使复杂手势的实现成为真实的的PITA,其中可能包括我们在复合UIView子类中已经习惯的一些手势(类似于UIWebView)、将所选视图设置为exclusiveTouch=NO(如按钮)比在几乎所有内容上执行递归exclusiveTouch=YES来启用多点触摸要快。
这样做的缺点是,在许多情况下,UIButtons和UITableViewCells(以及其他...)的反直观行为可能会引入奇怪的错误,使测试更加棘手(就像10分钟前发生在我身上的那样?:())。
希望能有所帮助
fumotvh32#
UIView
属性exclusiveTouch
意味着视图(按钮)是该窗口中唯一可以交互的东西,如果它被设置为YES
。如文档中所述:将此属性设置为YES会导致接收器阻止将触摸事件发送到同一窗口中的其他视图。此属性的默认值为NO。因此,常见的行为是,您可能在一个窗口中有多个按钮或交互控件/视图,并希望将
exclusiveTouch
设置为NO
。如果将窗口中任何UIView子类的该属性设置为
YES
,则只要该属性设置为YES
,就不能与窗口中的任何其他内容进行交互。这意味着,如果使用exclusiveTouch = YES
初始化按钮,但同时具有表格视图、其他按钮、滚动视图或任何其他基于交互的视图,则它将不会响应任何触摸。um6iljoc3#
exclusiveTouch只是意味着UIButton下面的任何视图都不会接收到触摸事件。
默认设置为no,因为您通常希望下面的视图接收这些事件。例如,如果您在滚动视图的顶部有一个UIButton,并且用户希望滚动。您希望scrollView滚动,即使他们的手指开始放在UIButton上。
ncgqoxb04#
我刚刚在阅读iOS 5的发布说明,从这个版本开始,exclusiveTouch默认设置为YES。所以请记住,它将随着iOS的新版本而改变。