2017-09-15 6 views
1

タップジェスチャをUIViewに追加しようとしていますが、ジェスチャが認識されません。ジェスチャーイベントがUIViewでタップしない

"iconBadgeView"は、パラメータに渡される定義されたサイズのイメージを持つUIViewです。

lazy var cardioVascularIcon : IconBadgeView! = { 

    let iconBadgeView = IconBadgeView(frame: CGRect(x: 0, y: 0, width: 95, height: 95), data:["big":"db_history"]) 

    let tapEvent = UITapGestureRecognizer(target: self, action: #selector(loadNewView(sender:))) 

    tapEvent.numberOfTapsRequired = 1 
    iconBadgeView.translatesAutoresizingMaskIntoConstraints = false 

    iconBadgeView.isUserInteractionEnabled = true  
    iconBadgeView.addGestureRecognizer(tapEvent) 
}() 

は、同じクラスに添付委任者があると機能は以下のように実装されます。

func loadNewView(sender: UITapGestureRecognizer) { 
    print("Tapped") 
} 

機能loadNewViewが呼び出さ取得されていません。私はコード内で何が間違っているのか分かりません。誰かが助けることができるならば、どうぞ。

私は以下のようにスーパーにiconBadgeViewを追加してい:

override init(frame: CGRect) { 
    super.init(frame: CGRect.zero) 

    addSubview(cardioVascularIcon) 

    cardioVascularIcon.pinToSuperview([.Top]) 
    cardioVascularIcon.pinToSuperview([.Left], constant: 92) 
    cardioVascularIcon.pinToSuperview([.Right], constant: 92) 
} 
+0

'てみましょうtapEvent = UITapGestureRecognizer(ターゲット:自己、アクション:#selector(loadNewView(差出人:))) tapEvent.addTarget(iconBadgeView、アクション:#selector(loadNewView(差出人:))) 'なぜあなたは繰り返していますあなた自身ここに私の友人笑。 'UITapGestureRecognizer()'を意味する 'デフォルトのコンストラクタ'を使ってジェスチャを作成する場合は、セレクタにそのメソッド 'addTarget'を渡す必要がありますが、セレクタとターゲットを必要とするカスタムコンストラクタを使用しているのでそのコードの2行目を持っている: – Lamar

+0

私は重複した行を削除しようとしましたが、それは助けになりません – user2122178

+0

あなたはどのようなエラー/問題がありましたか?あなたのスーパービューに 'iconBadgeView'を追加しましたか? 'translatesAutoresizingMaskIntoConstraints'を無効にしているので、画面に表示されていると思うかもしれませんが、そうでない場合は、これらの制約を追加してください:) – Lamar

答えて

1

問題の回避方法があります。私はラベルの代わりにボタンを使用しています。以下は、私が使用していたコードは次のとおりです。

func createButton (buttonWidth : CGFloat?, buttonTitle : String?, buttonFont : UIFont?, imageName : String?, buttonColor : UIColor?) -> UIButton { 
    let newButton = UIButton(type: . custom) 
    newButton.showsTouchWhenHighlighted = false 
    newButton.translatesAutoresizingMaskIntoConstraints = false 
    newButton.adjustsImageWhenHighlighted = false 

    if let title = buttonTitle { 
     newButton.setTitle(title, for: .normal) 
    } 
    if let color = buttonColor { 
     if let _ = newButton.titleLabel { 
      newButton.setTitleColor(color, for: .normal) 
     } 
    } 

    if let btnWidth = buttonWidth { 
     newButton.frame = CGRect(x: 0, y: 0, width: btnWidth, height: btnWidth) 
     newButton.layer.cornerRadius = 0.5 * newButton.bounds.size.width 
     newButton.clipsToBounds = true 
    } 
    if let img = imageName { 
     newButton.setImage(UIImage(named: img), for: .normal) 
    } 
    if let font = buttonFont { 
     newButton.titleLabel?.font = font 
    } 

    return newButton 
} 
let addDiagButton = self.createButton(buttonWidth: nil, buttonTitle: addButtonTitle, buttonFont: UIFont.regularDisplayOfSize(30), imageName: nil, buttonColor: UIColor(red: 111, green: 160, blue: 186)) 

addDiagButton.addTarget(self, action: #selector(addDiag(sender:)), for: .touchUpInside) 

上記のコードは、ボタンを作成しても、それをトリガイベントをアタッチし、共通の機能を持っています。コードはうまく動作しています。

ラベルクリックのように動作させるには、createButton関数に行を追加しました。

newButton.adjustsImageWhenHighlighted = falseを

クリックしたときに、このボタンのフラッシュ効果が制限されます。

0

あなたiconBadgeViewが消え、それはローカル変数だから。

init cardioVascularIcon var。

lazy var cardioVascularIcon : IconBadgeView! = { 

    cardioVascularIcon.frame = CGRect(x: 0, y: 0, width: 95, height: 95) 
    //here call function which sets data property 

    let tapEvent = UITapGestureRecognizer(target: self, action: #selector(loadNewView(sender:))) 

    tapEvent.numberOfTapsRequired = 1 
    cardioVascularIcon.translatesAutoresizingMaskIntoConstraints = false 

    cardioVascularIcon.isUserInteractionEnabled = true  
    cardioVascularIcon.addGestureRecognizer(tapEvent) 
}() 
+0

答えのために私はそれがうまくいかないことを恐れている。 – user2122178

+0

それは画面上に表示されるビューですか?ビュー階層にこの新しいビューを追加するコードがありません。 – Dan

+0

ええ、ビューが画面に表示されます。 – user2122178

関連する問題