设置 UIImageView 的高度时 AutoLayout 失败

Posted

技术标签:

【中文标题】设置 UIImageView 的高度时 AutoLayout 失败【英文标题】:AutoLayout failing when setting height of UIImageView 【发布时间】:2015-02-12 12:04:13 【问题描述】:

我正在尝试使用约束创建一个带有图像和标签的自动调整大小的 UITableViewCell。当我为图像定义高度时,某些单元格的标签高度设置不正确,这是为什么呢?

下图显示了一个带有标签的单元格,该标签的高度不正确,而另一个标签的高度正确。

我的自定义单元格的代码是:

import UIKit

class NewsItemCell : UITableViewCell 

   var msg: UILabel
   var img: UIImageView!

   required init(coder aDecoder: NSCoder) 

      msg = UILabel()
      msg.numberOfLines = 0
      msg.font = UIFont.preferredFontForTextStyle(UIFontTextStyleBody)
      msg.lineBreakMode = .ByWordWrapping

      img = UIImageView()
      img.contentMode = .ScaleAspectFill
      img.clipsToBounds = true

      super.init(coder: aDecoder)
  

  override func awakeFromNib() 

      super.awakeFromNib()

      addSubview(msg)
      addSubview(img)

      contentView.setTranslatesAutoresizingMaskIntoConstraints(false)
      msg.setTranslatesAutoresizingMaskIntoConstraints(false)
      img.setTranslatesAutoresizingMaskIntoConstraints(false)

      let c0 = NSLayoutConstraint(item: img, attribute: .Top,  relatedBy: .Equal, toItem: self, attribute: .Top, multiplier: 1, constant: 0);
      let c1 = NSLayoutConstraint(item: img, attribute: .Leading,  relatedBy: .Equal, toItem: self, attribute: .Leading, multiplier: 1, constant: 0)
      let c2 = NSLayoutConstraint(item: img, attribute: .Trailing, relatedBy: .Equal, toItem: self, attribute: .Trailing, multiplier: 1, constant: 0)
      let c3 = NSLayoutConstraint(item: msg, attribute: .Top,  relatedBy: .Equal, toItem: img, attribute: .Bottom, multiplier: 1, constant: 5)
      let c4 = NSLayoutConstraint(item: msg, attribute: .Bottom,  relatedBy: .Equal, toItem: self, attribute: .Bottom, multiplier: 1, constant: -5)
      let c5 = NSLayoutConstraint(item: img, attribute: .Height,  relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 120)
      let c6 = NSLayoutConstraint(item: msg, attribute: .Trailing,  relatedBy: .Equal, toItem: self, attribute: .Trailing, multiplier: 1, constant:-5)
      let c7 = NSLayoutConstraint(item: msg, attribute: .Leading,  relatedBy: .Equal, toItem: self, attribute: .Leading, multiplier: 1, constant:5)

      addConstraint(c0)
      addConstraint(c1)
      addConstraint(c2)
      addConstraint(c3)
      addConstraint(c4)
      addConstraint(c5)
      addConstraint(c6)
      addConstraint(c7)
  

  override func setSelected(selected: Bool, animated: Bool) 
      super.setSelected(selected, animated: animated)
  

【问题讨论】:

添加约束后尝试 layoutIfNeed()。 【参考方案1】:

啊!好吧,你看,问是否有一半的解决方案^.^

原来我在错误的委托函数中更新了msg.text 值。我在willDisplayCell 中设置了msg.text,但我必须在cellForRowAtIndexPath 中设置它。

【讨论】:

以上是关于设置 UIImageView 的高度时 AutoLayout 失败的主要内容,如果未能解决你的问题,请参考以下文章

UIImageView 创建额外的宽度/高度约束

如何根据 UIImageView 高度设置不同的 UITableViewCell 高度?

根据单元格高度在 UITableViewCell 内动态设置 UIImageView 高度

动画 UIImageView 高度约束空白

如何在按钮单击时获取 UIImageView 的高度、宽度、X 和 Y 并将其传递给其他 ViewController?

根据 iOS SWIFT 高度更高的 UIImageView 或 UILabel 设置 UITableViewCell 高度