未定义UICollectionViewFlowLayout的行为

时间:2015-09-19 01:07:50

标签: ios objective-c autolayout uicollectionview uicollectionviewlayout

我有一个集合视图,它被设置为单个水平行的单元格。它抛出以下约束错误(我正在使用AutoLayout):

  

未定义UICollectionViewFlowLayout的行为,因为项高度必须小于UICollectionView的高度减去section insets top和bottom值,减去内容insets top和bottom值。

我用Google搜索并查看了SO,并且每个人都建议通过简单地覆盖UIScrollViewDelegate方法来修复它:

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
    // iPhone 6+ device width handler
    CGFloat multiplier = (screenWidth > kNumberOfCellsWidthThreshold) ? 4 : 3;
    CGFloat size = screenWidth / multiplier;
    return CGSizeMake(size, size);
}

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

但它仍然没有用。尽管我将细胞设置为与容器相同的高度,但是细胞高度比它的容器高,这似乎是一种愚蠢的行为。这是错误的其余部分:

  

相关的UICollectionViewFlowLayout实例是UICollectionViewFlowLayout:0x7fa6943e7760,它附加到MyCollectionView:0x7fa69581f200; baseClass = UICollectionView;

     

frame =(0 0; 375 98); clipsToBounds = YES; autoresize = RM + BM;   layer = CALayer:0x7fa694315a60; contentOffset:{0,0}; contentSize:{0,134}

手动将单元格设置为一个非常小的尺寸(例如size - 50.0似乎可行,但为什么我不能将单元格大小设置为与其容器相同的高度?

2 个答案:

答案 0 :(得分:5)

原来我的问题中遗漏的一块是UICollectionView嵌套在UITableView内的事实。 iOS 8引入了layoutMargins来代替内容偏移值。

根据这个问题:iOS 8 UITableView separator inset 0 not working

我必须覆盖包含表格视图的单元格边距:

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Remove seperator inset
    if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
        [cell setSeparatorInset:UIEdgeInsetsZero];
    }

    // Prevent the cell from inheriting the Table View's margin settings
    if ([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) {
        [cell setPreservesSuperviewLayoutMargins:NO];
    }

    // Explictly set your cell's layout margins
    if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
        [cell setLayoutMargins:UIEdgeInsetsZero];
    }
}

答案 1 :(得分:0)

swift for override cell

override func awakeFromNib() {
    super.awakeFromNib()
    self.separatorInset = .zero
    self.preservesSuperviewLayoutMargins = false
    self.layoutMargins = .zero
}