objective-c ios7 uicollectionview

objective c - IOS UICollectionview cambia dinámicamente la altura de la celda



objective-c ios7 (5)

Por lo que yo entiendo, quiere replicar el diseño de esta prueba.

Debes entender mejor cómo funciona UICollectionView como aquí

Deberá cambiar el número de elementos en su UICollectionView en este método delegado:

- (NSInteger)numberOfItemsInSection:(NSInteger)section;

Aquí, quiere devolver 4 al comienzo de la prueba, luego 4 * 2, 4 * 2 * 2, y así sucesivamente. Esto le dará la cantidad correcta de artículo.

Entonces el diseño. deberías tener múltiples valores para él, ya que no quieres el mismo espacio entre tus elementos como el principio y el final. Me gustaría reducir el espacio a medida que crece la cantidad de elementos.

Debe tener cuidado con el espaciado, ya que puede hacer que una celda sea forzada en la siguiente línea

Ya hiciste un gran trabajo al dividir el marco para obtener el alto y ancho máximo de una celda, pero tu

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath

El método es realmente desordenado.

Como no tendrá un número ilimitado de elementos en su UICollectionView , puede usar una switch statement , y en cada cambio devolverá el CGSize calculado de la celda.

Por ejemplo, puede usarlo así:

switch (numberOfHorizontalItems) { case 2: return CGSizeMake(self.collectionView.frame.size.width/2.5,self.collectionView.frame.size.width/2.5); break; case 4: return CGSizeMake(self.collectionView.frame.size.width/4.5,self.collectionView.frame.size.width/4.5); break; case 8: CGSizeMake(self.collectionView.frame.size.width/8.5,self.collectionView.frame.size.width/8.5); break; (And so on) default: break; }

Debe tener en cuenta que el CGSize calculado aquí debe incorporar el espaciado / fusión entre los items

Tampoco necesita viewWillLayoutSubviews y viewDidLayoutSubviews , solo necesita llamar a [self.collectionView reloadData] cuando el usuario tocó una celda (o en el método que maneja la lógica después de que un usuario tocó una celda)

Finalmente, si no desea que el UICollectionView sea ​​desplazable, simplemente establezca la propiedad self.collectionView.scrollEnabled = NO;

Estoy trabajando en un proyecto basado en la vista de colección en el que Numberofitem se modificará y aumentará de acuerdo con el clic del usuario en Índice particular. todo funciona perfectamente en mi proyecto, pero no puedo establecer el tamaño de la celda según el número de celdas en la vista de colección. Además, la vista de recopilación no se desplazará por todas las celdas, se corregirá con el cambio de tamaño. Aquí he adjuntado todas las imágenes.

1) Vista de guion gráfico

2) Resultado con Four Cell''s

3) cuando el número de células aumenta

Actualmente hice la configuración de mi celular de esta manera con el siguiente código. pero quiero establecer eso, si hay cuatro celdas en la vista de colección, entonces el tamaño de cada celda aumenta y se ajusta de acuerdo con la vista de colección y el tamaño del dispositivo (iphone 5s, iphone 6, iphone 6plus)

Aquí está mi intento,

