UICollectionView con UICollectionFlowLayout no muestra celdas en la location correcta

Tengo un UICollectionView en un proyecto de testing que creé que no utiliza el Generador de interfaces. Cuando ejecuto la aplicación, las vistas de testing que doy a la vista de colección, a través de la fuente de datos, se muestran en la esquina superior derecha alnetworkingedor de (0,0). Y no puedo por la vida de mí descubrir por qué. He intentado agregar restricciones a la vista de contenido de la celda. También he intentado jugar con la function de delegado de inserciones de elementos, pero eso no parece hacer una diferencia. ¿Me estoy perdiendo de algo?

Aquí está el código para el controller de vista de testing.

#import "TestViewViewController.h" @interface TestViewViewController () <UICollectionViewDelegateFlowLayout, UICollectionViewDataSource> @property (strong, nonatomic) UICollectionView *collectionView; @property (strong, nonatomic) UICollectionViewFlowLayout *flowLayout; @property (strong, nonatomic) NSMutableArray *testViews; @end @implementation TestViewViewController - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } - (void)loadView { self.view = [[UIView alloc] init]; self.view.backgroundColor = [UIColor whiteColor]; self.flowLayout = [[UICollectionViewFlowLayout alloc] init]; self.testViews = [[NSMutableArray alloc] init]; UIView *testView = [[UIView alloc] init]; testView.backgroundColor = [UIColor blueColor]; testView.translatesAutoresizingMaskIntoConstraints = NO; UILabel *testLabel = [[UILabel alloc] init]; testLabel.translatesAutoresizingMaskIntoConstraints = NO; testLabel.text = @"I hate collection views."; [testView addSubview:testLabel]; testView = [[UIView alloc] init]; testView.backgroundColor = [UIColor networkingColor]; testView.translatesAutoresizingMaskIntoConstraints = NO; testLabel = [[UILabel alloc] init]; testLabel.translatesAutoresizingMaskIntoConstraints = NO; testLabel.text = @"I really do."; [testView addSubview:testLabel]; self.collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:self.flowLayout]; self.collectionView.translatesAutoresizingMaskIntoConstraints = NO; self.collectionView.delegate = self; self.collectionView.dataSource = self; self.collectionView.backgroundColor = [UIColor grayColor]; [self.view addSubview:self.collectionView]; [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"MyCell"]; NSDictionary *views = @{@"collectionView": self.collectionView}; [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[collectionView]|" options:0 metrics:nil views:views]]; [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[collectionView]|" options:0 metrics:nil views:views]]; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. } #pragma mark - UICollectionView Datasource - (NSInteger)collectionView:(UICollectionView *)view numberOfItemsInSection:(NSInteger)section { return self.testViews.count; } - (NSInteger)numberOfSectionsInCollectionView: (UICollectionView *)collectionView { return 1; } - (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath { UICollectionViewCell *cell = [cv dequeueReusableCellWithReuseIdentifier:@"MyCell" forIndexPath:indexPath]; NSLog(@"%i", self.testViews.count); [cell.contentView addSubview: self.testViews[indexPath.row]]; return cell; } #pragma mark – UICollectionViewDelegateFlowLayout - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { // UIView *statView = self.testViews[indexPath.row]; return CGSizeMake(100.0, 100.0); } @end 

Para los abridores, la macro CGRectZero es equivalente a CGRectMake(0, 0, 0, 0) . Parecería que estarías en problemas con una definición del espacio en el que se iba a dibujar la vista de colección y el origen CGRectZero de 0,0 colocaría en la esquina superior izquierda de la vista. Intenté crear una aplicación con su código, y finalmente obtuve algo para mostrar cuando obtuve el código de loadView para que se vea así:

 - (void) loadView { self.view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; self.view.backgroundColor = [UIColor whiteColor]; self.flowLayout = [[UICollectionViewFlowLayout alloc] init]; self.testViews = [[NSMutableArray alloc] init]; UIView* testView = [[UIView alloc] initWithFrame:CGRectMake(0, 50, 320, 80)]; testView.backgroundColor = [UIColor blueColor]; testView.translatesAutoresizingMaskIntoConstraints = NO; UILabel* testLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 80)]; testLabel.translatesAutoresizingMaskIntoConstraints = NO; testLabel.text = @"I hate collection views."; [testView addSubview:testLabel]; [self.testViews addObject:testView]; self.collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 100, 320, 320) collectionViewLayout:self.flowLayout]; self.collectionView.translatesAutoresizingMaskIntoConstraints = NO; self.collectionView.delegate = self; self.collectionView.dataSource = self; self.collectionView.backgroundColor = [UIColor grayColor]; [self.view addSubview:self.collectionView]; [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"MyCell"]; } 

La diferencia es que los objects se crearon con un tamaño de marco: las vistas se agregaron a las vistas y así sucesivamente.

Mi idea es que sería mejor crear tu UICollectionView en un XIB, configurando todos los parameters allí y también creando una subclass para que UICollectionViewCell pueda hacer más con el contenido de las celdas como sea necesario. Todavía UICollectionView mucho por hacer para que UICollectionView utilizable con un número arbitrario de celdas, pero debo decir que UICollectionView no es un object fácil de tratar, así que comprendo con usted a medida que UICollectionView la curva de aprendizaje .