2017-09-27 5 views
1

"title"と "description"ラベルを持つナビゲーションコントローラ用にカスタムtitleViewを実装しようとしています。このtitleViewを最初のVCに配置した場合、見栄えがよくなります。 2番目のVCをナビゲーションスタックにプッシュしてポップすると、titleViewの位置が変更されます。カスタムタイトルビューは、プッシュアンドポップ後の場所を変更してスタック内に新しい画面を表示します

titleViewの制約:私はtitleViewを挿入するために、次のコードを使用してVCのviewDidLoad

titleLabel.translatesAutoresizingMaskIntoConstraints = false 
descriptionLabel.translatesAutoresizingMaskIntoConstraints = false 
titleLabel.widthAnchor.constraint(equalTo: widthAnchor).isActive = true 
descriptionLabel.widthAnchor.constraint(equalTo: titleLabel.widthAnchor).isActive = true 
titleLabel.topAnchor.constraint(equalTo: topAnchor).isActive = true 
descriptionLabel.bottomAnchor.constraint(equalTo: bottomAnchor, constant: 2.0).isActive = true 

navigationItem.titleView = BarTitleView() 
navigationItem.titleView?.bounds = CGRect(x: 0, y: 0, width: view.bounds.width, height: 44) 
navigationItem.titleView?.updateConstraints() 

IはviewWillAppearに追従行を挿入しようとした(第2のVCは、異なるバーボタンを有しますそれは問題の根源になることがあります)、何も変わりません。

navigationItem.titleView?.bounds = CGRect(x: 0, y: 0, width: view.bounds.width, height: 44) 
navigationItem.titleView?.updateConstraints() 

この問題を解決するにはどうすればよいですか?

答えて

1

インタフェースバーと制約の修正を必要とせずにナビゲーションバーにタイトルとサブタイトルを作成しました。

self.navigationItem.titleView = Functions.Views.setTitle(title: "Title String", subtitle: "Subtitle String") 

class func setTitle(title:String, subtitle:String) -> UIView { 
    let titleLabel = UILabel(frame: CGRect(x: 0, y: -8, width: 0, height: 0)) 

    titleLabel.backgroundColor = UIColor.clear 
    titleLabel.textColor = UIColor.white 
    titleLabel.font = UIFont.boldSystemFont(ofSize: 17) 
    titleLabel.text = title 
    titleLabel.sizeToFit() 

    let subtitleLabel = UILabel(frame: CGRect(x: 0, y: 12, width: 0, height: 0)) 
    subtitleLabel.backgroundColor = UIColor.clear 
    subtitleLabel.textColor = UIColor.white 
    subtitleLabel.font = UIFont.systemFont(ofSize: 12) 
    subtitleLabel.text = subtitle 
    subtitleLabel.sizeToFit() 

    // Fix incorrect width bug 
    if (subtitleLabel.frame.size.width > titleLabel.frame.size.width) { 
     var titleFrame = titleLabel.frame 
     titleFrame.size.width = subtitleLabel.frame.size.width 
     titleLabel.frame = titleFrame 
     titleLabel.textAlignment = .center 
    } 

    let titleView = UIView(frame: CGRect(x: 0, y: 0, width: titleLabel.frame.size.width, height: titleLabel.frame.size.height)) 
    titleView.addSubview(titleLabel) 
    titleView.addSubview(subtitleLabel) 

    let widthDiff = subtitleLabel.frame.size.width - titleLabel.frame.size.width 

    if widthDiff < 0 { 
     let newX = widthDiff/2 
     subtitleLabel.frame.origin.x = abs(newX) 
    } else { 
     let newX = widthDiff/2 
     titleLabel.frame.origin.x = newX 
    } 

    return titleView 
} 

は、その後、私はちょうどこのラインを呼び出す任意のビューコントローラでタイトルビューを使用するために次のようにタイトルビューを作成するための

My機能が見えます

関連する問題