2016-11-23 67 views
0

我在我的應用程序中有一個UISegmentControl。我添加了所有必需的約束,並將其高度約束設置爲>= 40。控制有3個部分。問題是我從服務器獲取段標題數據,它可以是任意長度。當段標題超過一行時,文本被截斷。根據標籤高度更改UISegmentControl高度

我通過添加以下代碼解決了這個問題: -

[[UILabel appearanceWhenContainedIn:[UISegmentedControl class], nil] setNumberOfLines:0]; 

它正常工作時,標題長度爲2行。當標題長度超過2行並且文本被截斷時,真正的問題開始,理想情況下,UISegmentControl應該通過檢查其內容壓縮屬性來增加其高度以適應更長的圖塊,如UILabel。我試圖通過改變優先級的值來玩內容壓縮屬性,但徒勞無益。 UISegmentControl不會自動調整大小以適應更大的文本。任何想法如何使用自動佈局來實現所需的行爲。

+0

我認爲,我們應該使用'setTitleTextAttributes(_屬性:[AnyHashable:任何] ?,爲狀態:UIControlState)''爲的UISegmentControl'代替目前使用的 – KrishnaCA

+0

的方法我用文字設置'NSParagraphStyleAttributeName'到屬性'NSMutableParagraphStyle'但仍然無效。 – IOSCODER

回答

0

我只會說斯威夫特,所以我希望這可以幫助。

您需要做很多事情來動態調整分段控制的高度。

詞根記憶的擴展,UILable像這樣:

import Foundation 
import UIKit 

    extension UILabel{ 
     var defaultNumberOfLines: Int{ 
      get{return self.numberOfLines} 
      set{self.numberOfLines = newValue} 
     } 

     var defaultFont: UIFont{ 
      get {return self.font} 
      set{self.font = newValue} 
     } 
    } 

2.Calculate是要包含你的字符串的邊框。此矩形的高度將決定您的分段控件的高度。您可以使用NSString或NSAttributedString的實例來計算字符串的邊界矩形,但不能使用String。我在「getHeightForSegControl(withString:withWidth :)」方法中計算了邊界矩形。

3.You也必須記住計算的字符串,否則您的文字是怎麼回事,因爲明顯的差異的被截斷的邊界矩形時使用相同的字體作爲的UILabel ...

4.設置方法viewWillLayoutSubviews()中的幀。這很重要,因爲無論何時將新文本設置爲段,都需要調用超級視圖的setNeedsLayout()來計算結果邊界文本以及分段控件的相應大小。

在下面的代碼,如果你實例成員「文本」的值改變爲任何長度的字符串的分割控制將更新其相應高度:

import UIKit 

class ViewController: UIViewController { 
    var segmentedControl: UISegmentedControl! 
    var text = "This is a text that is supposed to dynamically change the height of an instance of UISegmentedControl" 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     setUpSegmentedControl() 
     UILabel.appearance().defaultNumberOfLines = 0 
     UILabel.appearance().defaultFont = UIFont.boldSystemFont(ofSize: 15) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    override func viewWillLayoutSubviews() { 

     segmentedControl.frame = CGRect(x: view.bounds.size.width/2 - 100, y: view.bounds.size.height/2 - (getHeightForSegControl(withString: text, withLabelWidth: 100)/2), width: 200, height: getHeightForSegControl(withString: text, withLabelWidth: 100)) 
    } 

    func setUpSegmentedControl(){ 
     segmentedControl = UISegmentedControl(items: [text, "Oranges"]) 
     view.addSubview(segmentedControl) 
    } 

    func getHeightForSegControl(withString string: String, withLabelWidth width: CGFloat) -> CGFloat { 
     let nsString: NSString = string as NSString 
     let size: CGSize = CGSize(width: width, height: CGFloat.greatestFiniteMagnitude) 
     let boundingRectSize = nsString.boundingRect(with: size, options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: [NSFontAttributeName: UILabel.appearance().defaultFont], context: nil).size 

     print(ceil(boundingRectSize.height)) 
     return ceil(boundingRectSize.height) 
    } 

} 

結果:

enter image description here

PS這是假設你想要一個固定的寬度。如果你還想要一個動態寬度......那是一個不同的故事。

+0

是的,也許你是對的我通過遍歷UISegemenControl的子視圖並檢查UILabel的高度來調整UISegmentControl的高度,也取得了同樣的效果。正如我在評論中提到的,我想通過'AutoLayout'來完成,所以上面的代碼不適合我。我仍然認爲使用固有尺寸我們可以達到預期的效果。 – IOSCODER