24

ナビゲーションコントローラーに表示されるビューがいくつかあります。これらのビューのうちの2つには、ナビゲーションバーのタイトルが長くなっています。

問題は、タイトルが長すぎて収まらない場合、一部の文字が切り捨てられ、「...」が追加されることです。

ナビゲーションバーにタイトルテキストのサイズを自動的に合わせてサイズ変更するように指示する方法はありますか?

4

10 に答える 10

40

ViewDidloadで以下のコードを使用しました。

Objective C

self.title = @"Your TiTle Text";
UILabel* tlabel=[[UILabel alloc] initWithFrame:CGRectMake(0,0, 200, 40)];
tlabel.text=self.navigationItem.title;
tlabel.textColor=[UIColor whiteColor];
tlabel.font = [UIFont fontWithName:@"Helvetica-Bold" size: 30.0];
tlabel.backgroundColor =[UIColor clearColor];
tlabel.adjustsFontSizeToFitWidth=YES;
tlabel.textAlignment = NSTextAlignmentCenter;
self.navigationItem.titleView=tlabel;

Swiftバージョン

self.title = "Your Title Text"
let tlabel = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 40))
tlabel.text = self.title
tlabel.textColor = UIColor.white
tlabel.font = UIFont.systemFont(ofSize: 30, weight: .bold)
tlabel.backgroundColor = UIColor.clear
tlabel.adjustsFontSizeToFitWidth = true
tlabel.textAlignment = .center
self.navigationItem.titleView = tlabel

それがあなたのために働くことを願っています。ありがとう

于 2013-02-19T16:26:37.093 に答える
11

Accepted Answerの迅速なバージョン+ラベルテキストを中央に配置:

スイフト2.3:

    self.title = "Your TiTle Text"
    let tlabel = UILabel(frame: CGRectMake(0, 0, 200, 40))
    tlabel.text = self.title
    tlabel.textColor = UIColor.whiteColor()
    tlabel.font = UIFont.boldSystemFontOfSize(17) //UIFont(name: "Helvetica", size: 17.0)
    tlabel.backgroundColor = UIColor.clearColor()
    tlabel.adjustsFontSizeToFitWidth = true
    tlabel.textAlignment = .Center
    self.navigationItem.titleView = tlabel

そしてSwift3:

    self.title = "Your TiTle Text"
    let frame = CGRect(x: 0, y: 0, width: 200, height: 40)
    let tlabel = UILabel(frame: frame)
    tlabel.text = self.title
    tlabel.textColor = UIColor.white
    tlabel.font = UIFont.boldSystemFont(ofSize: 17) //UIFont(name: "Helvetica", size: 17.0)
    tlabel.backgroundColor = UIColor.clear
    tlabel.adjustsFontSizeToFitWidth = true
    tlabel.textAlignment = .center
    self.navigationItem.titleView = tlabel
于 2016-11-16T14:17:52.447 に答える
2

titleViewにビューを追加していて、ビューのサイズを変更したい場合は、次のコードを使用できます(Swift 3)

self.translatesAutoresizingMaskIntoConstraints = false
self.layoutIfNeeded()
self.sizeToFit()
self.translatesAutoresizingMaskIntoConstraints = true
于 2017-09-13T22:27:50.327 に答える
2

これは私のために働く

Objective C

[UILabel appearanceWhenContainedInInstancesOfClasses:@[[UINavigationBar class]]].adjustsFontSizeToFitWidth = YES;

Swiftバージョン

UILabel.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).adjustsFontSizeToFitWidth = true
于 2021-09-13T15:03:13.100 に答える
1

上記のソリューションはどれも、私にとって確実に機能するものではありません。ただし、Swift 2の提供回答のさまざまな要素を使用して解決策を見つけました。ラベルを変更するたびにカスタムコードを必要とせず、タイトルにプロパティオブザーバーを使用するだけなので、非常にエレガントです。

私の場合、ナビゲーションバーの左側に戻るボタンがあり、画面の中央からテキストを配置していることに注意してください。これを修正するために、属性付きテキストとtailIndentを使用しています。以下のコードのすべてのコメント/情報:

class VCHowToTopic : UIViewController {


    //add handlers so that any manipulation of the title is caught and transferred to the custom drawn UILabel
    override var title : String? {
        set {
            super.title = newValue
            configureTitleView()
        }
        get {
            return super.title
        }
    }

    //MARK: - lifecycle


    func configureTitleView() {
        //some large number that makes the navigationbar schrink down our view when added
        let someVeryLargeNumber = CGFloat(4096)
        //create our label
        let titleLabel = UILabel(frame: CGRect(x: 0, y: 0, width: someVeryLargeNumber, height: someVeryLargeNumber))
        //0 means unlimited number of lines
        titleLabel.numberOfLines = 0
        //define style of the text (we will be using attributed text)
        let style = NSMutableParagraphStyle()
        style.alignment = .Center
        //top compensate for the backbutton which moves the centered text to the right side of the screen
        //we introduce a negative tail indent, the number of 56 has been experimentally defined and might
        //depend on the size of your custom back button (if you have one), mine is 22x22 px
        style.tailIndent = -56
        //create attributed text also with the right color
        let attrText = NSAttributedString(string: title!, attributes: [NSParagraphStyleAttributeName : style,
            NSForegroundColorAttributeName : UIColor.whiteColor()])
        //configure the label to use the attributed text
        titleLabel.attributedText = attrText
        //add it as the titleview
        navigationItem.titleView = titleLabel
    }


}
于 2016-09-04T06:51:18.300 に答える
1

