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.
-
primer conjunto de restricciones de altura para
UICollectionView
-
aquí
calendarBaseViewHeight
esUICollectionView
height Variable -
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
paraintrinsicContentSize
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:
- Agregue una restricción de altura a su vista de colección.
- Establezca su prioridad en 999.
- Establezca su constante en cualquier valor que lo haga razonablemente visible en el guión gráfico.
- Cambie la restricción de igualdad inferior de la vista de colección a mayor o igual.
- Conecte la restricción de altura a una toma de corriente.
- 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.