Swift:尽管添加了元素,但 UIStackView 的高度始终为 0
Posted
技术标签:
【中文标题】Swift:尽管添加了元素,但 UIStackView 的高度始终为 0【英文标题】:Swift: UIStackView height is always 0 despite adding elements 【发布时间】:2020-10-28 09:25:24 【问题描述】:我有这个堆栈视图,它包含一个 ImageView: 如果我打印它的高度,我总是得到 0:
print("movieDetailsStackView!.bounds.height: ",movieDetailsStackView!.bounds.height ) // 0
print("movieDetailsStackView!.frame.height: ",movieDetailsStackView!.frame.height ) // 0
这是它的创建方式:
func createMovieDetailsStackView ()
/******************/
// Add movie image
/*****************/
let movieImageViewHeight = 300.00
let movieImageViewWidth = 20.00
movieImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: movieImageViewWidth, height: movieImageViewHeight));
movieImageView!.layer.borderWidth = 10
movieImageView!.layer.borderColor = UIColor.red.cgColor
/******************/
var arrangedSubviews = [UIView]()
arrangedSubviews.append(movieImageView!)
movieDetailsStackView = UIStackView(arrangedSubviews: arrangedSubviews)
movieDetailsStackView!.translatesAutoresizingMaskIntoConstraints = false
movieDetailsStackView!.distribution = .fillProportionally
movieDetailsStackView!.axis = .horizontal
movieDetailsStackView!.spacing = 8
self.view.addSubview(movieDetailsStackView!)
movieDetailsStackView!.topAnchor.constraint(equalTo: self.view.topAnchor, constant:70).isActive = true
movieDetailsStackView!.leftAnchor.constraint(equalTo: self.view.leftAnchor, constant: 0).isActive = true
movieDetailsStackView!.rightAnchor.constraint(equalTo: self.view.rightAnchor, constant: 0).isActive = true
对此有什么解释吗?
【问题讨论】:
您是否也尝试向堆栈视图添加高度约束?一个等于movieImageViewHeight 【参考方案1】:当您将任何视图添加为堆栈视图的arrangedSubview
时,其.translatesAutoresizingMaskIntoConstraints
属性会自动设置为`false。
因此,根据您设置堆栈视图的对齐和分布属性的方式,您可能需要向视图添加宽度和/或高度约束。
您显示的代码中有一些奇怪的设置,例如:
let movieImageViewWidth = 20.00
...您真的希望它只有 20 分宽吗?
movieDetailsStackView!.distribution = .fillProportionally
...几乎可以肯定不是您想要分发的内容。从 .fill
开始,只有在您没有得到想要的结果时才进行更改。
您使用了很多 !
...“强制展开”是导致崩溃的秘诀。
但是,使用您现有的代码,添加以下行:
movieDetailsStackView = UIStackView(arrangedSubviews: arrangedSubviews)
// add this line here
movieImageView?.heightAnchor.constraint(equalToConstant: CGFloat(movieImageViewHeight)).isActive = true
看看你是否得到了你想要的结果。
【讨论】:
以上是关于Swift:尽管添加了元素,但 UIStackView 的高度始终为 0的主要内容,如果未能解决你的问题,请参考以下文章
Swift:扩展 UIStackView 以创建居中的标签列表
尽管桥接头工作正常,但无法在 Swift 中实例化 Obj C 类