Система UICollectionViewCellLayoutSizeFittingSize возвращает неправильную ширину

Я играл с динамическим UICollectionViewCell и заметил, что на iOS 8, вызывающем cell.contentView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize) на UICollectionViewCell, возвращается некорректная ширина. В настоящее время единственным обходным решением, которое обращается к этому, является явное добавление ограничения ширины, чтобы заставить ширину ячейки. Код ниже используется в подклассе Cell:

func calculatePreferredHeightForFrame(frame: CGRect) -> CGFloat {
    var newFrame = frame
    self.frame = newFrame
    let widthConstraint = NSLayoutConstraint(item: contentView, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: CGRectGetWidth(frame))
    contentView.addConstraint(widthConstraint)
    self.setNeedsUpdateConstraints()
    self.updateConstraintsIfNeeded()
    self.setNeedsLayout()
    self.layoutIfNeeded()
    let desiredHeight: CGFloat = self.contentView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height
    newFrame.size.height = CGFloat(ceilf(Float(desiredHeight)))
    contentView.removeConstraint(widthConstraint)
    return CGRectGetHeight(newFrame)
}

Я знаю, что с iOS 8 и динамическим UICollectionViewFlowLayout UICollectionViewCell contentView обрабатывает ограничения по-разному, но есть ли что-то, что я здесь отсутствует? Что нужно сделать, чтобы обеспечить, чтобы systemLayoutSizeFittingSize использовал определенную ширину в ячейке?

Я также столкнулся с этим сообщением (Указание одного измерения ячеек в UICollectionView с использованием автоматической компоновки) и полагайте, что это может фактически аннулировать мой вопрос. Возможно, UICollectionViewFlowLayout не предназначен для ячеек с одним динамическим измерением, но это все еще не объясняет, почему ячейка дает необычную ширину.

Ответы

Ответ 1

Я столкнулся с такой же проблемой. Ключ использует приоритеты при получении systemLayoutSize.

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
    if (!self.prototypeCell) {
        self.prototypeCell = [TrainingMenuCell new];
        self.prototypeCell.contentView.translatesAutoresizingMaskIntoConstraints = NO;
    }

    [self configureCell:self.prototypeCell forIndexPath:indexPath];
    [self.prototypeCell setNeedsLayout];
    [self.prototypeCell layoutIfNeeded];

    CGFloat width = CGRectGetWidth(collectionView.frame) - 12;
    CGSize fittingSize = UILayoutFittingCompressedSize;
    fittingSize.width = width;

    CGSize size = [self.prototypeCell.contentView systemLayoutSizeFittingSize:fittingSize withHorizontalFittingPriority:UILayoutPriorityRequired verticalFittingPriority:UILayoutPriorityDefaultLow];
    return size;
}