guide developer create code apple ios objective-c swift autolayout

developer - layout constraints ios



¿Cómo ajustar la altura de UICollectionView para que sea la altura del tamaño del contenido de UICollectionView? (11)

1) Establezca la altura de fijación de su CollectionView.

2) Crear salida de esta constante de altura de vista de colección. Me gusta :

IBOutlet NSLayoutConstraint * constHeight;

3) Agregue el siguiente método en su archivo .m:

- (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; CGFloat height = collectionMenu.collectionViewLayout.collectionViewContentSize.height; constHeight.constant = height; }

Me gustaría que UICollectionView (el rojo) se reduzca a la altura del tamaño del contenido en este caso UICollectionViewCells (los amarillos) porque hay mucho espacio vacío. Lo que probé es usar:

override func layoutSubviews() { super.layoutSubviews() if !__CGSizeEqualToSize(bounds.size, self.intrinsicContentSize) { self.invalidateIntrinsicContentSize() } } override var intrinsicContentSize: CGSize { return self.collection.contentSize }

pero return self.collection.contentSize siempre devuelve (ancho, 0) y por esta razón se reduce demasiado al valor de la altura 30 (El valor que configuré en el archivo XIB para la altura, aunque tengo constaint> = 30).


Debe establecer la restricción de altura como igual al tamaño del contenido

HeightConstraint.constant = collection.contentSize.height


En Swift 5 y Xcode 10.2.1

1) Corregir la altura de CollectionView

2) Crear salida de su CollectionView

IBOutlet weak var myCollectionViewHeight: NSLayoutConstraint!

3) Use el siguiente código

override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() let height = myCollectionView.collectionViewLayout.collectionViewContentSize.height myCollectionViewHeight.constant = height self.view.layoutIfNeeded() }


En su UICollectionView establezca sus restricciones, como Trailing , Leading y Bottom :

Si miras mi restricción de altura con más detalle, ya que es solo para el aspecto del guión gráfico para que no obtenga errores, tengo que Remove at build time . La restricción de altura real se establece en mi código a continuación.

Mi código para DrawerCollectionView , que se establece como la vista de colección Custom Class :

import UIKit class DrawerCollectionView: UICollectionView { override func didMoveToSuperview() { super.didMoveToSuperview() heightAnchor.constraint(equalToConstant: contentSize.height).isActive = true } }


Haz lo siguiente.

  1. primer conjunto de restricciones de altura para UICollectionView
  2. aquí calendarBaseViewHeight es UICollectionView height Variable
  3. llamar a la función después de volver a cargar la vista de colección

    func resizeCollectionViewSize(){ calendarBaseViewHeight.constant = collectionView.contentSize.height }


Obtenga la altura de la celda. Algo como esto

let cellHeight = cell.frame.height

Obtener el origen de la vista de colección

let cvOrigin = collectionView.frame.origin

Obtenga el ancho de la vista de colección

let cvWidth = collectionView.bounds.width

Establecer el marco de la vista de contenido

collection.frame = CGRect(x: cvOrigin.x, y: cvOrigin.y, width: cvWidth, height: cellHeight )


Terminé subclasificando UICollectionView y anulando algunos métodos de la siguiente manera.

  • Devolver self.collectionViewLayout.collectionViewContentSize para intrinsicContentSize se asegura de tener siempre el tamaño correcto
  • Luego solo llámalo cada vez que pueda cambiar (como en reloadData )

Código:

override func reloadData() { super.reloadData() self.invalidateIntrinsicContentSize() } override var intrinsicContentSize: CGSize { return self.collectionViewLayout.collectionViewContentSize }

Pero tenga en cuenta que pierde "reutilización de celdas" si muestra grandes conjuntos de datos, aunque no quepan en la pantalla.


Tomó la solución con d4Rk, que es genial, excepto que en mi caso seguiría cortando la parte inferior de mi vista de colección (demasiado corta). Me di cuenta de que esto se debía a que el tamaño del contenido intrínseco era a veces 0 y esto anularía los cálculos. NO SÉ. Todo lo que sé es que esto lo solucionó.

import UIKit class SelfSizedCollectionView: UICollectionView { override func reloadData() { super.reloadData() self.invalidateIntrinsicContentSize() } override var intrinsicContentSize: CGSize { let s = self.collectionViewLayout.collectionViewContentSize return CGSize(width: max(s.width, 1), height: max(s.height,1)) } }


en primer lugar, calcule el número de celdas que multiplique por la altura de la celda y luego devuelva la altura en este método

collectionView.frame = CGRectMake (x,y,w,collectionView.collectionViewLayout.collectionViewContentSize.height); //objective c //[collectionView reloadData]; collectionView.frame = CGRect(x: 0, y: 0, width: width, height: collectionView.collectionViewLayout.collectionViewContentSize.height) // swift


trabaja para mi

let heightRes = resCollectionView.collectionViewLayout.collectionViewContentSize.height foodHeightConstrant.constant = height.advanced(by: 1 ) foodCollectionView.setNeedsLayout() foodCollectionView.layoutIfNeeded()


Sugeriría lo siguiente:

  1. Agregue una restricción de altura a su vista de colección.
  2. Establezca su prioridad en 999.
  3. Establezca su constante en cualquier valor que lo haga razonablemente visible en el guión gráfico.
  4. Cambie la restricción de igualdad inferior de la vista de colección a mayor o igual.
  5. Conecte la restricción de altura a una toma de corriente.
  6. Cada vez que vuelva a cargar los datos en la vista de recopilación, haga lo siguiente:

Código de muestra:

CGFloat height = myCollectionView.collectionViewLayout.collectionViewContentSize.height heightConstraint.constant = height self.view.setNeedsLayout() Or self.view.layoutIfNeeded()

Explicación: Extra, no tiene que leer si lo entiende. ¡¡obviamente!!

La interfaz de usuario intentará reflejar todas las restricciones, sin importar cuáles sean sus prioridades. Dado que la restricción de altura tiene menor prioridad de (999) , y una restricción inferior de tipo mayor o igual. siempre que la constante de restricción de altura se establezca en un valor menor que la altura de la vista principal, la vista de colección será igual a la altura dada, logrando ambas restricciones.

Pero, cuando la constante de restricción de altura se establece en un valor mayor que la altura de la vista principal, ambas restricciones no se pueden lograr. Por lo tanto, solo se logrará la restricción con la prioridad más alta, que es la restricción inferior mayor o igual.

Lo siguiente es solo una suposición de una experiencia. Entonces, logra una restricción. Pero también trata de hacer que el error en la IU resultante para la otra restricción de menor prioridad no alcanzada sea lo más bajo posible . Por lo tanto, la altura de la vista de colección será igual al tamaño de la vista principal.