我在主视图中定义了多个视图。我想为所有这些视图添加单击手势。下面是我编写的代码,但这会将轻击手势注册到我添加的最后一个视图。因此,在下面的代码中,点击仅针对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;
}
答案 0 :(得分: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;
}
答案 1 :(得分:12)
两个选项:
a)为每个UIGestureRecognizer
提供自己的行动。这种方法很多:强大的解耦。缺点:更多代码重用。但是,您可以通过创建常用功能的方法来缓解代码重用,并在不同的操作中调用方法。
b)为每个视图添加UIGestureRecognizer
唯一标记。然后,在常用操作中使用switch语句,并将发件人的视图标记作为案例。优点:减少代码重用。缺点:更紧密的耦合。像这样:
UIGestureRecognizer *singleTap = [[UIGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapAction:)];
[feedsView addGestureRecognizer:singleTap];
feedsView.tag = 33;
然后:
- (void)singleTapAction:(UIGestureRecognizer *)singleTap {
UIView *view = singleTap.view;
switch (view.tag) {
case 33
// view is feedsView
break;
default:
break;
}
}
虽然通常最好选择去耦,但如果你的所有动作非常相似,这似乎就是这种情况,你很确定它们会保持非常相似在将来,选项b)与标签可能是更好的选择。
P.S。明确设置numberOfTapsRequired
& numberOfTouchesRequired
到1
,因为它们默认设置为1
。您可以通过按住Command并单击Xcode中的numberOfTapsRequired
来确认这一点。
答案 2 :(得分:3)
1使用hitTest:
CGPoint location = [singleTap locationInView:self.view];
id testView = [self.view hitTest:location withEvent:nil];
2将单个TapGesture添加到多个视图,只有最后一个视图有效。
答案 3 :(得分:1)
//在swift 4中添加点按手势
let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
view.addGestureRecognizer(tap)
view.isUserInteractionEnabled = true
self.view.addSubview(view)
// function which is triggered when handleTap is called
@objc func handleTap(_ sender: UITapGestureRecognizer) {
if sender.view == view1 {
// do something
}
else{
// do next thing
}
}
//视图中的USE加载: tapGestures(查看:view1) tapGestures(查看:view2) tapGestures(查看:view3)
答案 4 :(得分:0)
使用计算出的属性将一个点击手势添加到多个视图(在本例中为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)
和labelTapped功能
@objc func labelTapped(_ sender: UITapGestureRecognizer) {
let tappedLabel:UILabel = (sender.view as! UILabel)
}
答案 5 :(得分:0)
要将多个视图附加到同一手势,您可以在影响视图之前重新初始化该手势
这是一个迅速的例子
override func viewDidLoad() {
super.viewDidLoad()
var tap = UITapGestureRecognizer(target: self, action: #selector(infoTapped(sender:)))
tap.numberOfTapsRequired = 1
info1Btn.addGestureRecognizer(tap)
info1Btn.tag = 1
tap = UITapGestureRecognizer(target: self, action: #selector(infoTapped(sender:)))
info2Btn.addGestureRecognizer(tap)
info2Btn.tag = 2
tap = UITapGestureRecognizer(target: self, action: #selector(infoTapped(sender:)))
info3Btn.addGestureRecognizer(tap)
info3Btn.tag = 3
}
@objc func infoTapped(sender: UITapGestureRecognizer){
let view:UIView = sender.view!
switch (view.tag) {
case 1:
print(view.tag) // info 1 tapped
case 2:
print(view.tag) // info2 tapped
case 3:
print(view.tag) // info 3 tapped
default:
break;
}
}
答案 6 :(得分:0)
for index in 0..3 {
let view = UIView()
view.tag = index
let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.viewTapped(_:)))
view.addGestureRecognizer(gestureRecognizer)
myViews.append(view)
}
@objc func viewTapped( _ sender: UITapGestureRecognizer) {
guard let tappedView = sender.view as? SelectableFeeIKEABtnView else { return }
for view in myViews {
if tappedView.tag == view.tag {
//Do something
}
}
}
在此示例中,有一个循环创建 4 个不同的视图,为它们分配相同的点击手势,并将它们附加到名为 myViews 的数组中。此外,为它们中的每一个设置不同的标签很重要,在这种情况下,我使用它们在数组中的位置(索引)作为标签。
一旦你有了标签的区别,你就可以在函数@objc func viewTapped(_ sender: UITapGestureRecognizer)中比较,如果点击的视图是你感兴趣的视图。