2017-02-18 27 views
0

У меня есть View где я создаю UILabel с numberOfLines равным нулю. Я хочу, чтобы размер метки был скорректирован в соответствии с содержимым моей метки (в соответствии с номеромOfLines). Тем не менее, я пробовал много вещей, включая все this, и он по-прежнему не работает для меня. Я использую библиотеку Neon для AutoLayot.Динамически регулировать размер UILabel в соответствии с количеством строк программно

И вот весь мой для View:

import UIKit 
import Neon 

class AdditionalDescriptionView: UIView { 

    lazy var locationLabel = UILabel() 
    lazy var seasonLabel = UILabel() 
    lazy var quantityLabel = UILabel() 
    lazy var durationLabel = UILabel() 
    lazy var requirementsLabel = UILabel() 
    var height: CGFloat = 0 
    var text = NSString() 
    var size = CGSize() 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     setup() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    func setup() { 
     locationLabel.textAlignment = .left 
     locationLabel.text = "Локация: Каркаралинск (200км от Караганды)" 
     locationLabel.textColor = .black 
     locationLabel.font = UIFont.avenirNextRegular(ofSize: 14) 
     locationLabel.numberOfLines = 0 
     seasonLabel.textAlignment = .left 
     seasonLabel.textColor = .black 
     seasonLabel.font = UIFont.avenirNextRegular(ofSize: 14) 
     seasonLabel.text = "Сезоны: все" 
     quantityLabel.textAlignment = .left 
     quantityLabel.textColor = .black 
     quantityLabel.text = "Количество людей: 5-25" 
     quantityLabel.font = UIFont.avenirNextRegular(ofSize: 14) 
     durationLabel.textAlignment = .left 
     durationLabel.textColor = .black 
     durationLabel.text = "Длительность тура: 3 суток" 
     durationLabel.font = UIFont.avenirNextRegular(ofSize: 14) 
     requirementsLabel.textAlignment = .left 
     requirementsLabel.textColor = .black 
     requirementsLabel.text = "Требования: удобная обувь, дополнительный груз не более 3кг, минимум 1л питьевой воды. Лицам с кардио- и дыхательными проблемами не рекомендуется участие в туре." 
     requirementsLabel.font = UIFont.avenirNextRegular(ofSize: 14) 
     requirementsLabel.numberOfLines = 0 
     requirementsLabel.lineBreakMode = .byWordWrapping 
     requirementsLabel.sizeToFit() 

     self.addSubview(locationLabel) 
     self.addSubview(seasonLabel) 
     self.addSubview(quantityLabel) 
     self.addSubview(durationLabel) 
     self.addSubview(requirementsLabel) 

     updateConstraints() 
    } 

    override func updateConstraints() { 
     locationLabel.anchorToEdge(.top, padding: 0, width: self.frame.width, height: AutoHeight) 
     seasonLabel.align(.underCentered, relativeTo: locationLabel, padding: 0, width: self.frame.width, height: AutoHeight) 
     seasonLabel.alignAndFillWidth(align: .underCentered, relativeTo: locationLabel, padding: 0, height: AutoHeight) 
     quantityLabel.alignAndFillWidth(align: .underCentered, relativeTo: seasonLabel, padding: 0, height: AutoHeight) 
     durationLabel.alignAndFillWidth(align: .underCentered, relativeTo: quantityLabel, padding: 0, height: AutoHeight) 
     // fix requirementsLabel height 
     requirementsLabel.alignAndFillWidth(align: .underCentered, relativeTo: durationLabel, padding: 0, height: AutoHeight) 
     height = locationLabel.frame.height+seasonLabel.frame.height+quantityLabel.frame.height+durationLabel.frame.height+requirementsLabel.frame.height 
    } 
} 

использовать это для добавления фактически вида:

self.view.addSubview(additional) 
additional.anchorAndFillEdge(.top, xPad: 0, yPad: 0, otherSize: additional.height) 
additional.updateConstraints() 
+0

Мне сложно понять, что вы на самом деле пытаетесь выполнить, но с места в карьер Я вижу что-то, что определенно неправильно. 'height: requirementsLabel.frame.size.height' не имеет смысла, потому что этот параметр является константой. Вы проходите постоянную высоту, которую вы получили от 'sizeToFit', поэтому после факта она не будет корректироваться ни на какие другие изменения. – Dima

+0

@Dima Я фактически использовал свойство 'AutoHeight' библиотеки * Neon *, которая« должна »автоматически настраивать размер. Однако он дает мне только один размер строки. Итак, я просто не уделял так много внимания тому, что я пишу там, потому что это свойство, которое мне нужно выяснить. –

+0

Я посмотрел, и я вижу 'AutoHeight'. Все еще не уверен в ответе на ваш вопрос без каких-либо дополнительных подробностей, но вы должны отредактировать свой вопрос, чтобы иметь именно тот код, который вы используете. – Dima

