У меня есть UIView, который можно повторно использовать через файл nib/xib. Я хочу загрузить это и заполнить UITableViewCell, который должен использоваться в саморазрушающемся UITableView. Все с автоматической компоновкой.Nib-файл загружен UIView в UITableViewCell не растягивается
Большинство работает хорошо, но похоже, что загруженный UIView использует добавленные ограничения вокруг него, чтобы уменьшить содержимое contentView UITableViewCell. Это хорошо для высоты, но я не хочу этого для ширины.
Игнорировать серая ячейка ниже, это только выбранная ячейка.
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
let cellId = "RowView0002"
var cell = tableView.dequeueReusableCell(withIdentifier: cellId)
if cell == nil {
cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: cellId)
let subView = RowView(frame: cell!.frame)
cell!.contentView.attachViewWithConstraints(subView)
let _ = subView.viewLoadedFromNibAttached(name: cellId)
}
return cell!
}
override public func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
tableView.estimatedRowHeight = 40.0
tableView.rowHeight = UITableViewAutomaticDimension
}
extension UIView
{
public func attachViewWithConstraints(_ view:UIView)
{
addSubview(view)
view.translatesAutoresizingMaskIntoConstraints = false
view.layoutAttachAll(to: self)
}
@discardableResult
public func viewLoadedFromNibAttached<T : UIView>(name:String) -> T? {
guard let view = Bundle.main.loadNibNamed(name, owner: self, options: nil)?[0] as? T else {
return nil
}
attachViewWithConstraints(view)
return view
}
public func layoutAttachAll(to childView:UIView)
{
var constraints = [NSLayoutConstraint]()
childView.translatesAutoresizingMaskIntoConstraints = false
constraints.append(NSLayoutConstraint(item: childView, attribute: .left, relatedBy: .equal, toItem: self, attribute: .left, multiplier: 1.0, constant: 0))
constraints.append(NSLayoutConstraint(item: childView, attribute: .right, relatedBy: .equal, toItem: self, attribute: .right, multiplier: 1.0, constant: 0))
constraints.append(NSLayoutConstraint(item: childView, attribute: .top, relatedBy: .equal, toItem: self, attribute: .top, multiplier: 1.0, constant: 0))
constraints.append(NSLayoutConstraint(item: childView, attribute: .bottom, relatedBy: .equal, toItem: self, attribute: .bottom, multiplier: 1.0, constant: 0))
childView.addConstraints(constraints)
}
В RowView0002.xib я установить фон rootviews красный, добавил UILabel с 4 ограничениями на это стороны с некоторым запасом, как вы можете видеть. Я попытался установить rootView в класс RowView, а также в качестве владельца файла. Оба «работают».
Любая идея, как получить contentView в соответствии с UITableView?
* Редактировать 1: Зеленый - это фон UILabel. Красный - фон файла nib. После запуска приложения представление выглядит следующим образом: UITableViewCell> ContentView> RowView> NibFileView (красный)> UILabel (зеленый)
Проверка иерархии представлений показывает, что все ограничения настроены так, как ожидалось. Однако UITableViewContentView имеет ограничение, которые соответствуют общему размеру видел (неправильный):
self.width = 156.5 @ 1000
Почему разделительная линия ТВЦ находятся на разной высоте, чем в конце ваших взглядов? Кажется, что высота, занимаемая вашим видом, в три раза превышает высоту ячейки. Вы уверены, что это не перекрытие? попробуйте проверить размеры с помощью отладочного устройства просмотра. – Andrea
Игнорируйте таблицу влево. Это еще один UITableView. – Sunkas
Есть некоторые вещи, которые я не понимаю, зеленый цвет вашего взгляда от xib? красный контент TVView? – Andrea