it-swarm.com.de

UICollectionViewFlowLayout EstimatedItemSize funktioniert mit iOS12 nicht ordnungsgemäß, obwohl es mit iOS 11 problemlos funktioniert.

Für die dynamischen Höhenzellen von UICollectionView verwenden wir

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

mit der richtigen Einschränkung für Höhe und Breite funktioniert es problemlos mit iOS 11. * -Versionen, bricht jedoch und macht die Zellen für iOS 12.0 nicht dynamisch 

25
Aman Gupta

In meinem Fall habe ich dies gelöst, indem ich der contentView der Zelle die folgenden Einschränkungen explizit hinzufügte.

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])
    }
}

Diese Einschränkungen sind bereits im Xib der Zelle vorhanden, aber für iOS 12 reichen sie nicht aus.

Die anderen Threads, die den Aufruf von collectionView.collectionViewLayout.invalidateLayout() an verschiedenen Stellen nahelegten, halfen in meiner Situation nicht. 

Beispielcode hier: https://github.com/larrylegend/CollectionViewAutoSizingTest

Dies betrifft die Problemumgehung für Code aus einem Tutorial von https://medium.com/@wasinwiwongsak/uicollectionview-with-autosizing-cell-using-autolayout-in-ios-9-10-84ab5cdf35a2

53
ale84

Basierend auf der Antwort von ale84 und aufgrund der Tatsache, dass ich das iOS 12-Update an mehreren Stellen brauchte, habe ich eine UICollectionViewCell-Erweiterung erstellt, die ich UICollectionViewCell + iOS12 nannte:

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])
    }
}

Und in Ihrer Sammlungsansichtszelle machen wir so etwas (wenn Ihre Zelle in IB erstellt wird):

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

Ziel-C-Version der obigen Antwort:

-(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]];
    }

}

Für Objective-C Liebhaber wie ich;) Prost !!!

0
Harish Pathak