나는 스위프트에게만 말하므로이 도움이되기를 바랍니다.
세그먼트 화 된 컨트롤의 높이를 동적으로 조정하려면 여러 가지 작업이 필요합니다. 확장 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 당신의 문자열을 포함하는 것입니다 경계의 구형. 이 직사각형의 높이에 따라 세그먼트 화 된 컨트롤의 높이가 결정됩니다. String이 아닌 NSString 또는 NSAttributedString의 인스턴스를 사용하여 문자열의 경계 사각형을 계산할 수 있습니다. "getHeightForSegControl (withString : withWidth :)"메서드에서 경계 rect를 계산했습니다.
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)
}
}
결과 :
당신이 세그먼트 컨트롤이 따라 높이를 업데이트합니다 길이의 문자열로 인스턴스 멤버 "텍스트"의 값을 변경하려면 아래 경우 코드에서
PS 이것은 고정 폭을 원한다고 가정합니다. 당신도 동적 폭을 원한다면 ... 그것은 다른 이야기입니다.
현재 사용되는 방법 대신'UISegmentControl'에'setTitleTextAttributes (_ 속성 : [AnyHashable : Any] ?, 상태 : UIControlState)'를 사용해야한다고 생각합니다. – KrishnaCA
NSParagraphStyleAttributeName을 설정하여 텍스트 속성을 사용했습니다. NSMutableParagraphStyle하지만 여전히 작동하지 않습니다. – IOSCODER