私は次のコードを持っていました:
UITapGestureRecognizer *showStoryTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(showNewsStory:)];
[showStoryTapRecognizer setDelegate:self];
[self.storyImageView_ addGestureRecognizer:showStoryTapRecognizer];
[showStoryTapRecognizer release];
ただし、これはshowNewsStoryをトリガーしません。なぜですか?画像ビューでuserInteractionを有効にしました。
UITapGestureRecognizer *oneTouch=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(OneTouchHandeler)];
[oneTouch setNumberOfTouchesRequired:1];
[imageView addGestureRecognizer:oneTouch];
imageView.userInteractionEnabled = YES;
UIImageView
オブジェクトのユーザー操作を有効にする必要があります:
[self.storyImageView_ setUserInteractionEnabled:YES];
削除してみてください
[showStoryTapRecognizer setDelegate:self];
私が知る限り、UITapGestureRecognizer
にはデリゲートメソッドはないと思います。
UIImageView
は、UIView
内のUIKit
の唯一のサブクラスであり、デフォルトではユーザー操作が無効になっています。
Swift3では、ターゲットも検索するジェスチャーレコグナイザーを追加していて、ターゲットが通常self
である場合、ジェスチャーレコグナイザーを追加するUIViewを、 lazy var
。そうしないと、ジェスチャー認識機能が機能しません。これはSwift3のバグだと思います。理想的には、クラスが完全に初期化される前に変数のselfにアクセスしている場合、エラーがスローされるはずです。以下のコードはジェスチャー認識機能を検出しません。
let messageImageView: CachedImageView = {
let iv = CachedImageView()
iv.translatesAutoresizingMaskIntoConstraints = false
iv.layer.cornerRadius = 16
iv.layer.masksToBounds = true
iv.contentMode = .scaleAspectFill
iv.isUserInteractionEnabled = true
let zoomTap = UITapGestureRecognizer(target: self, action: #selector(handleZoomTap))
zoomTap.numberOfTapsRequired = 1
iv.addGestureRecognizer(zoomTap)
return iv
}()
これを修正するには、lazy var
を使用する必要があります
lazy var messageImageView: CachedImageView = {
let iv = CachedImageView()
iv.translatesAutoresizingMaskIntoConstraints = false
iv.layer.cornerRadius = 16
iv.layer.masksToBounds = true
iv.contentMode = .scaleAspectFill
iv.isUserInteractionEnabled = true
let zoomTap = UITapGestureRecognizer(target: self, action: #selector(handleZoomTap))
zoomTap.numberOfTapsRequired = 1
iv.addGestureRecognizer(zoomTap)
return iv
}()
多分... action:@selector(showNewsStory)
の代わりにaction:@selector(showNewsStory:)
。これをチェックしてください 。このコントローラに他のUITapGestureRecognizer
はありますか?これを試して:
otherTapRecognizer.cancelsTouchesInView = NO;
objective-C ios 10
UITapGestureRecognizer *oneTouch=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(OneTouchHandeler)];
[oneTouch setNumberOfTouchesRequired:1];
[imageView addGestureRecognizer:oneTouch];
imageView.userInteractionEnabled = YES;
// Swift 3.0
let oneTouch = UITapGestureRecognizer(target: self, action: #selector(self.OneTouchHandeler(_:)))
imageView.addGestureRecognizer(oneTouch)
imageView.isUserInteractionEnabled = true
既に設定している場合imageView.userInteractionEnabled = YES;
しかし、アクションはまだ発生しません。おそらく、imageViewのスーパービューの1つがuserInteractionEnabledがNOだからです。
2つの異なるジェスチャーを許可した場合は、以下のコードスニペットを追加する必要があります。たとえば、pickerViewを使用し、同じpickerViewのタップジェスチャを検出したいとします。
2人のジェスチャー認識機能が同時にジェスチャーを認識できるようにする必要があるかどうかをデリゲートに尋ねます。
目的C
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
return true;
}
スウィフト
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}