collectionViewLayout sizeForItemAtIndexPath -> CGSize Extraño comportamiento

Por lo tanto, es interesante que estoy tratando de utilizar collectionViewLayout sizeForItemAtIndexPath para mostrar solo un elemento a la vez en collectionView y desplazarme horizontalmente. He intentado esto:

 - (void)viewDidLoad { [super viewDidLoad]; flowLayout = [[UICollectionViewFlowLayout alloc]init]; flowLayout.scrollDirection = UICollectionViewScrollDirectionHorizontal; flowLayout.minimumInteritemSpacing = 0.0; flowLayout.minimumLineSpacing = 0.0; _obj_CollectionView.pagingEnabled = YES; _obj_CollectionView.collectionViewLayout = flowLayout; self.obj_CollectionView.delegate = self; self.obj_CollectionView.dataSource = self; _obj_CollectionView.backgroundColor = [UIColor networkingColor]; } -(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { return CGSizeMake(collectionView.frame.size.width, collectionView.frame.size.height); } 

Aquí está la captura de pantalla de screenshotView:

introduzca la descripción de la imagen aquí

Aquí el color púrpura es mi celda y el color rojo es mi collectionView pero quiero color púrpura en su totalidad.

así que por favor guíame. Estoy confundido. 🙂

Prueba esto:

 func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAtIndex section: Int) -> CGFloat { return 1.0 } func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAtIndex section: Int) -> CGFloat { return 1.0 } 

ViewDidload:

 layout.minimumInteritemSpacing = 20 layout.minimumLineSpacing = 10 

CellforrowAtIndexPath:

 cell.image.clipsToBounds = true cell.contentView.frame = cell.bounds 

En primer lugar, no es necesario crear un object de UICollectionViewFlowLayout progtwigción. Tampoco es necesario el código escrito en viewDidLoad() . Todo esto se puede hacer con el storyboard y los methods de delegate .

A continuación se muestra el código de su problema:

 import UIKit class ViewController: UIViewController { @IBOutlet weak var collectionView: UICollectionView! override func viewDidLoad() { super.viewDidLoad() } } extension ViewController : UICollectionViewDataSource { func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return 10 } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) cell.backgroundColor = (indexPath.item % 2 == 0) ? UIColor.purple : UIColor.blue return cell } } extension ViewController : UICollectionViewDelegateFlowLayout { func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return CGSize(width: collectionView.bounds.width, height: collectionView.bounds.height) } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat { return 0 } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { return UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0) } } 

Storyboard screenshot:

introduzca la descripción de la imagen aquí

Pantalla de salida:

introduzca la descripción de la imagen aquí

Hice una pequeña testing de concepto y funciona como esperaba para mí. Tal vez algo está mal con su CollectionViewCell (Restricciones erróneas / faltantes)?

 import UIKit class CollectionViewController: UICollectionViewController { let layout = UICollectionViewFlowLayout() override func viewDidLoad() { super.viewDidLoad() layout.scrollDirection = .horizontal layout.minimumInteritemSpacing = 0 layout.minimumLineSpacing = 0 collectionView?.collectionViewLayout = layout collectionView?.isPagingEnabled = true } override func numberOfSections(in collectionView: UICollectionView) -> Int { return 1 } override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return 10 } override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) cell.backgroundColor = (indexPath.item % 2 == 0) ? UIColor.purple : UIColor.blue return cell } } extension CollectionViewController: UICollectionViewDelegateFlowLayout { func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return self.view.frame.size } } 

Tienes algunas opciones de debugging para comprobar cuál es el motivo:

  • NSLog() marco de su UICollectionView
  • NSLog() CGSize para verificar el tamaño real devuelto
  • Intente configurar el tamaño codificado para verificar el comportamiento.
  • Si usa autoLayout , intente después de eliminar sus restricciones.

Espero que esto te ayude.

Ok, así que lo descubrí. Permítanme publicar primero el layout de mi storyboard.

Tomé un layout iPhone6 ​​y di las siguientes restricciones a la vista de colección

Configuración del layout

  1. Se corrigió el ancho de la vista de la colección al de la vista

    Imagen 1

  2. Siguiente i Se arregló la relación de aspecto de la vista de colección, de modo que siempre es un cuadrado

Imagen 2

  1. Finalmente, agregamos las restricciones principales, posteriores y principales.

Image3

Ahora, cambié el layout a desplazamiento horizontal desde vertical y agregué el siguiente código.

Implementación del código

  #import "ViewController.h" @interface ViewController ()<UICollectionViewDelegate,UICollectionViewDataSource> @property (nonatomic,weak) IBOutlet UICollectionView *clcnView; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } #pragma mark - Collection View methods- -(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ static NSString *reuse = @"cell"; UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuse forIndexPath:indexPath]; cell.backgroundColor = randomColor(); return cell; } -(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{ return 10; } - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { CGFloat fl = self.clcnView.frame.size.width; CGSize mElementSize = CGSizeMake(fl-1, fl-1); return mElementSize; } - (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section { return 1.0; } - (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section { return 1.0; } - (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section { return UIEdgeInsetsMake(0,0,0,0); } UIColor * randomColor(){ return [UIColor colorWithRed:arc4random_uniform(255)/255.0f green:arc4random_uniform(255)/255.0f blue:arc4random_uniform(255)/255.0f alpha:1.0]; } @end 

Y eso hizo el truco. Estas son las capturas de pantalla.

en iPhone

Captura de pantalla 1 Captura de pantalla2

en iPad

Captura de pantalla del iPad1 Captura de pantalla del iPad2

Espero que esto resuelva tu problema.

Intenta esto, te ayudará.

 #pragma mark -- Collection View Delegate and datasource method -- - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { return 10; } - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ static NSString *identifier = @"Cell"; UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath]; UILabel *title = [[UILabel alloc]initWithFrame:CGRectMake(10, 10, cell.bounds.size.width - 40, 22)]; title.tag = 200; title.backgroundColor = [UIColor purpleColor]; [cell.contentView addSubview:title]; return cell; } - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { CGFloat width = self.collectionViewSearchCity.frame.size.width/2-20; return CGSizeMake(width, 50.0); } - (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section{ return UIEdgeInsetsMake(0, 15, 0,15); }