Я использую классы Auto Layout и size внутри UITableView с ячейками, размер которых зависит от их содержимого. Для этого я использую метод, в котором для каждого типа ячеек вы сохраняете внеэкранный экземпляр этой ячейки и используете systemLayoutSizeFittingSize
для определения правильной высоты строки - этот метод прекрасно объясняется в qaru.site/info/1017/... и в другом месте.
Это отлично работало, пока я не начал использовать классы размера. В частности, я определил разные константы в ограничениях по границам текста в макетах с обычной шириной, поэтому на iPad на iPad больше пробелов. Это дает мне следующие результаты.
Похоже, что новый набор ограничений соблюдается (имеется больше пробелов), но вычисление высоты строки по-прежнему возвращает то же значение, что и для ячейки, которая не применяла ограничения класса для класса. Некоторая часть процесса компоновки в внеэкранной ячейке не учитывает класс размера окна.
Теперь я понял, что, вероятно, из-за того, что внеэкранное представление не имеет супервизора или окна, и, как таковое, оно не имеет признаков класса размера, которые нужно ссылаться в точке вызова systemLayoutSizeFittingSize
(хотя это и кажется используйте скорректированные ограничения для полей). Я теперь обойдусь этим, добавив ячейку выбора размера экрана как подзадачу UIWindow после ее создания, что дает желаемый результат:
Вот что я делаю в коде:
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
let contentItem = content[indexPath.item]
if let contentType = contentItem["type"] {
// Get or create the cached layout cell for this cell type.
if layoutCellCache.indexForKey(contentType) == nil {
if let cellIdentifier = CellIdentifiers[contentType] {
if var cachedLayoutCell = dequeueReusableCellWithIdentifier(cellIdentifier) as? UITableViewCell {
UIApplication.sharedApplication().keyWindow?.addSubview(cachedLayoutCell)
cachedLayoutCell.hidden = true
layoutCellCache[contentType] = cachedLayoutCell
}
}
}
if let cachedLayoutCell = layoutCellCache[contentType] {
// Configure the layout cell with the requested cell content.
configureCell(cachedLayoutCell, withContentItem: contentItem)
// Perform layout on the cached cell and determine best fitting content height.
cachedLayoutCell.bounds = CGRectMake(0.0, 0.0, CGRectGetWidth(tableView.bounds), 0);
cachedLayoutCell.setNeedsLayout()
cachedLayoutCell.layoutIfNeeded()
return cachedLayoutCell.contentView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height
}
}
fatalError("not enough information to determine cell height for item \(indexPath.item).")
return 0
}
Добавление просмотров в окно, которое никогда не должно быть нарисовано, похоже на взломать меня. Есть ли способ, чтобы UIViews полностью применяли класс размера окна, даже если они не находятся в иерархии представлений? Или есть что-то еще, что мне не хватает? Спасибо.