[Swift]可換行/可滑動標題

在程式中viewController常常需要加上標題,但是標題的長度可能會過長
而iOS底層實現的title沒有自動換行的功能
這時候我們可以透過以下程式碼把標題設成自動換行或是可以左右滑動的標題

設定成2行的標題

// 設定NavigationBar標題為UILabel
func setNavBarTitleAsLabel(){
    // 設定UILabel,大小為畫面寬度乘上0.9,高度為40
    let navigationTitlelabel = UILabel(frame: CGRect(x: 0, y: 0, width: self.view.bounds.width*0.9, height: 40))
    // 設定UILabel最多顯示2行,超出顯示省略號
    navigationTitlelabel.numberOfLines = 2
    navigationTitlelabel.lineBreakMode = .byTruncatingTail
    // 取得當前ViewController的標題
    let title = self.title ?? ""
    // 設定UILabel的文字為標題
    navigationTitlelabel.text = title
    // 設定UILabel文字大小自適應,最小比例為0.1
    navigationTitlelabel.adjustsFontSizeToFitWidth = true
    navigationTitlelabel.minimumScaleFactor = 0.1
    // 設定UILabel文字顏色為白色,對齊方式為置中
    navigationTitlelabel.textColor = .white
    navigationTitlelabel.textAlignment = .center
    // 設定UILabel字體為PingFangTC-Medium,大小為16
    let font = UIFont(name: "PingFangTC-Medium", size: 16)!
    // 計算標題寬度
    let maxSize = CGSize(width: 9999, height: 9999)
    let strSize = (title as NSString).boundingRect(with: maxSize, options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font : font], context: nil)
    // 判斷標題寬度是否大於UILabel寬度
    if strSize.width < navigationTitlelabel.bounds.width {
        // 使用原標題
        return
    }
    // 設定UILabel為NavigationBar的標題
    navigationItem.titleView = navigationTitlelabel
}

可滑動的標題

///可以左右滑動的標題
    func setNavBarTitleAsScrollView(){
    // 建立一個UITextView
    let navigationTitlelabel = UITextView()
    
    // 建立一個UIScrollView
    let navigationTitleScrollView = UIScrollView(frame: CGRect(x: 0, y: 0, width: self.view.bounds.width*0.9, height: 40))
    
    // 取得目前的標題
    let title = self.title ?? ""
    
    // 設定UITextView的文字為標題
    navigationTitlelabel.text = title
    
    // 設定UITextView的文字顏色為白色
    navigationTitlelabel.textColor = .white
    
    // 設定UITextView無法編輯
    navigationTitlelabel.isEditable = false
    
    // 設定UITextView的背景為透明
    navigationTitlelabel.backgroundColor = .clear
    
    // 將UITextView加入UIScrollView
    navigationTitleScrollView.addSubview(navigationTitlelabel)
    
    // 設定UITextView的字型
    let font = UIFont(name: "PingFangTC-Medium", size: 16)!
    navigationTitlelabel.font = font
    
    // 設定UITextView最大的Size
    let maxSize = CGSize(width: 9999, height: 9999)
    
    // 計算標題的Size
    let strSize = (title as NSString).boundingRect(with: maxSize, options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font : font], context: nil)
    
    // 判斷標題寬度是否大於畫面的寬度
    if strSize.width > self.view.frame.width {
        // 如果標題寬度大於畫面寬度,調整UITextView的frame
        navigationTitlelabel.frame = CGRect(x: 0, y: 0, width: strSize.width + 30 , height: view.frame.height+10)
    } else {
        // 如果標題寬度小於畫面寬度,使用原本的標題
        return
    }
    
    // 設定UIScrollView的frame、contentSize和將其加入導航欄中
    navigationTitleScrollView.frame = CGRect(x: 0, y: 100, width: view.frame.width, height: view.frame.height)
    navigationTitleScrollView.contentSize = CGSize(width: strSize.width + 30 , height: strSize.height)
    navigationItem.titleView = navigationTitleScrollView
}