我正在尝试使用snapKit在swift中使用自动调整大小UITableView
单元格! UITableView
上设置的相关标志如下:
self.rowHeight = UITableViewAutomaticDimension
self.estimatedRowHeight = 70.0
我在customUITableviewCell类中定义了一个UITextField,如:
var uidTextField: UITextField = UITextField()
我的自定义UITableViewCell
中文本字段的初始设置如下所示:
self.contentView.addSubview(uidTextField)
uidTextField.attributedPlaceholder = NSAttributedString(string: "Woo Hoo", attributes: [NSForegroundColorAttributeName:UIColor.lightGrayColor()])
uidTextField.textAlignment = NSTextAlignment.Left
uidTextField.font = UIFont.systemFontOfSize(19)
uidTextField.returnKeyType = UIReturnKeyType.Done
uidTextField.autocorrectionType = UITextAutocorrectionType.No
uidTextField.delegate = self
uidTextField.addTarget(self, action: "uidFieldChanged", forControlEvents: UIControlEvents.EditingChanged)
uidTextField.snp_makeConstraints { make in
make.left.equalTo(self.contentView).offset(10)
make.right.equalTo(self.contentView)
make.top.equalTo(self.contentView).offset(10)
make.bottom.equalTo(self.contentView).offset(10)
}
当我运行代码时,它显示为切断并在控制台中显示错误:
仅警告一次:检测到模糊限制的情况 建议tableview单元格的内容视图的高度为零。我们 考虑到无意识的崩溃和使用标准高度 代替。
我的autoLayout约束是否有问题,或者这是UIControls和UITableView
单元格自动调整的问题?
答案 0 :(得分:2)
在SnapKit(和Masonry)中,您必须使用负值在视图的右侧或底部添加填充。您在offset(10)
约束上使用了bottom
,这会导致文本字段底部10pt被切断的效果。
要解决这个问题,你必须给你的底部约束一个负偏移:
uidTextField.snp_makeConstraints { make in
make.left.equalTo(self.contentView).offset(10)
make.right.equalTo(self.contentView)
make.top.equalTo(self.contentView).offset(10)
make.bottom.equalTo(self.contentView).offset(-10)
}
或者你可以通过这样做得到相同的约束:
uidTextField.snp_makeConstraints { make in
make.edges.equalTo(contentView).inset(UIEdgeInsetsMake(10, 10, 10, 0))
}
当您使用inset()
方式时,必须使用正值和底部插值的正值。
我不明白为什么SnapKit使用底部和右侧的负值。我认为这是违反直觉的,有点令人困惑。
编辑:这是一个很好的例子(我使用包含UITextField
的3个自定义单元格对一个tableView进行了硬编码):
<强>的ViewController:强>
import UIKit
import SnapKit
class ViewController: UIViewController {
let tableView = UITableView()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(tableView)
tableView.dataSource = self
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 70
tableView.registerClass(CustomTableViewCell.self, forCellReuseIdentifier: "CustomCell")
tableView.snp_makeConstraints { (make) -> Void in
make.edges.equalTo(view)
}
}
}
extension ViewController: UITableViewDataSource {
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 3
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("CustomCell", forIndexPath: indexPath)
return cell
}
}
<强> CustomTableViewCell 强>:
import UIKit
class CustomTableViewCell: UITableViewCell {
let textField = UITextField()
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
textField.attributedPlaceholder = NSAttributedString(string: "Woo Hoo", attributes: [NSForegroundColorAttributeName:UIColor.lightGrayColor()])
textField.textAlignment = NSTextAlignment.Left
textField.font = UIFont.systemFontOfSize(19)
textField.returnKeyType = UIReturnKeyType.Done
textField.autocorrectionType = UITextAutocorrectionType.No
contentView.addSubview(textField)
textField.snp_makeConstraints { (make) -> Void in
make.edges.equalTo(contentView).inset(UIEdgeInsetsMake(10, 10, 10, 0))
}
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}