UICollectionView作为UITableView子视图流布局循环

时间:2015-07-06 16:44:11

标签: ios objective-c uitableview uicollectionview infinite-loop

我有一个UITableView,我想在tableView的backgroundView中添加一个水平流布局的UICollectionView作为子视图,以实现AppStore的相同效果。这里我有实现代码:

viewDidLoad中的

UIView *tableViewBackgroundView = [[UIView alloc] initWithFrame:self.view.bounds];
    self.tableView.backgroundView = tableViewBackgroundView;

// HighlightView heightFactor returns the reason which is  9.0/16.0
    CGFloat headerViewHeight = CGRectGetWidth(self.view.frame) * [HighlightView heightFactor];
    self.tableView.contentInset = UIEdgeInsetsMake(headerViewHeight, 0, 0, 0);
    self.headerView = [[HighlightView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.view.frame), headerViewHeight)];
    [tableViewBackgroundView addSubview:self.headerView];

HighlightView是一个内部带有collectionView的视图。

但是我遇到了一个问题,当用户与collectionView交互时,我开始收到这个日志:

  

请检查代表返回的值。的行为   未定义UICollectionViewFlowLayout,因为:项高度   必须小于UICollectionView减去该部分的高度   插入顶部和底部值。

即使用户停止互动,这也会成为一个不会停止的循环。

HighlightView(CollectionView)代码:

override init(frame: CGRect) {
    super.init(frame: frame)
    self.viewModel.delegate = self
    self.configureHighlightsCollectionView()
}

func configureHighlightsCollectionView() {

    let flowLayout = UICollectionViewFlowLayout()
    flowLayout.scrollDirection = UICollectionViewScrollDirection.Horizontal
    flowLayout.minimumInteritemSpacing = 0
    flowLayout.minimumLineSpacing = 0
    if systemVersion > 8.0 {
        flowLayout.estimatedItemSize = self.frame.size
    }
    flowLayout.itemSize = self.frame.size
    self.highlightsCollectionView = UICollectionView(frame: self.bounds, collectionViewLayout: flowLayout)
    self.highlightsCollectionView.frame = self.bounds
    self.highlightsCollectionView.scrollsToTop = false
    self.highlightsCollectionView.pagingEnabled = true
    self.highlightsCollectionView.registerClass(CachedImageCollectionViewCell.self, forCellWithReuseIdentifier: "ImageCell")
    self.addSubview(self.highlightsCollectionView)

    self.highlightsCollectionView.invalidateIntrinsicContentSize()

    self.highlightsCollectionView.dataSource = self
    self.highlightsCollectionView.delegate = self
    self.highlightsCollectionView.backgroundColor = UIColor.greenColor()

    self.highlightsCollectionView.snp_makeConstraints { (make) -> Void in
        make.top.equalTo(self)
        make.bottom.equalTo(self)
        make.left.equalTo(self)
        make.right.equalTo(self)
    }

}
//Mark: UICollectionViewDataSource
    public func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return self.viewModel.highlightsArray.count
    }

public func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("ImageCell", forIndexPath: indexPath) as! CachedImageCollectionViewCell
    cell.highlightData = self.viewModel.highlightsArray[indexPath.item]
    return cell
}

public func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
    println(self.frame.size)
    return self.frame.size
}

viewModel是一个控制collectionView数据流的类。

1 个答案:

答案 0 :(得分:1)

首先,我认为将您的视图作为数据源并将UICollection的委托放在UIView子类中是个好主意。你不尊重MVC模式。在Introducing iOS Design Pattern 了解有关它的更多信息。您应该将控制器设置为它。

问题是您在initFrame中设置UICollectionViewFlowLayout的itemSize:基于视图的框架。在该方法中,由于您正在使用AutoLayout,因此UIView的框架不正确。您必须等到AutoLayout计算视图的布局,以便调用layoutSubviews:时。在Matt's book中了解UIView和AutoLayout。适用于iOS 6和Objective-C,但仍然很棒。