problemas para ocurrio instalar error desinstalar descargar como bateria swift uicollectionview uicollectionviewlayout ios12 uicollectionviewflowlayout

swift - para - UICollectionViewFlowLayout estimadoItemSize no funciona correctamente con iOS12 aunque funciona bien con iOS 11



ios 12 problemas iphone 7 (5)

Para las celdas de altura dinámica de UICollectionView que utilizamos,

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

con la restricción adecuada de altura y anchura, funciona bien con las versiones de iOS 11. *, pero se rompe y no hace que las celdas sean dinámicas para iOS 12.0


Basándome en la respuesta de ale84 y debido al hecho de que necesitaba la solución iOS 12 en varios lugares, creé una extensión UICollectionViewCell que denominé 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]) } }

Y luego, en las celdas de la vista de colección, hacemos algo como esto (si su celda está creada en IB):

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


En mi caso, resolví esto agregando explícitamente las siguientes restricciones al contentView de la celda.

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

Estas restricciones ya existen dentro del xib de la celda, pero de alguna manera no son suficientes para iOS 12.

Los otros subprocesos que sugirieron llamar collectionView.collectionViewLayout.invalidateLayout() en varios lugares no ayudaron en mi situación.

Código de ejemplo aquí: https://github.com/larrylegend/CollectionViewAutoSizingTest

Esto aplica la solución al código de un tutorial en https://medium.com/@wasinwiwongsak/uicollectionview-with-autosizing-cell-using-autolayout-in-ios-9-10-84ab5cdf35a2 :


Logré resolver este problema al poner ese código en mi subclase de UICollectionViewCell

- (UICollectionViewLayoutAttributes *)preferredLayoutAttributesFittingAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes { [self updateConstraintsIfNeeded]; CGSize size = [self systemLayoutSizeFittingSize:CGSizeMake(1000, 1000)]; CGRect alteredRect = layoutAttributes.frame; alteredRect.size = size; layoutAttributes.frame = alteredRect; return layoutAttributes; }

y subclasificando UICollectionView como esto

@interface CustomCollectionView () @property (nonatomic) BOOL shouldInvalidateLayout; @end @implementation CustomCollectionView - (void)layoutSubviews { [super layoutSubviews]; if (self.shouldInvalidateLayout) { [self.collectionViewLayout invalidateLayout]; self.shouldInvalidateLayout = NO; } } - (void)reloadData { self.shouldInvalidateLayout = YES; [super reloadData]; } @end


Objetivo de la versión C de la respuesta anterior:

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

Para los amantes de Objective-C como yo;


Tengo el mismo problema. Usando UILabels para dimensionar la vista de colección. si ejecuto collectionView.collectionViewLayout.invalidateLayout() antes de volver a cargar los datos, hace un buen trabajo de dimensionamiento de las etiquetas.

Todavía no del todo bien. es difícil para mí entenderlo porque lo estoy ejecutando en el simulador frente al dispositivo.