2017-10-21 10 views
0

私はUINavigationItemを持っており、UILabelとUIImageViewが埋め込まれたUIViewにtitleViewを設定しました。私はビューにUITapGestureRecognizerを追加しようとしていますが、動作していないようです。どんな解決策ですか?また、私はrightBarButtonItemを持っていて、戻るボタンを使いたいので、navigationBar全体にgestureRecognizerを追加することはオプションではありません。Swift UITapGestureのタイトル表示で動作しません。

はここに私のコードです:

func configureTitleView() { 
    guard let profile = profile else { 
    // Pop navController 
    return 
    } 

    let titleView = UIView() 
    titleView.frame = CGRect(x: 0, y: 0, width: 100, height: 40) 

    let containerView = UIView() 
    containerView.translatesAutoresizingMaskIntoConstraints = false 
    titleView.addSubview(containerView) 

    let profileImageView = UIImageView() 
    profileImageView.translatesAutoresizingMaskIntoConstraints = false 
    profileImageView.contentMode = .scaleAspectFill 
    profileImageView.clipsToBounds = true 
    let imageURL = URL(string: profile!.firstProfilePicture!) 
    profileImageView.sd_setImage(with: imageURL) 

    containerView.addSubview(profileImageView) 

    profileImageView.leftAnchor.constraint(equalTo: containerView.leftAnchor).isActive = true 
    profileImageView.centerYAnchor.constraint(equalTo: containerView.centerYAnchor).isActive = true 
    profileImageView.widthAnchor.constraint(equalToConstant: 36).isActive = true 
    profileImageView.heightAnchor.constraint(equalToConstant: 36).isActive = true 

    profileImageView.layer.cornerRadius = 36/2 

    let nameLabel = UILabel() 

    containerView.addSubview(nameLabel) 
    nameLabel.text = profile!.displayName! 
    nameLabel.textColor = .white 
    nameLabel.translatesAutoresizingMaskIntoConstraints = false 

    nameLabel.leftAnchor.constraint(equalTo: profileImageView.rightAnchor, constant: 8).isActive = true 
    nameLabel.centerYAnchor.constraint(equalTo: profileImageView.centerYAnchor).isActive = true 
    nameLabel.rightAnchor.constraint(equalTo: containerView.rightAnchor).isActive = true 
    nameLabel.heightAnchor.constraint(equalTo: profileImageView.heightAnchor).isActive = true 

    containerView.centerXAnchor.constraint(equalTo: titleView.centerXAnchor).isActive = true 
    containerView.centerYAnchor.constraint(equalTo: titleView.centerYAnchor).isActive = true 

    self.navigationItem.titleView = titleView 

    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.openProfile)) 
    tapGesture.numberOfTapsRequired = 1 
    titleView.addGestureRecognizer(tapGesture) 
    titleView.isUserInteractionEnabled = true 
} 
+0

ナビゲーションバーのすべてのアイテムをどのように追加するかコードを共有できますか?私はあなたがバックグラウンドビューにタップジェスチャーを追加していて、画像ビューとラベルがそれらのビューの上にあり、ジェスチャーが応答していないことを願っています。 – Bharath

+0

1つの提案、タップジェスチャーの代わりに、他の2つを追加してボタンのターゲットを追加するようなクリアな色のボタンを追加することができます。 – Bharath

+0

@Bharath私のコードを追加しました...ボタンを使用せずに取ることができるアプローチはありますか? –

答えて

2

iOSの11から始まり、ビューはUIBarButtonItem(customView:)は現在、自動レイアウトを使用してレイアウトされている使用してUIBarButtonItemとしてツールバーに追加しました。これにはにnavigationItem.titleViewというプロパティで追加されたタイトルビューがUIViewControllerに含まれます。 titleViewにサイジング制約を追加する必要があります。たとえば:

titleView.widthAnchor.constraint(equalToConstant: 100).isActive = true 
titleView.heightAnchor.constraint(equalToConstant: 40.0).isActive = true 

そうでない場合は、自動レイアウトはCGSize.zeroあるあなたのタイトルビューの固有のコンテンツサイズを使用します。ジェスチャは、そのビューのサブビューが継承されていない場合でも、それらが添付されているビューの境界にマスクされます。制約なしのtitleViewの境界はCGRect.zeroであるため、決して発火しません。制約を追加すると、期待どおりに動作します。

詳細については、WWDC 2017セッションUpdating your app for iOS 11を参照してください。

+0

ありがとうございました! –

関連する問題