我有一个xib包含stackview叫newContainerView...当我尝试向它添加自定义视图时stackview使用addArrangedSubview它们相互堆积在一起,而不是像预期的那样垂直堆叠。因此,我用完全相同的代码创建了一个简单的测试项目,它运行得非常完美。我增加了高度和宽度约束,更改了translatesAutoresizingMaskIntoConstraints并比较这两个项目之间的每个设置。十次。
唯一的区别是,在实际项目中,容器视图被添加到UIViews...在示例项目中,只显示视图。但我看不出这会有什么不同的行为。
有人能解释一下为什么这段代码不起作用吗?
enter image description here
func makePhotoSheet(quote: Quote) {
let newContainerView = ContainerView(frame: CGRect(x: 0, y: 0, width: 612, height: 792))
//In the sample project, this replaces the line above
let newContainerView = ContainerView(frame: view.bounds)
view.addSubview(newContainerView)
//End sample project code
let testView1 = TestView()
let testView2 = TestView()
testView1.photo.image = UIImage(named: "bird")
testView1.photoCaption.text = "Bird"
testView1.heightAnchor.constraint(equalToConstant: 200).isActive = true
testView1.widthAnchor.constraint(equalToConstant: 1).isActive = true
testView1.translatesAutoresizingMaskIntoConstraints = false
testView2.photo.image = UIImage(named: "heart")
testView2.photoCaption.text = "Heart"
testView2.heightAnchor.constraint(equalToConstant: 200).isActive = true
testView2.widthAnchor.constraint(equalToConstant: 1).isActive = true
testView2.translatesAutoresizingMaskIntoConstraints = false
containerView.photoViewStackView.addArrangedSubview(testView1)
containerView.photoViewStackView.addArrangedSubview(testView2)
pdfPages.append(containerView)
}
这是自定义视图的XIB类,后面跟着XIB
class PhotoView: UIView {
@IBOutlet var contentView: UIView!
@IBOutlet weak var photo: UIImageView!
@IBOutlet weak var photoCaption: UITextView!
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
}
func setup() {
Bundle.main.loadNibNamed("PhotoView", owner: self, options: nil)
contentView.frame = self.bounds
addSubview(contentView)
}
}
这是容器视图的XIB类。
class PhotoSheet: UIView {
@IBOutlet var contentView: UIView!
@IBOutlet weak var photoViewStackView: UIStackView!
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
}
func setup() {
Bundle.main.loadNibNamed("PhotoSheet", owner: self, options: nil)
contentView.frame = self.bounds
addSubview(contentView)
}
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
从你的描述来看,问题可能出在约束冲突或者视图层级结构的设置上。UIStackView 的行为应该是自动管理其子视图的布局,使其垂直或水平堆叠,但当外部约束与 StackView 内部的布局逻辑冲突时,可能会导致你遇到的问题。
以下是一些排查和解决此问题的建议:
检查约束是否冲突:
ContainerView
中没有其他约束与 StackView 或其子视图的约束产生冲突。例如,如果 photoViewStackView
本身或者其父视图(contentView
)上有直接定义高度或宽度的约束,这可能与 StackView 的自动布局逻辑相矛盾。testView1
和 testView2
设置了固定高度和宽度,这是正确的,但要确认这些约束没有被其他未知约束覆盖或抵消。TranslatesAutoresizingMaskIntoConstraints 属性:
translatesAutoresizingMaskIntoConstraints = false
在 testView1
和 testView2
上,这是正确的做法,因为 StackView 会自动管理子视图的布局,不需要它们有自动转换的约束。请确保 ContainerView
和其内部的 contentView
以及 photoViewStackView
的 translatesAutoresizingMaskIntoConstraints
也根据需要正确设置。通常,如果你通过代码或 Interface Builder 手动添加了约束,应将此属性设为 false
。视图层级和加载 XIB:
PhotoSheet
和 PhotoView
的 setup
方法中手动添加了从 XIB 加载的 contentView
,确保这个过程没有导致额外的视图层级或约束混乱。contentView
在其父视图中的约束,以及 photoViewStackView
在 contentView
中的约束。调试视图层次和约束:
测试不同的初始化方法:
newContainerView
,比如直接用 Bundle.main.loadNibNamed
而不是先创建一个默认 frame 的实例,看看是否有所改变。检查父视图约束:
newContainerView
在其父视图中的约束是正确的,尤其是高度和宽度约束,或者确保它能够自由扩展以适应 StackView 的内容。综上所述,问题很可能是由约束不一致或视图层级设置不当引起的。逐一排查上述方面,应该能帮助你定位并解决问题。