Я использую классы 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 полностью применяли класс размера окна, даже если они не находятся в иерархии представлений? Или есть что-то еще, что мне не хватает? Спасибо.
