嵌入式视图控制器中的UICollectionView不会调用cellForItemAtIndexPath

时间:2015-01-28 22:04:06

标签: ios objective-c autolayout uicollectionview

我在视图中垂直嵌入了2个视图控制器。查看控制器A(上传器)和B(docList)。 B包含UICollectionView

所有,除了集合视图的数据源中的cellForItemAtIndexPath之外的方法被正确调用,我双重检查了所有内容。有1个部分。有超过0行。我返回的行的大小小于集合视图等

这是一个说明设置的图表:

enter image description here

我的问题是: 除非我将setTranslatesAutoresizingMaskIntoConstraints设置为YES,否则永远不会调用cellForItemAtIndexPath。如果我在View Controller B的视图中将该属性设置为YES,则会调用它。但是布局被搞砸了,因为我没有使用弹簧和支柱。我们这里只使用约束。

在嵌入包含UICollectionView的视图控制器时,您知道我可能做错了什么吗?

这是嵌入两个视图控制器视图的代码,并将它们设置为子控制器:

 - (MFFormBaseCell *)cellForComponent
    {
self.cell = [[MFFormBaseCell alloc] initWithFrame:CGRectZero];
[self.cell addSubview: uploader.view];
[self.cell addSubview: docList.view];

UIView* uploaderView = uploader.view;
UIView* docListView = docList.view;

NSMutableArray* tempConstraints = [[NSMutableArray alloc]init];

[tempConstraints addObjectsFromArray:
     [NSLayoutConstraint constraintsWithVisualFormat: @"V:|-8-[uploaderView]-1-[docListView]-8-|"
                                             options: NSLayoutFormatDirectionLeadingToTrailing metrics:nil
                                               views: NSDictionaryOfVariableBindings(uploaderView, docListView)]];


[tempConstraints addObjectsFromArray:
 [NSLayoutConstraint constraintsWithVisualFormat: @"H:|-[uploaderView]-|"
                                         options: NSLayoutFormatDirectionLeadingToTrailing metrics:nil
                                           views: NSDictionaryOfVariableBindings(uploaderView)]];

[tempConstraints addObjectsFromArray:
 [NSLayoutConstraint constraintsWithVisualFormat: @"H:|-[docListView]|"
                                         options: NSLayoutFormatDirectionLeadingToTrailing metrics:nil
                                           views: NSDictionaryOfVariableBindings(docListView)]];

uploaderConstraints = [tempConstraints copy];
[self.cell addConstraints: uploaderConstraints];

[self.embedder addChildViewController:uploader];
[uploader didMoveToParentViewController:self.embedder];



[self.embedder addChildViewController:docList];
[docList didMoveToParentViewController:self.embedder];
docList.view.frame = self.cell.bounds;


return self.cell;

}

这是来自View Controller B的代码,它为它设置UICollectionView和垂直流布局。

- (void)modelDidLoad
{

    _dataSource = [[MFCardDataSource alloc] initWithData: self.cardModel];;

    UICollectionViewFlowLayout *aFlowLayout = [[UICollectionViewFlowLayout alloc] init];


    [aFlowLayout setScrollDirection:UICollectionViewScrollDirectionVertical];

    _collectionView = [[UICollectionView alloc] initWithFrame:self.view.frame collectionViewLayout:aFlowLayout];
    [_collectionView setDelegate: self];
    [_collectionView setDataSource:_dataSource];
    [_collectionView setBackgroundColor:[UIColor clearColor]];

    for (NSString* type in [MFCardCollectionModel typeArray])
        [_collectionView registerClass:[MFImageCard class] forCellWithReuseIdentifier: type];

    [_collectionView setTranslatesAutoresizingMaskIntoConstraints:NO];
    [self.view addSubview:_collectionView];

    [self registerConstraintsForView:_collectionView];

    if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;

    [super modelDidLoad];

}

registerConstraintsForView的内容:

-(void) registerConstraintsForView:(UIView*)collectionView
{
    NSDictionary* metrics = @{ @"padding": @PADDING  };

    NSDictionary* views = NSDictionaryOfVariableBindings(_collectionView);
    [self.view addConstraints:[NSLayoutConstraint
                               constraintsWithVisualFormat:@"V:|-padding-[_collectionView]-padding-|"
                               options:NSLayoutFormatDirectionLeadingToTrailing
                               metrics:metrics
                               views:views]];

    [self.view addConstraints:[NSLayoutConstraint
                               constraintsWithVisualFormat:@"H:|-padding-[_collectionView]-padding-|"
                               options:NSLayoutFormatDirectionLeadingToTrailing
                               metrics:metrics
                               views:views]];
}

1 个答案:

答案 0 :(得分:0)

我通过Subclassing UICollectionView解决了这个问题,并改为使用子类。

在子类上我覆盖了2个方法:

- (void) setContentSize:(CGSize)contentSize
{
    CGSize origSize = self.contentSize;
    [super setContentSize:contentSize];
    if (!CGSizeEqualToSize(contentSize, origSize))
    {
        [self invalidateIntrinsicContentSize];
    }
}

- (CGSize) intrinsicContentSize
{
    return CGSizeMake(UIViewNoIntrinsicMetric, self.contentSize.height);
}

然后,我的视图控制器中有一个方法,它包含Collection View,它计算集合视图所需的高度。
然后我在我的子类Collection View上调用setContentSize和计算出的高度,这确保它返回一个很高的intrinsicContentSize来显示其中的所有卡片记录。