3

我在我创建的不使用 Interface Builder 的测试项目中有一个 UICollectionView。当我运行应用程序时,我通过数据源提供给集合视图的测试视图显示在右上角 (0,0) 附近。而且我终其一生都无法弄清楚为什么。我尝试向单元格的内容视图添加约束。我也尝试过弄乱 item insets 委托函数,但这似乎没有什么区别。我错过了什么吗?

这是测试视图控制器的代码。

#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 redColor];
    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
4

1 回答 1

1

对于开场白,CGRectZero宏相当于CGRectMake(0, 0, 0, 0). 看起来您在定义要在其中绘制集合视图的空间时遇到了麻烦,并且CGRectZero原点0,0会将其放在视图的左上角。我尝试使用您的代码创建一个应用程序 - 当我得到如下代码时,终于得到了一些显示loadView

- (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"];
} 

不同之处在于对象是使用框架大小创建的——视图被添加到视图中等等。

我的想法是,你最好UICollectionView在 XIB 中创建你的 - 在那里设置所有参数并创建一个子类,UICollectionViewCell以便能够根据需要对单元格的内容做更多的事情。要使其可用于任意数量的单元,还有很多工作要做UICollectionView,但我不得不说,这UICollectionView不是一个容易处理的对象 - 所以当你走上学习曲线时,我很同情你。

于 2013-09-12T02:16:36.123 回答