设置 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 高度设置不同的 UITableViewCell 高度?
根据单元格高度在 UITableViewCell 内动态设置 UIImageView 高度
如何在按钮单击时获取 UIImageView 的高度、宽度、X 和 Y 并将其传递给其他 ViewController?
根据 iOS SWIFT 高度更高的 UIImageView 或 UILabel 设置 UITableViewCell 高度