La vista de colección de tamaño automático entra en un bucle recursivo en iOS 15.
Tengo una vista de colección de tamaño automático y cuando llamo a super.layoutSubviews mi aplicación se bloquea ya que la vista de colección entra en un bucle de actualización recursivo. Esto funcionaba bien en iOS 14 y anteriores. Pero lo observé en iOS 15 en adelante.
class DynamicCollectionView: UICollectionView {
override var contentSize: CGSize {
didSet {
invalidateIntrinsicContentSize()
}
}
override func layoutSubviews() {
super.layoutSubviews()
if bounds.size != intrinsicContentSize {
invalidateIntrinsicContentSize()
}
}
override var intrinsicContentSize: CGSize {
return contentSize
}
override func reloadData() {
super.reloadData()
invalidateIntrinsicContentSize()
layoutIfNeeded()
}
}
El error dice:
Terminating app due to uncaught exception ‘NSInternalInconsistencyException’, reason: ‘UICollectionView (<kpflagship.selfsizingcollectionview 0x7f896b260e00=””>) se encuentra atrapado en su bucle de actualización/diseño. Esto puede ocurrir por muchas razones, incluyendo vistas de tamaño automático cuyos atributos preferidos no devuelven un tamaño consistente. Para solucionar este problema, revisa la aplicación Console en la categoría “UICollectionViewRecursion” para obtener registros.'</kpflagship.selfsizingcollectionview>
davy.ai
Solución para el problema de bloqueo en iOS 15 en adelante
Este problema de bloqueo se debe a que las vistas de tamaño automático devuelven atributos preferidos inconsistentes. Para resolver este problema, puedes probar las siguientes soluciones:
UIViewPropertyAnimator
para actualizar el diseño:override var intrinsicContentSize: CGSize
e implementar un diseño de tamaño automático:Estas soluciones pueden ayudarte a resolver el problema de bloqueo en iOS 15 en adelante. Puedes probarlas y elegir la que funcione mejor para tu proyecto.