gpt4 book ai didi

ios - UIView子自动边框尺寸

转载 作者:行者123 更新时间:2023-11-29 11:33:15 26 4
gpt4 key购买 nike

我正在尝试将自定义 UIView (LabelIcon) 添加到父 View ,它不应该关心 child 的大小 - 他应该根据 child 的高度(这会有所不同)将它们以全宽堆叠在一起).

目前这是我在 parent 中添加 child 的方式:

    let locationLabel = LabelIcon(frame: .zero, icon: "location", text: "Lane\nlane")
let locationLabel2 = LabelIcon(frame: .zero, icon: "location", text: "Second text line\nLine line line\nAnother line\nsome more line")
content.addSubview(locationLabel)
content.addSubview(locationLabel2)

(我不想在这里手动设置框架 - 应该是自动的)

这些 View 的约束,因此它们至少以某种方式可见(因为我没有设置框架):

    locationLabel.snp.makeConstraints { (make) in
make.top.left.right.equalToSuperview()
make.height.equalTo(40)
}

locationLabel2.snp.makeConstraints { (make) in
make.left.right.equalToSuperview()
make.top.equalTo(locationLabel.snp.bottom)
make.height.equalTo(40)
}

这可行,但对每个元素都这样做会很痛苦。我现在也不知道内部元素的高度。

我想要实现的是不必在父类中定义任何硬编码约束。 subview 应自行决定它的高度。

child 是这样定义的:

class LabelIcon: UIView {

init(frame: CGRect, icon: String, text: String) {
super.init(frame: frame)

self.backgroundColor = UIColor.orange

let iconImageView = UIImageView(image: UIImage(named: icon))
iconImageView.contentMode = UIViewContentMode.scaleAspectFit
self.addSubview(iconImageView)


let label = UILabel()
label.textAlignment = .left
label.numberOfLines = 0
label.text = text
self.addSubview(label)

iconImageView.snp.makeConstraints { (make) in
make.top.equalToSuperview().offset(5)
make.left.equalToSuperview().offset(10)
}

label.snp.makeConstraints { (make) in
make.top.equalToSuperview()
make.left.equalTo(iconImageView.snp.right).offset(20)

}
}

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

我如何以知道父级宽度的方式定义子级,但高度将根据标签大小自动完成?文本将具有动态行数。

在 parent 中会有很多这样的 View ,因此我希望那里的约束尽可能少(不要为每个 LabelIcon 实例手动执行)。

基于这段代码,这是当前状态: enter image description here

我所有的 View 都是通过自动布局以编程方式完成的(使用 SnapKit,没有 Storyboard或 xib)。我想使用 UIStackView,但无论如何 child 必须定义高度才能工作。

编辑:使用这些约束时, View 本身是可见的:

locationLabel.snp.makeConstraints { (make) in
make.top.left.right.equalToSuperview()

}
locationLabel2.snp.makeConstraints { (make) in
make.left.right.equalToSuperview()
make.top.equalTo(locationLabel.snp.bottom)
}

Bu View 相互重叠(标签 2 不在标签下方)。此外, View 的尺寸基本上为 0,0 - 没有橙色背景: enter image description here

来自接受的答案:

标签约束:

label.snp.makeConstraints { (make) in
make.top.equalToSuperview()
make.left.equalTo(iconImageView.snp.right).offset(20)
make.bottom.equalToSuperview().offset(-10)
make.right.equalToSuperview().offset(-10)
}

家长:

locationLabel.snp.makeConstraints { (make) in
make.top.left.equalToSuperview()

}
locationLabel2.snp.makeConstraints { (make) in
make.left.equalToSuperview()
make.top.equalTo(locationLabel.snp.bottom)
}

结果:

enter image description here

最佳答案

View 的内部标签像这样添加底部约束

 make.bottom.equalToSuperview().offset(10)

//

添加右约束

make.right.equalToSuperview().offset(10)

删除任何静态高度

make.height.equalTo(40)

然后 View 应该根据文本调整大小,想法是通过静态值或左&&右值给标签宽度

关于ios - UIView子自动边框尺寸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51514146/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com