メインビューで複数のビューが定義されています。これらすべてのビューにシングルタップジェスチャを追加したいと思います。以下は私が書いたコードですが、これは私が追加した最後のビューにタップジェスチャを登録します。したがって、以下のコードでは、tapはmessagesView
にのみ登録され、他のビューには登録されていません。 2つの質問があります:
同じ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;
}
最後のビューに追加されただけの同じ問題がありました。より良い解決策があるかもしれませんが、ビューごとにタグジェスチャを作成し、それらを同じセレクターメソッドにリンクしました(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;
}
2つのオプション:
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
をクリックします。
1 hitTestを使用します:
CGPoint location = [singleTap locationInView:self.view];
id testView = [self.view hitTest:location withEvent:nil];
2シングルTapGestureをマルチビューに追加します。最後のビューのみが機能しました。
計算されたプロパティを使用して、複数のビュー(この場合は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)
}
//タップジェスチャを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)