2016-11-23 3 views
0

У меня есть один UISegmentControl в моем приложении. Я добавил все необходимые ограничения и установил ограничение по высоте как >= 40. Управление имеет 3 сегмента. Проблема в том, что я получаю данные заголовка сегмента с сервера, и это может быть любой длины. Когда заголовок сегмента превышает одну строку, текст усекается.Изменение UISegmentУправление высоты над уровнем этикетки

Я решил эту проблему, добавив ниже код: -

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

Он отлично работает, когда длина название из 2-х линий. Реальная проблема начинается, когда длина заголовка занимает более двух строк, и чем больше текст усекается, в идеале UISegmentControl должен увеличить свою высоту, чтобы разместить более длинную плиту, например, UILabel, проверяя ее свойство сжатия содержимого. Я пробовал играть с contentCompression свойство сопротивления, изменяя значение приоритета, но напрасно. UISegmentControl не изменяет размер автоматически для размещения большего текста. Любая идея, как я могу достичь желаемого поведения с помощью автоматического макета.

+0

Я думаю, что мы должны использовать 'setTitleTextAttributes (_ атрибуты: [AnyHashable: Любые] ?, для государства: UIControlState)' 'для UISegmentControl' вместо метода в настоящее время используется – 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 ограничивающий прямоугольник, который будет содержать вашу строку. Высота этого прямоугольника будет определять высоту сегментарного элемента управления. Вы можете вычислить ограничивающий прямоугольник строки, используя экземпляры 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

PS это предполагает, что вы хотите фиксированную ширину. Если вам нужна динамическая ширина ... это совсем другая история.

+0

Да, возможно, вы правы. Я также добился такого же эффекта, перейдя через subviews 'UISegemenControl' и проверяя высоту' UILabel', чтобы отрегулировать высоту UISegmentControl. Как я упоминал в комментарии, я хотел сделать это через 'AutoLayout', поэтому выше кода для меня не вариант. Я все еще думаю, что используя собственный размер, мы можем достичь желаемого результата. – IOSCODER

 Смежные вопросы

  • Нет связанных вопросов^_^