2016-11-23 69 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