2016-11-23 15 views
0

내 앱에 UISegmentControl이 있습니다. 모든 필요한 제약 조건을 추가하고 해당 높이 제약 조건을 >= 40으로 설정했습니다. 컨트롤에는 3 개의 세그먼트가 있습니다. 문제는 서버에서 세그먼트 제목 데이터를 가져 오는 중입니다. 길이는 얼마든지 될 수 있습니다. 세그먼트 제목이 한 줄을 초과하면 텍스트가 잘립니다. 레이블 높이를 기준으로 UISegmentControl 높이를 변경하십시오.

나는 코드 아래에 추가하여이 문제를 해결 : - 제목 길이가 2 개 라인의 경우 그것은 잘 작동

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

. 실제 문제는 제목 길이가 2 줄 이상이고 텍스트가 잘리지 않을 때 시작됩니다. UISegmentControl은 콘텐츠 압축 속성을 확인하여 UILabel처럼 긴 타일을 수용하기 위해 높이를 늘려야합니다. 나는 우선 순위 값을 변경함으로써 contentCompression 저항 속성을 가지고 노려 보았지만 헛된 것이었다. UISegmentControl 큰 텍스트를 수용하기 위해 자동으로 크기가 조정되지 않습니다. 어떤 생각을 어떻게 자동 레이아웃을 사용하여 원하는 동작을 얻을 수 있습니다.

+0

현재 사용되는 방법 대신'UISegmentControl'에'setTitleTextAttributes (_ 속성 : [AnyHashable : Any] ?, 상태 : UIControlState)'를 사용해야한다고 생각합니다. – KrishnaCA

+0

NSParagraphStyleAttributeName을 설정하여 텍스트 속성을 사용했습니다. NSMutableParagraphStyle하지만 여전히 작동하지 않습니다. – IOSCODER

답변

0

나는 스위프트에게만 말하므로이 도움이되기를 바랍니다.

세그먼트 화 된 컨트롤의 높이를 동적으로 조정하려면 여러 가지 작업이 필요합니다. 확장 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) 
    } 

} 

결과 :

enter image description here

당신이 세그먼트 컨트롤이 따라 높이를 업데이트합니다 길이의 문자열로 인스턴스 멤버 "텍스트"의 값을 변경하려면 아래 경우 코드에서

PS 이것은 고정 폭을 원한다고 가정합니다. 당신도 동적 폭을 원한다면 ... 그것은 다른 이야기입니다.

+0

네가 맞을지도 모른다. 나는'UISegemenControl'의 서브 뷰를 반복하고 UISegmentControl의 높이를 조절하기 위해'UILabel'의 높이를 검사하는 것보다 동일한 효과를 얻었습니다. 코멘트에서 언급했듯이, 위의 코드는 나를위한 옵션이 아니기 때문에'AutoLayout'을 통해 그것을하고 싶었습니다. 나는 여전히 내재적 인 크기를 사용하여 원하는 결과를 얻을 수 있다고 생각한다. – IOSCODER