17

因此,我想在導航控制器導航欄的標題下添加一個「字幕」。在Xcode中添加導航欄控制器標題下的字幕

我到目前爲止查找的所有東西都希望我使用CGRect。我不知道這是什麼,它聽起來像是想要我創建一個全新的視圖,這不是我想要做的。

我的問題是,是否有點方法來添加一個字幕視圖很容易?

我發現被張貼在堆棧溢出,並在此最接近的是鏈接:

Create a subtitle in navigationbar

顯然,去年的這個工作,但現在我得到的錯誤及其在我viewDidLoad中...

我試過這樣:

self.navigationController .navigationItem.prompt = 「字幕這裏」

它唯一不會顯示任何錯誤,但仍然不起作用的東西。它從字面上什麼都不做。在運行時至少沒有可見的東西。

在附註中,swift是首選。謝謝!

+0

您是否嘗試過'self.navigationItem.prompt = 「字幕」'? – tktsubota

+0

@tktsubota這將使標題上方的字幕,而不是標題 –

+0

@RajanMaheshwari是的,我做了一個測試,發現了。 – tktsubota

回答

26

雖然有一個解決方案,但它在viewDidLoad

self.navigationItem.titleView = setTitle("Title", subtitle: "SubTitle") 

一些已知問題

的解決辦法是寫一個函數這樣

func setTitle(title:String, subtitle:String) -> UIView { 
    let titleLabel = UILabel(frame: CGRectMake(0, -2, 0, 0)) 

    titleLabel.backgroundColor = UIColor.clearColor() 
    titleLabel.textColor = UIColor.grayColor() 
    titleLabel.font = UIFont.boldSystemFontOfSize(17) 
    titleLabel.text = title 
    titleLabel.sizeToFit() 

    let subtitleLabel = UILabel(frame: CGRectMake(0, 18, 0, 0)) 
    subtitleLabel.backgroundColor = UIColor.clearColor() 
    subtitleLabel.textColor = UIColor.blackColor() 
    subtitleLabel.font = UIFont.systemFontOfSize(12) 
    subtitleLabel.text = subtitle 
    subtitleLabel.sizeToFit() 

    let titleView = UIView(frame: CGRectMake(0, 0, max(titleLabel.frame.size.width, subtitleLabel.frame.size.width), 30)) 
    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 
} 

使用此功能的自定義導航標題視圖只有已知的問題是,如果副標題變得比錯位發生的大。

最終結果 enter image description here

來源:https://gist.github.com/nazywamsiepawel/0166e8a71d74e96c7898

+0

它是一個更多的代碼,然後我期待着,但它確實有效。我真的希望蘋果增加一個更簡單的方法。字幕似乎並不像任何東西,到目前爲止取得..大聲笑 – AdrianGutierrez

+0

謝謝噸的順便! :) @rajan – AdrianGutierrez

+0

我需要這樣的東西,如果標題是空白的,那麼標題應該居中。我必須在聊天應用程序中實現。如果用戶開始輸入,則顯示字幕。欲瞭解更多,請參閱whatsApp。 – Ashu

10

非常感謝您的回答! @RajanMaheshwari

您的編碼正常,只是你與widthDiff所作的if語句..

我調整了一點點,一切工作順利。

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

再次感謝您的迴應!

+0

偉大的工作...... –

+0

偉大的修復!也必須這樣做。 – cloudcal

+0

偉大的,它的工作 –

23

這是我的版本在擴展上使用堆棧視圖。

extension UINavigationItem { 



    func setTitle(title:String, subtitle:String) { 

      let one = UILabel() 
      one.text = title 
      one.font = UIFont.systemFont(ofSize: 17) 
      one.sizeToFit() 

      let two = UILabel() 
      two.text = subtitle 
      two.font = UIFont.systemFont(ofSize: 12) 
      two.textAlignment = .center 
      two.sizeToFit() 



      let stackView = UIStackView(arrangedSubviews: [one, two]) 
      stackView.distribution = .equalCentering 
      stackView.axis = .vertical 

      let width = max(one.frame.size.width, two.frame.size.width) 
      stackView.frame = CGRect(x: 0, y: 0, width: width, height: 35) 

      one.sizeToFit() 
      two.sizeToFit() 



      self.titleView = stackView 
     } 
    } 
+3

標題和副標題從導航控制器推動時從左側滑動到中心任何變通方法 –

+2

對我來說,這是更清晰的答案,它沒有神奇的數字作爲第一個答案。在設置軸之後,我只會添加'stackView.alignment = .center',否則如果字幕較大,它將不會完全居中。 此外,我會刪除最後兩次調用'sizeToFit()',因爲你在標籤上調用它們。 – GerardoMR

2

感謝您的回答@RajanMaheshwari

如果有人遇到的問題在當字幕文本比標題文字較長的題目變得錯位,我下面的代碼添加到拉詹的答案以上只是下面,說明由subtitleLabel實例化:

// 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 
} 

希望這可以幫助別人誰遇到同樣的問題,因爲我

+0

根據上面的@GerardoMR評論 - 您可以使用UIStackView設置來居中標題/副標題:'stackView.alignment = .center' –

1

另一種解決方案是隻使用一個標籤和NSAttributedString來區分標題和字幕(使用不同的字體大小,重量,顏色等)。消除了不同標籤對齊的問題。

extension UIViewController { 
    func setTitle(_ title: String, subtitle: String) { 
     let rect = CGRect(x: 0, y: 0, width: 400, height: 50) 
     let titleSize: CGFloat = 20  // adjust as needed 
     let subtitleSize: CGFloat = 15 

     let label = UILabel(frame: rect) 
     label.backgroundColor = .clear 
     label.numberOfLines = 2 
     label.textAlignment = .center 
     label.textColor = .black 

     let text = NSMutableAttributedString() 
     text.append(NSAttributedString(string: title, attributes: [.font : UIFont.boldSystemFont(ofSize: titleSize)])) 
     text.append(NSAttributedString(string: "\n\(subtitle)", attributes: [.font : UIFont.systemFont(ofSize: subtitleSize)])) 
     label.attributedText = text 
     self.navigationItem.titleView = label 
    } 
} 

定製titleview的部分基於https://stackoverflow.com/a/34298491/3918865

相關問題