Я говорю только Свифт, поэтому я надеюсь, что это поможет.
Чтобы динамически регулировать высоту сегментарного элемента управления, вам необходимо сделать несколько шагов.
1.Make расширение для 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.Set ваши кадры в методе 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](https://i.stack.imgur.com/4kem7.png)
PS это предполагает, что вы хотите фиксированную ширину. Если вам нужна динамическая ширина ... это совсем другая история.
Я думаю, что мы должны использовать 'setTitleTextAttributes (_ атрибуты: [AnyHashable: Любые] ?, для государства: UIControlState)' 'для UISegmentControl' вместо метода в настоящее время используется – KrishnaCA
я использовал атрибуты текста, установив' NSParagraphStyleAttributeName' в 'NSMutableParagraphStyle', но все равно это не сработало. – IOSCODER