Sri*_*aju 17 objective-c uiview uigesturerecognizer ios4 ios
我在主视图中定义了多个视图.我想为所有这些视图添加单击手势.下面是我编写的代码,但这会将轻击手势注册到我添加的最后一个视图.因此,在下面的代码中,仅messagesView
针对其他视图注册而不是其他视图.我有两个问题:
如何在多个视图中注册相同的tapGesture?
让我们假设我得到了这个工作,现在从这些视图中的所有单击都转到相同的函数调用oneTap
.在此功能中,我如何区分水龙头来自哪个视图?
码:
@synthesize feedsView, peopleView, messagesView, photosView;
- (void)viewDidLoad
{
[super viewDidLoad];
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(oneTap:)];
[singleTap setNumberOfTapsRequired:1];
[singleTap setNumberOfTouchesRequired:1];
[feedsView addGestureRecognizer:singleTap];
[peopleView addGestureRecognizer:singleTap];
[messagesView addGestureRecognizer:singleTap];
//[photosView addGestureRecognizer:singleTap];
[singleTap release];
return;
}
Run Code Online (Sandbox Code Playgroud)
jus*_*tin 25
我有同样的问题,它只添加到最后一个视图.可能有更好的解决方案,但我只为每个视图创建了一个标记手势,并将它们链接到相同的选择器方法(oneTap:
在您的情况下).为了区分激活方法的视图,您可以只标记视图,feedsView.tag = 0; peopleView.tag = 1;
依此类推.然后当调用该方法时:
- (void)oneTap:(UIGestureRecognizer *)gesture {
int myViewTag = gesture.view.tag; // now you know which view called
// use myViewTag to specify individual actions;
}
Run Code Online (Sandbox Code Playgroud)
ma1*_*w28 12
两种选择:
a)UIGestureRecognizer
自己动手.这种方法很多:强大的解耦.缺点:更多代码重用.但是,您可以通过创建常用功能的方法来缓解代码重用,并在不同的操作中调用方法.
b)为每个视图添加UIGestureRecognizer
一个唯一标记.然后,在公共操作中使用switch语句,并将发件人视图的标记作为案例.优点:减少代码重用.缺点:更紧密的耦合.像这样的东西:
UIGestureRecognizer *singleTap = [[UIGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapAction:)];
[feedsView addGestureRecognizer:singleTap];
feedsView.tag = 33;
Run Code Online (Sandbox Code Playgroud)
然后:
- (void)singleTapAction:(UIGestureRecognizer *)singleTap {
UIView *view = singleTap.view;
switch (view.tag) {
case 33
// view is feedsView
break;
default:
break;
}
}
Run Code Online (Sandbox Code Playgroud)
虽然通常最好选择去耦,但如果你的所有动作非常相似,这似乎就是这种情况,并且你很确定它们将来会保持非常相似,那么选项b)with标签可能是更好的选择.
PS没有必要明确设置numberOfTapsRequired
&numberOfTouchesRequired
,1
因为它们都1
默认设置为.您可以通过按住Command并numberOfTapsRequired
在Xcode中单击来确认.
小智 5
使用计算属性将一个点击手势添加到多个视图(在本例中为 UILabel)。它为每次调用创建新的识别器。
var recognizer: UITapGestureRecognizer {
get {
return UITapGestureRecognizer(target: self, action: #selector(self.labelTapped(_:)))
}
}
label1.addGestureRecognizer(recognizer)
label2.addGestureRecognizer(recognizer)
label3.addGestureRecognizer(recognizer)
label4.addGestureRecognizer(recognizer)
Run Code Online (Sandbox Code Playgroud)
和 labelTapped 函数
@objc func labelTapped(_ sender: UITapGestureRecognizer) {
let tappedLabel:UILabel = (sender.view as! UILabel)
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
27011 次 |
最近记录: |