2011-05-15 7 views
4

私は別のUIViewのタップ可能な(彼らはUicontrolの継承していない)次のコードを使用して作ってるんだ:UIViewのタップ時のスタイルを変更するにはどうすればいいですか?

UITapGestureRecognizer* gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(userTappedOnLink:)]; 
[labelView setUserInteractionEnabled:YES]; 
[labelView addGestureRecognizer:gesture]; 

を私はまた、彼らは強調しているときにスタイルを変更したいと思います。それ、どうやったら出来るの?

+0

https://github.com/mta452/UIView-TouchHighlighting –

答えて

1

UIViewでサブビューとしてUIControlを追加することで、これを解決することができました。 UIControlは同じサイズで、透明な背景が強調表示されたときに変更されます。魅力的な作品!私はそれがどのように機能するかを理解していない

+2

詳細を教えていただけますか?あなたはUIControlをサブクラス化しなければなりませんでしたか?あなたは完全なコードを投稿することができますか?ありがとう。 – Enchilada

0

まあ、私はそれを試していない、ちょっとした提案、このビューのためにtouchesを処理し、[labelView addGestureRecognizer:gesture];関数を呼び出してください。 多分あなたは別の関数を使うべきです。- (void)removeGestureRecognizer:(UIGestureRecognizer*)gestureRecognizer .

+0

... – mirceapasoi

1

iOSでイベントを処理するには2通りの方法があります。最初の1つはUIViewサブクラスを使用して、UIViewによって継承されたメソッドをUIResponder class(つまりtouchesBegan:withEvent、touchesMoved:withEvent、touchesEnded:withEvent、touchesCancelled:withEvent)からオーバーライドすることです。

第2の方法は、ジェスチャ認識器クラスの新しいインスタンスを作成し、それをUIViewオブジェクトに追加してから(同じように)ハンドラを作成することです。

- (IBAction)userTappedOnLink:(UIGestureRecognizer *)sender { 
    // Changing view properties. 
} 

どちらの場合でも、UIViewのプロパティを変更できます。アップルの便利な情報は"Event handling guide"です。読んだことがたくさんありますが、 "関連するサンプルコード"(TouchesSimpleGestureRecognizers)だけを見ることができます。

アプリケーションのインターフェイス要素のスタイルプロパティを変更する方法は、これらのプロパティの内容によって異なります。場合によってはアニメーション化されることもありますが、そうでない場合もあります。通常、ビューのプロパティを変更するコードは、touchesBegin関数またはジェスチャ認識器ハンドラの内部に配置されます。 MoveMeサンプルコードでは、ビューのプロパティを変更してアニメーション化する方法を示します。 「イベントハンドリングガイド」のジェスチャ認識装置chapterでは、フレームのプロパティが変更されています。

+0

それが選択されているとき、私はビューにスタイルを変更しようとしている/ハイライトされ、すなわちあなたがそれをタップするが、まだ手放さなかった。私はそれを検出する簡単な方法を見つけることができませんでした。 – mirceapasoi

+0

この場合、touchesBeginを実装しようとしますが(サブクラス化が必要です)。ところで、サブクラス化を使用しないのはなぜですか?通常のUIViewと同じように、ジェスチャ認識機能をサブクラス化されたビューに追加することはできます。クラス名だけが変更され、いくつかのファイルがプロジェクトに追加されます。わからないが、サブクラス化の代わりに、ジェスチャ認識子のデリゲートとしていくつかのオブジェクト(View Controllerなど)を設定してtouchesBeginを実装しようとすることもできますが、正しく動作するかどうかはわかりません。 –

+0

私はサブクラスを使用することができますが、私はいくつかのビューでこれをやりたいので、より汎用的なソリューションを探していました。 – mirceapasoi

3

UITapGestureRecognizerの代わりにUILongPressGestureRecognizerを親ビューに付けて、好みのプロパティを設定します。選択を追跡して対応する方法は、適切な方法でuserTappedOnLinkメソッドを実装することです。この方法は、ジェスチャ認識装置が起動され、認識装置の状態を追跡することによって何が起きているかを知っているときに、短時間で多くの時間呼び出されます。

UIViewサブクラスを作成し、select、deselectなどのメソッドを作成し、それぞれのビュープロパティをカスタマイズします。それから、UIViewサブクラスを選択または選択解除するだけで、それは親ビューのポイントを返すUIGestureRecognizerメソッドで簡単に実行でき、タッチポイントが特定のサブビューフレームの内側にあるかどうかを確認しながらサブビューを繰り返すことができます。

- (IBAction)userTappedOnLink:(UIGestureRecognizer*)sender 
{ 

    switch (sender.state) 
    { 
     case UIGestureRecognizerStateBegan: 
{ 

     CGPoint touchPoint = [sender locationInView:self.parentView]; 
     for (UIView *subView in [self.parentView subViews) 
     { 
      if (CGRectContainsPoint(subView.frame, tapPoint)) 
      { 
       self.activeSubView = self.subview; 
          break; 
      } 
     } 
       [self.activeSubView select]; 

     case UIGestureRecognizerStateChanged:[self.activeSubView doNothing];; break; 
     case UIGestureRecognizerStateEnded:[self.activeSubView deSelect]; self.activeSubView = nil; break; 
    } 
} 
+0

私はそれを試みましたが、動作させることができませんでした...タップがターゲットの外にあってもUIGestureRecognizerStateEndedを取得するので、リンクを開くべきかどうかわかりません。 – mirceapasoi

+0

更新されたコードを確認してください。 – TheBlack

+0

コードをありがとう、私は最後に何か非常に似ていました! – mirceapasoi

関連する問題