33

アプリケーションの 1 つのナビゲーション バーに大きなタイトルを追加しようとしています。問題は、タイトルが少し長いため、大きなタイトルに 2 行追加する必要があることです。ナビゲーション バーに 2 行の大きなタイトルを追加するにはどうすればよいですか?

これは、デフォルトのナビゲーション バーのタイトルに関するものではありません。iOS 11で導入された大型タイトルについてです。そのため、大きなタイトルを考慮して提案を追加してください。ありがとう

Title text truncated with 3 dots in the navigation bar

4

8 に答える 8

15

@krunalの回答に基づいて、これは私のために働いています:

extension UIViewController {

func setupNavigationMultilineTitle() {
    guard let navigationBar = self.navigationController?.navigationBar else { return }
    for sview in navigationBar.subviews {
        for ssview in sview.subviews {
            guard let label = ssview as? UILabel else { break }
            if label.text == self.title {
                label.numberOfLines = 0
                label.lineBreakMode = .byWordWrapping
                label.sizeToFit()
                UIView.animate(withDuration: 0.3, animations: {
                    navigationBar.frame.size.height = 57 + label.frame.height
                })
            }
        }
    }
}

UIViewController で:

override func viewDidLoad() {
    super.viewDidLoad()
    self.title = "This is a multiline title"
    setupNavigationMultilineTitle()
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    setupNavigationMultilineTitle()
}

大きなタイトルのフォントと色を設定するには:

navigation.navigationBar.largeTitleTextAttributes = [NSAttributedStringKey.foregroundColor: .red, NSAttributedStringKey.font: UIFont.boldSystemFont(ofSize: 30)]
于 2018-07-11T23:30:59.717 に答える
3

戻るボタンがある場合、改行ソリューションは問題があるようです。そのため、改行する代わりに、ラベルの自動調整フォントを作成しました。

func setupLargeTitleAutoAdjustFont() {
    guard let navigationBar = navigationController?.navigationBar else {
        return
    }
    // recursively find the label
    func findLabel(in view: UIView) -> UILabel? {
        if view.subviews.count > 0 {
            for subview in view.subviews {
                if let label = findLabel(in: subview) {
                    return label
                }
            }
        }
        return view as? UILabel
    }

    if let label = findLabel(in: navigationBar) {
        if label.text == self.title {
            label.adjustsFontSizeToFitWidth = true
            label.minimumScaleFactor = 0.7
        }
    }
}

次に、ラベルが見つかることを確認するために viewDidLayoutSubviews() で呼び出す必要があります。これを呼び出す必要があるのは 1 回だけです。

private lazy var setupLargeTitleLabelOnce: Void = {[unowned self] in
    if #available(iOS 11.0, *) {
        self.setupLargeTitleAutoAdjustFont()
    }
}()

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    let _ = setupLargeTitleLabelOnce
}

このコントローラーに戻る何らかのナビゲーション コントローラー ポップ イベントがある場合は、viewDidAppear() で再度呼び出す必要があります。私はこれに対するより良い解決策を見つけていません - ポップイベントから戻ってきたときにラベルのフォントが変化するという小さな不具合があります:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    if #available(iOS 11.0, *) {
        setupLargeTitleAutoAdjustFont()
    }
}
于 2020-04-17T00:44:40.770 に答える
-1

ここで、に複数行を追加できUILabelますNavigationTitle。コードをカスタマイズしてUILabelself.navigationItem.titleView

    let label = UILabel()
    label.backgroundColor = .clear
    label.numberOfLines = 2
    label.font = UIFont(name: "Montserrat-Regular", size: 16.0)!
    label.textAlignment = .center
    label.textColor = .white
    label.text = "FIFA" + " \n " + "Europe 2018-2019"  
    self.navigationItem.titleView = label

ここに画像の説明を入力

于 2019-01-24T07:40:15.023 に答える