ответ

1

Я отказался от попыток решить это с помощью неона. Проблема заключалась в том, что вы пытались определить конкретную высоту для вашего вида контейнера и в то же время пытались привязать элементы внутри нее друг к другу и к своим полям. Я закончил тем, что использовал стандартный API Auto Layout, используя привязки компоновки. Затем все, что вам нужно сделать, это указать ширину вашего контейнера, и его высота будет автоматически настроена на основе размера содержащихся в нем ярлыков. Раствор выглядит следующим образом:

import UIKit 

class AdditionalDescriptionView: UIView { 

    lazy var locationLabel = UILabel() 
    lazy var seasonLabel = UILabel() 
    lazy var quantityLabel = UILabel() 
    lazy var durationLabel = UILabel() 
    lazy var requirementsLabel = UILabel() 
    var text = NSString() 
    var size = CGSize() 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     setup() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    func setup() { 
     self.translatesAutoresizingMaskIntoConstraints = false 
     backgroundColor = UIColor.blue 
     locationLabel.textAlignment = .left 
     locationLabel.text = "Локация: Каркаралинск (200км от Караганды)" 
     locationLabel.textColor = .black 
     locationLabel.font = UIFont.avenirNextRegular(ofSize: 14) 
     locationLabel.numberOfLines = 0 
     seasonLabel.textAlignment = .left 
     seasonLabel.textColor = .black 
     seasonLabel.font = UIFont.avenirNextRegular(ofSize: 14) 
     seasonLabel.text = "Сезоны: все" 
     quantityLabel.textAlignment = .left 
     quantityLabel.textColor = .black 
     quantityLabel.text = "Количество людей: 5-25" 
     quantityLabel.font = UIFont.avenirNextRegular(ofSize: 14) 
     durationLabel.textAlignment = .left 
     durationLabel.textColor = .black 
     durationLabel.text = "Длительность тура: 3 суток" 
     durationLabel.font = UIFont.avenirNextRegular(ofSize: 14) 
     requirementsLabel.textAlignment = .left 
     requirementsLabel.textColor = .black 
     requirementsLabel.text = "Требования: удобная обувь, дополнительный груз не более 3кг, минимум 1л питьевой воды. Лицам с кардио- и дыхательными проблемами не рекомендуется участие в туре." 
     requirementsLabel.font = UIFont.avenirNextRegular(ofSize: 14) 
     requirementsLabel.numberOfLines = 0 
     requirementsLabel.lineBreakMode = .byWordWrapping 

     self.addSubview(locationLabel) 
     locationLabel.translatesAutoresizingMaskIntoConstraints = false 
     self.addSubview(seasonLabel) 
     seasonLabel.translatesAutoresizingMaskIntoConstraints = false 
     self.addSubview(quantityLabel) 
     quantityLabel.translatesAutoresizingMaskIntoConstraints = false 
     self.addSubview(durationLabel) 
     durationLabel.translatesAutoresizingMaskIntoConstraints = false 
     self.addSubview(requirementsLabel) 
     requirementsLabel.translatesAutoresizingMaskIntoConstraints = false 

     locationLabel.topAnchor.constraint(equalTo: self.topAnchor).isActive = true 
     seasonLabel.topAnchor.constraint(equalTo: locationLabel.bottomAnchor).isActive = true 
     quantityLabel.topAnchor.constraint(equalTo: seasonLabel.bottomAnchor).isActive = true 
     durationLabel.topAnchor.constraint(equalTo: quantityLabel.bottomAnchor).isActive = true 
     requirementsLabel.topAnchor.constraint(equalTo: durationLabel.bottomAnchor).isActive = true 
     requirementsLabel.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true 

     locationLabel.widthAnchor.constraint(equalTo: self.widthAnchor).isActive = true 
     seasonLabel.widthAnchor.constraint(equalTo: self.widthAnchor).isActive = true 
     quantityLabel.widthAnchor.constraint(equalTo: self.widthAnchor).isActive = true 
     durationLabel.widthAnchor.constraint(equalTo: self.widthAnchor).isActive = true 
     requirementsLabel.widthAnchor.constraint(equalTo: self.widthAnchor).isActive = true 

     locationLabel.leftAnchor.constraint(equalTo: self.leftAnchor).isActive = true 
     seasonLabel.leftAnchor.constraint(equalTo: self.leftAnchor).isActive = true 
     quantityLabel.leftAnchor.constraint(equalTo: self.leftAnchor).isActive = true 
     durationLabel.leftAnchor.constraint(equalTo: self.leftAnchor).isActive = true 
     requirementsLabel.leftAnchor.constraint(equalTo: self.leftAnchor).isActive = true 
    } 
} 


class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     let additional = AdditionalDescriptionView() 
     self.view.addSubview(additional) 
     additional.widthAnchor.constraint(equalTo: self.view.widthAnchor).isActive = true 
     additional.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true 
    } 
}