根据线的数量动态调整的UILabel的大小编程
问题描述:
我有一个视图其中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()
答
我放弃了试图解决这个使用霓虹灯。问题主要在于你试图为你的容器视图定义一个具体的高度,同时试图将其中的元素锚定到彼此及其边缘。我最终使用了使用布局锚点的标准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
}
}
我很难理解你究竟在做什么,但是马上就会发现一些肯定是错误的东西。 'height:requirementsLabel.frame.size.height'没有意义,因为该参数是一个常量。你从'sizeToFit'获得的高度不变,所以它不会针对事后的任何其他更改进行调整。 – Dima
@Dima我实际上一直在使用* Neon *库的'AutoHeight'属性来“自动”调整大小。但是,它只给我一个线路大小。所以,我只是没有太注意我在那里写的东西,因为那是我需要查明的财产。 –
我查了一下,我看到'AutoHeight'。如果没有更多的细节,仍然不确定你的问题的答案,但你应该编辑你的问题,以确切地使用你正在使用的代码。 – Dima