swift - отзывы - ios 12 установить




UICollectionViewFlowLayout оценкаItemSize не работает должным образом с iOS12, хотя он прекрасно работает с iOS 11.* (4)

Для динамических ячеек UICollectionView мы используем,

if let layout = self.collectionViewLayout as? UICollectionViewFlowLayout {
    layout.estimatedItemSize = UICollectionViewFlowLayoutAutomaticSize
}

при правильном ограничении высоты и ширины он отлично работает с версиями iOS 11. *, но он ломается и не делает ячейки динамическими для iOS 12.0


В моем случае я решил эту проблему, явно добавив следующие ограничения в contentView ячейки.

class Cell: UICollectionViewCell {
    // ...

    override func awakeFromNib() {
        super.awakeFromNib()

        // Addresses a separate issue and prevent auto layout warnings due to the temporary width constraint in the xib.
        contentView.translatesAutoresizingMaskIntoConstraints = false

        // Code below is needed to make the self-sizing cell work when building for iOS 12 from Xcode 10.0:
        let leftConstraint = contentView.leftAnchor.constraint(equalTo: leftAnchor)
        let rightConstraint = contentView.rightAnchor.constraint(equalTo: rightAnchor)
        let topConstraint = contentView.topAnchor.constraint(equalTo: topAnchor)
        let bottomConstraint = contentView.bottomAnchor.constraint(equalTo: bottomAnchor)
        NSLayoutConstraint.activate([leftConstraint, rightConstraint, topConstraint, bottomConstraint])
    }
}

Эти ограничения уже существуют внутри xib ячейки, но почему-то их недостаточно для iOS 12.

Другие потоки, которые предлагали вызывать collectionView.collectionViewLayout.invalidateLayout() в разных местах, не помогли в моей ситуации.

Пример кода здесь: https://github.com/larrylegend/CollectionViewAutoSizingTest

Это применяет обходной путь к коду из учебника по https://medium.com/@wasinwiwongsak/uicollectionview-with-autosizing-cell-using-autolayout-in-ios-9-10-84ab5cdf35a2 :


Исходя из ale84 и из-за того, что мне нужно было исправить iOS 12 в нескольких местах, я создал расширение UICollectionViewCell, которое я назвал UICollectionViewCell + iOS12:

extension UICollectionViewCell {
    /// This is a workaround method for self sizing collection view cells which stopped working for iOS 12
    func setupSelfSizingForiOS12(contentView: UIView) {
        contentView.translatesAutoresizingMaskIntoConstraints = false
        let leftConstraint = contentView.leftAnchor.constraint(equalTo: leftAnchor)
        let rightConstraint = contentView.rightAnchor.constraint(equalTo: rightAnchor)
        let topConstraint = contentView.topAnchor.constraint(equalTo: topAnchor)
        let bottomConstraint = contentView.bottomAnchor.constraint(equalTo: bottomAnchor)
        NSLayoutConstraint.activate([leftConstraint, rightConstraint, topConstraint, bottomConstraint])
    }
}

И затем в ячейках просмотра вашей коллекции мы делаем что-то вроде этого (если ваша ячейка создана в IB):

override func awakeFromNib() {
    super.awakeFromNib()
    if #available(iOS 12, *) { setupSelfSizingForiOS12(contentView: contentView) }
}

Цель C версия выше ответ:

-(void)awakeFromNib{
    [super awakeFromNib];

    if (@available(iOS 12.0, *)) {
        // Addresses a separate issue and prevent auto layout warnings due to the temporary width constraint in the xib.
        self.contentView.translatesAutoresizingMaskIntoConstraints = NO;

        // Code below is needed to make the self-sizing cell work when building for iOS 12 from Xcode 10.0:

        NSLayoutConstraint *leftConstraint = [self.contentView.leftAnchor constraintEqualToAnchor:self.leftAnchor constant:0];
        NSLayoutConstraint *rightConstraint = [self.contentView.rightAnchor constraintEqualToAnchor:self.rightAnchor constant:0];
        NSLayoutConstraint *topConstraint = [self.contentView.topAnchor constraintEqualToAnchor:self.topAnchor constant:0];
        NSLayoutConstraint *bottomConstraint = [self.contentView.bottomAnchor constraintEqualToAnchor:self.bottomAnchor constant:0];

        [NSLayoutConstraint activateConstraints:@[leftConstraint, rightConstraint, topConstraint, bottomConstraint]];
    }

}

Для любителей Objective-C, как я;) ура !!!


у меня та же проблема. используя UILabels для определения размера коллекции. если я запускаю collectionView.collectionViewLayout.invalidateLayout() перед перезагрузкой данных, он делает нормальную работу по размеру меток.

все еще не совсем верно. мне сложно понять, потому что я запускаю его на симуляторе против устройства.





uicollectionviewflowlayout