【发布时间】:2016-11-22 14:23:16
【问题描述】:
我有一个单元格,该单元格的内容可能与其他单元格不同,(而其他单元格属性相同) - 我认为由 nib 支持的自定义视图在这种情况下会很好用,但我遇到了在高度是动态的单元格中使用自定义视图时出现问题。
故事板:
这是一个带有 UITableView 和自定义 UITableViewCell、MessageTableViewCell 的 UIViewController,实现如下:
class MessageTableViewCell: UITableViewCell {
@IBOutlet weak var avatar: UIImageView!
@IBOutlet weak var initials: UILabel!
@IBOutlet weak var timestamp: UILabel!
@IBOutlet weak var messageView: UIView!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
在视图控制器的 cellForRowAtIndexPath 方法中,我尝试使用来自 messageView 的框架(视图控制器单元格中的白框)来实例化由 xib 支持的 UIView。
自定义视图:
它的实现:
类 MessageView: NibLoadingView {
@IBOutlet weak var message: UILabel!
}
NibLoadingView 实现: (信用:https://stackoverflow.com/a/40051928/4096655)
class NibLoadingView: UIView {
weak var view: UIView!
override init(frame: CGRect) {
super.init(frame: frame)
nibSetup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
nibSetup()
}
private func nibSetup() {
backgroundColor = .clear
view = loadViewFromNib()
view.frame = bounds
view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
view.translatesAutoresizingMaskIntoConstraints = true
addSubview(view)
}
private func loadViewFromNib() -> UIView {
let bundle = Bundle(for: type(of: self))
let nib = UINib(nibName: String(describing: type(of: self)), bundle: bundle)
let nibView = nib.instantiate(withOwner: self, options: nil).first as! UIView
return nibView
}
}
行实现的单元格:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "messageCell") as? MessageTableViewCell else {
return UITableViewCell()
}
let frame = cell.messageView.frame
let messageView = MessageView(frame: frame)
messageView.message.text = messages[indexPath.row]
cell.addSubview(messageView)
return cell
}
结果:
简短的故事是我想在我通常认为的不同单元格之间分享一些共同属性,并尝试为彼此不同的单元格部分创建自定义视图,其中一些具有动态高度.谢谢阅读。
【问题讨论】:
-
再想一想,当我添加这些行时它对我有用:view.frame = bounds view.autoresizingMask = [.flexibleWidth, .flexibleHeight] view.translatesAutoresizingMaskIntoConstraints = true 但请参阅下面的评论用于 UITableViewCell 中的安全区域约束与 contentView 约束
标签: ios swift uitableview interface-builder