gpt4 book ai didi

ios - UICollectionView 作为 UITableView 的 subview 流布局循环

转载 作者:行者123 更新时间:2023-11-29 01:52:35 24 4
gpt4 key购买 nike

我有一个UITableView,我想在tableView的backgroundView中添加一个具有水平流布局的UICollectionView作为 subview ,以达到与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的 View 。

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

Please check the values return by the delegate. the behavior of the UICollectionViewFlowLayout is not defined because: the item height must be less than the height of the UICollectionView minus the section insets top and bottom values.

这就变成了一个循环,即使用户停止交互也不会停止。

高亮 View (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数据流的类。

最佳答案

首先,我认为将 View 作为数据源和 UICollection 的委托(delegate)放在 UIView 子类中不是一个好主意。你不尊重 MVC 模式。在 Introducing iOS Design Pattern 了解更多信息.您应该将 Controller 设置为它。

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

关于ios - UICollectionView 作为 UITableView 的 subview 流布局循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31251294/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com