[英]iOS adding tapGesture to multiple Views
我在主視圖中定義了多個視圖。 我想為所有這些視圖添加單擊手勢。 下面是我編寫的代碼,但這會將輕擊手勢注冊到我添加的最后一個視圖。 因此,在下面的代碼中,tap 僅注冊為messagesView
而不是其他視圖。 我有兩個問題:
如何將相同的 tapGesture 注冊到多個視圖?
假設我可以正常工作,現在這些視圖中的所有單擊都轉到名為oneTap
。 在這個 function 中,我如何區分水龍頭來自哪個視圖?
代碼:
@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;
}
我有同樣的問題,它只添加到最后一個視圖。 可能有更好的解決方案,但我只是為每個視圖創建了一個標記手勢並將它們鏈接到相同的選擇器方法( oneTap:
在你的情況下)。 為了區分哪個視圖激活了方法,你可以只標記你的視圖, feedsView.tag = 0; peopleView.tag = 1;
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;
}
兩種選擇:
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; } }
雖然通常最好 go 使用解耦選項,但如果您的所有操作都非常相似,這似乎是這里的情況,並且您非常確定它們將來會保持非常相似,那么選項 b) 與標簽可能是更好的選擇。
PS 沒有必要將numberOfTapsRequired
和numberOfTouchesRequired
顯式設置為1
,因為默認情況下它們都設置為1
。 您可以通過按住 Command 並單擊 Xcode 中的numberOfTapsRequired
來確認這一點。
使用計算屬性將一鍵手勢添加到多個視圖(在本例中為 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 function
@objc func labelTapped(_ sender: UITapGestureRecognizer) {
let tappedLabel:UILabel = (sender.view as! UILabel)
}
1 使用hitTest:
CGPoint location = [singleTap locationInView:self.view];
id testView = [self.view hitTest:location withEvent:nil];
2 將 Single TapGesture 添加到多視圖,只有最后一個視圖有效。
// 在 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
}
}
//在視圖中使用確實加載了:tapGestures(view: view1) tapGestures(view: view2) tapGestures(view: view3)
要將多個視圖附加到同一手勢,您可以在影響視圖之前重新初始化手勢
這是 swift 中的一個示例
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;
}
}
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的數組中。 此外,為每個人設置不同的標簽很重要,在這種情況下,我在數組(索引)中使用他們的 position 作為標簽。
一旦您與標簽進行了區分,您可以在 function @objc func viewTapped(_ sender: UITapGestureRecognizer)中進行比較,如果點擊的視圖是您感興趣的視圖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.