-(CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section{ return 5.0; } -(CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section{ return 5.0; } - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { ////@property NSInteger count;//// if (_count == 0) { // width = ((width - (span*5))/4); // return CGSizeMake(self.view.frame.size.width/4, self.view.frame.size.height/4); return CGSizeMake(self.view.frame.size.width/2.5, self.view.frame.size.height/5); } if (_count == 1 || _count == 2) { return CGSizeMake(self.view.frame.size.width/2.5, self.view.frame.size.height/5); // return CGSizeMake(100.0, 100.0); } if ( _count == 3 || _count == 4 || _count == 5) { // return CGSizeMake(100.0, 100.0); return CGSizeMake(self.view.frame.size.width/3.5, self.view.frame.size.height/6.5); } if ( _count == 6 || _count == 7 || _count == 8 || _count == 9) { //return CGSizeMake(90.0, 90.0); return CGSizeMake(self.view.frame.size.width/4, self.view.frame.size.height/8); } if ( _count == 10 || _count == 11 || _count == 12 || _count == 13 || _count == 14) { // return CGSizeMake(80.0, 80.0); return CGSizeMake(self.view.frame.size.width/4, self.view.frame.size.height/8); } if ( _count == 15 || _count == 16 || _count == 17 || _count == 18 || _count == 19 || _count ==20) { //return CGSizeMake(70.0, 70.0); return CGSizeMake(self.view.frame.size.width/4.75, self.view.frame.size.height/9.5); } if (_count ==21 || _count == 22 || _count == 23 || _count == 24 || _count == 25 || _count == 26 || _count == 27) { // return CGSizeMake(60.0, 60.0); return CGSizeMake(self.view.frame.size.width/6, self.view.frame.size.height/12); } if (_count ==28 || _count == 29 ) { // return CGSizeMake(50.0, 50.0); return CGSizeMake(self.view.frame.size.width/6.25, self.view.frame.size.height/12.5); } else return CGSizeMake(0, 0); } - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { return itemincollectionview.count; }

Nota: - También probé todo esto Método.

- (void)viewDidLayoutSubviews { self.automaticallyAdjustsScrollViewInsets = NO; [self.collectionView layoutIfNeeded]; NSArray *visibleItems = [self.collectionView indexPathsForVisibleItems]; NSIndexPath *currentItem = [visibleItems objectAtIndex:0]; NSIndexPath *nextItem = [NSIndexPath indexPathForItem:_setRandomIndex inSection:currentItem.section]; [self.collectionView scrollToItemAtIndexPath:nextItem atScrollPosition:UICollectionViewScrollPositionNone animated:YES]; } - (void)viewWillLayoutSubviews { [super viewWillLayoutSubviews]; [self.collectionView.collectionViewLayout invalidateLayout]; } -(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:YES]; [self.view layoutIfNeeded]; }


Use este GitHub CHTCollectionViewWaterfallLayout es una subclase de UICollectionViewLayout, y trata de imitar el uso de UICollectionViewFlowLayout tanto como sea posible.

Este diseño está inspirado en Pinterest. También es compatible con PSTCollectionView.


Así que estoy agregando la respuesta rápidamente, pero esta solución solo funciona suponiendo que tienes un valor de ancho mínimo.

/** Calculates the CollectionView Cell Size when the parent view is loaded. It happens only once per VC Lifecycle. - returns: `width` - The cell width calculated from the current screen size. <p/> `height` - The cell height, which is fixed for now. */ private class func getCellSize() -> (size: CGSize) { var cellWidth: CGFloat, cellHeight: CGFloat //Notes: CellSpacing you want to have let CellSpacing: CGFloat = 5 // Notes: Minimum Cell Width that renders for all the screens let MinCellWidth:CGFloat = 130 let screenWidth: CGFloat = UIScreen.mainScreen().bounds.size.width let numberOfCellsPerRow: Int = Int((screenWidth + CellSpacing) / (MinCellWidth + CellSpacing)) let totalSpaceTaken: Int = (Int(MinCellWidth + CellSpacing) * numberOfCellsPerRow) let remainingWidth = Int(screenWidth + CellSpacing) - totalSpaceTaken cellWidth = MinCellWidth + CGFloat((remainingWidth/numberOfCellsPerRow)) //Now calculate the height based on the Width:Height Ratio. // Assuming it is 1:1.5 cellHeight = cellWidth * 1.5 return CGSizeMake(cellWidth, FixedCellHeight) }

Esto se puede convertir a Objective-C muy fácilmente. Todo lo que estamos haciendo aquí es obtener el ancho de la pantalla y verificar cuántas celdas podemos caber y ajustarlas con el espaciado celular correcto.

Nota: solo necesita llamar al método getCellSize () una vez y puede usar el mismo CGSize en el siguiente método.

//In your viewDidLoad CGSize cellSize = [self getCellSize]; //In this function you pass the property you initialised above - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { return self.cellSize; }

Nota: Esto solo funciona si su collectionView.width = viewController.width , es decir, su ancho de collectionView está abrazado al controlador de vista, o el tamaño de collectionView es igual al tamaño de la pantalla como se formuló en la pregunta.



Todo en su proyecto está bien solo necesita agregar un nuevo método delegado de la siguiente manera:

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section { return UIEdgeInsetsMake(15, 20, 20, 20); }

Varíe las inserciones de este método según el número de cuentas que tenga. la configuración del recuadro será común para:

self.view.frame.size.width/2.5

y diferente para:

self.view.frame.size.width/3.5

por lo tanto, el problema de espacio adicional se resolverá