Swift5およびiOS13/ iOS 14

Swift5とiOS13で大きなタイトルを使用している場合、ナビゲーションバーに別のタイトルが追加されるだけなので、上記の回答は機能しません。代わりに、largeTitleTextAttributesプロパティ(iOS 11以降で使用可能)を使用して、必要に応じてタイトルを縮小できます。
ストーリーボードまたはコードを介して大きなタイトルをすでに設定している場合は、次の方法を使用できます。

private func configureNavigationTitle(_ title: String) {
        let tempLabel = UILabel()
        tempLabel.font = UIFont.systemFont(ofSize: 34, weight: .bold)
        tempLabel.text = title

        if tempLabel.intrinsicContentSize.width > UIScreen.main.bounds.width - 30 {
            var currentTextSize: CGFloat = 34
            for _ in 1 ... 34 {
                currentTextSize -= 1
                tempLabel.font = UIFont.systemFont(ofSize: currentTextSize, weight: .bold)
                if tempLabel.intrinsicContentSize.width < UIScreen.main.bounds.width - 30 {
                    break
                }
            }
            navigationController?.navigationBar.largeTitleTextAttributes = [NSAttributedString.Key.font : UIFont.systemFont(ofSize: currentTextSize, weight: .bold)]
        }
        self.title = title
    }

つまり、基本的には、タイトルの幅を取得するためにヘルパーラベルを使用してから、タイトルがナビゲーションバーに収まるまでフォントサイズを縮小します。からそれを呼び出すviewDidLoad()

override func viewDidLoad() {
        super.viewDidLoad(
        configureNavigationTitle("A very long title which fits perfectly fine")
    }
于 2020-05-27T12:49:43.467 に答える
1

UILabelをUINavigationItemとして作成し、titleViewに設定できadjustsFontSizeToFitWidthますtrue

class MyViewController: UIViewController {
    override var title: String? {
        didSet {
            (self.navigationItem.titleView as? UILabel)?.text = self.title
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()

        self.navigationItem.titleView = UILabel().apply {
            $0.font = .boldSystemFont(ofSize: 18)
            $0.minimumScaleFactor = 0.5
            $0.adjustsFontSizeToFitWidth = true
            $0.text = self.title
        }
    }
}

使いやすい:

myViewController.title = "This is a long title, but don’t worry."

上記のコードのapplyクロージャは、プログラミングエクスペリエンスを向上させるためのトリックです。with閉鎖もあります。みんなにお勧め。

protocol ScopeFunc {}

extension ScopeFunc {
    @inline(__always) func apply(_ block: (Self) -> ()) -> Self {
        block(self)
        return self
    }

    @inline(__always) func with<R>(_ block: (Self) -> R) -> R {
        return block(self)
    }
}

extension NSObject: ScopeFunc {}
于 2020-07-10T11:07:21.387 に答える
0

ナビゲーションバーのタイトルビューをuilabelでカスタマイズし、フォントサイズを調整する必要があります。

    [self.navigationItem setTitleView:<"Include any UI View subclass">];
于 2013-02-19T11:40:02.990 に答える
-1

これは、複数の行も許可するSwiftの例です。PureLayoutを使用して自動レイアウトを簡素化します。

override func viewDidLoad() {
  super.viewDidLoad()
  configureTitleView()
}

func configureTitleView() {
  let titleLabel = UILabel()
  titleLabel.numberOfLines = 0
  titleLabel.textAlignment = .Center
  titleLabel.font = UIFont.boldSystemFontOfSize(17.0)
  titleLabel.text = searchLoc.mapItem.name
  navigationItem.titleView = titleLabel
  titleLabel.autoPinEdgesToSuperviewMargins() // PureLayout method
  titleLabel.adjustsFontSizeToFitWidth = true
}

そして使用例:

ここに画像の説明を入力してください

于 2015-05-27T15:41:51.090 に答える
-1

Swift4とiOS13

これを追加して、将来の自分が見つけられるようにします。何らかの理由でtitleViewに追加されたビューは、自動的にサイズを変更することを好みません。したがって、手動で行う必要があります。

(navigationItem.titleView as? UILabel)?.text = "A longer string..." // label not resized and text is cut off

解決

navigationItem.titleView?.translatesAutoresizingMaskIntoConstraints = false
navigationItem.titleView?.setNeedsLayout()
navigationItem.titleView?.layoutIfNeeded()
navigationItem.titleView?.translatesAutoresizingMaskIntoConstraints = true

ここで私を導いてくれた@PaoloMusolinoに感謝します。

于 2020-04-30T20:41:06.290 に答える