2017-02-18 48 views
0

我有一个视图其中I创建的UILabel与numberOfLines等于零。我希望根据标签的内容(根据numberOfLines)来调整标签尺寸。不过,我尝试了很多东西,包括所有this,但它仍然不适合我。 AutoLayot使用Neon库。根据线的数量动态调整的UILabel的大小编程

这是我的全部为查看:使用此为实际添加视图

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我实际上一直在使用* Neon *库的'AutoHeight'属性来“自动”调整大小。但是,它只给我一个线路大小。所以,我只是没有太注意我在那里写的东西,因为那是我需要查明的财产。 –

+0

我查了一下,我看到'AutoHeight'。如果没有更多的细节,仍然不确定你的问题的答案,但你应该编辑你的问题,以确切地使用你正在使用的代码。 – Dima

回答

1

我放弃了试图解决这个使用霓虹灯。问题主要在于你试图为你的容器视图定义一个具体的高度,同时试图将其中的元素锚定到彼此及其边缘。我最终使用了使用布局锚点的标准Auto Layout API。然后,您只需指定容器的宽度,并根据其包含的标签的大小自动设置其高度。解决方案如下:

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 
    } 
}