我有一个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数据流的类。
答案 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,但仍然很棒。