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:尽管我调用了所需的代码,但导航栏却隐藏了?

尽管桥接头工作正常,但无法在 Swift 中实例化 Obj C 类

尽管声明明确,但 Swift 中的 String 值不会改变 [重复]

尽管在类中声明了变量,但无法在范围内找到

尽管宽度相等,但集合视图网格最后一行的显示方式不同 - swift iOS