私はジェスチャレコグナイザーが初めてなので、この質問はばかげているようです。タップジェスチャレコグナイザーを一連のUIViewに割り当てています。メソッドでは、それらのどれが何らかの方法でタップされたかを見つけることは可能ですか、または画面上でタップされたポイントを使用してそれを見つける必要がありますか?
for (NSUInteger i=0; i<42; i++) {
float xMultiplier=(i)%6;
float yMultiplier= (i)/6;
float xPos=xMultiplier*imageWidth;
float yPos=1+UA_TOP_WHITE+UA_TOP_BAR_HEIGHT+yMultiplier*imageHeight;
UIView *greyRect=[[UIView alloc]initWithFrame:CGRectMake(xPos, yPos, imageWidth, imageHeight)];
[greyRect setBackgroundColor:UA_NAV_CTRL_COLOR];
greyRect.layer.borderColor=[UA_NAV_BAR_COLOR CGColor];
greyRect.layer.borderWidth=1.0f;
greyRect.userInteractionEnabled=YES;
[greyGridArray addObject:greyRect];
[self.view addSubview:greyRect];
NSLog(@"greyGrid: %i: %@", i, greyRect);
//make them touchable
UITapGestureRecognizer *letterTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(highlightLetter)];
letterTapRecognizer.numberOfTapsRequired = 1;
[greyRect addGestureRecognizer:letterTapRecognizer];
}
引数としてターゲットセレクター(highlightLetter:
)を定義します。
UITapGestureRecognizer *letterTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(highlightLetter:)];
その後、次の方法でビューを取得できます
- (void)highlightLetter:(UITapGestureRecognizer*)sender {
UIView *view = sender.view;
NSLog(@"%d", view.tag);//By tag, you can find out where you had tapped.
}
この質問をするのは1年でしたが、まだ誰かのためです。
特定のビューでUITapGestureRecognizer
を宣言しながら、タグを
UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(gestureHandlerMethod:)];
[yourGestureEnableView addGestureRecognizer:tapRecognizer];
yourGestureEnableView.tag=2;
そしてあなたのハンドラーでこのようにします
-(void)gestureHandlerMethod:(UITapGestureRecognizer*)sender {
if(sender.view.tag == 2) {
// do something here
}
}
以下はSwift 3の更新とManiの答えへの追加です。多少「高度な」アプローチのために、sender.view
をUIViews(または追跡しようとしているものに応じて他の要素)のタグ付けと組み合わせて使用することをお勧めします。
let yourTapEvent = UITapGestureRecognizer(target: self, action: #selector(yourController.yourFunction))
yourObject.addGestureRecognizer(yourTapEvent) // adding the gesture to your object
同じtestControllerで関数を定義します(View Controllerの名前です)。ここでは tags を使用します-タグはInt IDであり、yourButton.tag = 1
を使用してUIViewに追加できます。配列のような要素の動的リストがある場合、forループを作成して、配列を反復処理し、タグを追加します。
func yourFunction(_ sender: AnyObject) {
let yourTag = sender.view!.tag // this is the tag of your gesture's object
// do whatever you want from here :) e.g. if you have an array of buttons instead of just 1:
for button in buttonsArray {
if(button.tag == yourTag) {
// do something with your button
}
}
}
このすべての理由は、#selectorと組み合わせて使用する場合、yourFunctionにさらに引数を渡すことができないためです。
さらに複雑なUI構造があり、タップジェスチャに添付されたアイテムの親のタグを取得する場合は、let yourAdvancedTag = sender.view!.superview?.tag
を使用できます。 UIView内の押されたボタンのUIViewのタグを取得します。サムネイル+ボタンリストなどに役立ちます。
Swiftでこのコードを使用します
func tappGeastureAction(sender: AnyObject) {
if let tap = sender as? UITapGestureRecognizer {
let point = tap.locationInView(locatedView)
if filterView.pointInside(point, withEvent: nil) == true {
// write your stuff here
}
}
}
使用できます
- (void)highlightLetter:(UITapGestureRecognizer*)sender {
UIView *view = sender.view;
NSLog(@"%d", view.tag);
}
ビューはタップジェスチャが認識されたオブジェクトになります
UIGestureRecognizerの「shouldReceiveTouch」メソッドを使用することもできます
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch: (UITouch *)touch {
UIView *view = touch.view;
NSLog(@"%d", view.tag);
}
ジェスチャ認識エンジンのデリゲートを設定することを忘れないでください。
Swiftそれは非常に単純です
ViewDidLoad()関数でこのコードを記述します
let tap = UITapGestureRecognizer(target: self, action: #selector(tapHandler(gesture:)))
tap.numberOfTapsRequired = 2
tapView.addGestureRecognizer(tap)
ハンドラー部分は、viewDidLoadまたはviewDidLoadの外部にある場合があり、バッターは拡張機能に配置されます
@objc func tapHandler(gesture: UITapGestureRecognizer) {
currentGestureStates.text = "Double Tap"
}
ここでは、あなたがやりたいことを実行したり、もっと練習して読んだりすることができるアクションを行いたい場合は、出力を印刷してコードをテストしています
パラメーターを受け入れるようにジェスチャレコグナイザーの作成を修正する必要があります(コロン ':'を追加)
UITapGestureRecognizer *letterTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(highlightLetter:)];
そして、メソッドhighlightLetterで:認識に添付されたビューにアクセスできます:
-(IBAction) highlightLetter:(UITapGestureRecognizer*)recognizer
{
UIView *view = [recognizer view];
}
異なるUIGestureRecognizer
を異なるUIView
sに追加していて、アクションメソッドで区別したい場合は、senderパラメーターでプロパティビューを確認して、送信者ビューを確認できます。
func tabGesture_Call
{
let tapRec = UITapGestureRecognizer(target: self, action: "handleTap:")
tapRec.delegate = self
self.view.addGestureRecognizer(tapRec)
//where we want to gesture like: view, label etc
}
func handleTap(sender: UITapGestureRecognizer)
{
NSLog("Touch..");
//handling code
}