我只会说斯威夫特,所以我希望这可以帮助。
您需要做很多事情来动态调整分段控制的高度。
词根记忆的扩展,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)
}
}
结果:
PS这是假设你想要一个固定的宽度。如果你还想要一个动态宽度......那是一个不同的故事。
我认为,我们应该使用'setTitleTextAttributes(_属性:[AnyHashable:任何] ?,为状态:UIControlState)''为的UISegmentControl'代替目前使用的 – KrishnaCA
的方法我用文字设置'NSParagraphStyleAttributeName'到属性'NSMutableParagraphStyle'但仍然无效。 – IOSCODER