- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 TableView 中有一个动态 collectionView,当我添加 invalidateLayout
时出现错误(图片如下)但是如果我删除 invalidateLayout
前四个单元格被隐藏并且布局显示不正确,video
请帮助我搜索了整个堆栈,但没有任何帮助,谢谢
如果你需要测试project
主视图 Controller
class ViewController: UIViewController, UIScrollViewDelegate {
override func viewDidLoad() {
super.viewDidLoad()
setting()
}
func setting(){
getData()
tableView.dataSource = self
tableView.delegate = self
tableView.estimatedRowHeight = UITableView.automaticDimension
tableView.rowHeight = UITableView.automaticDimension
}
//load data
func pagination(_ completion: (()->())?){
SmartNetworkSevrice.getGoods(with: url) { [unowned self] (data) in
guard data.modals.count > 0 else {
self.tableView.tableFooterView = nil
return
}
self.goods.append(contentsOf: data.modals)
self.offSet += data.modals.count
DispatchQueue.main.async {
let indexPath = IndexPath(row: 0, section: 0)
self.tableView.tableFooterView = nil
if self.goods.count == data.modals.count || self.isRefresh {
self.tableView.reloadRows(at: [indexPath], with: .none)
} else {
if let cell = self.tableView.cellForRow(at: indexPath) as? TVCellGoods {
UIView.performWithoutAnimation {
self.tableView.beginUpdates()
cell.insertGoods(data.modals)
cell.layoutIfNeeded()
cell.collectionViewHeight.constant = cell.collectionView.collectionViewLayout.collectionViewContentSize.height
self.tableView.endUpdates()
}
}
}
completion?()
}
}
// define bottom of tableView
func scrollViewDidScroll(_ scrollView: UIScrollView) {
guard scrollView == self.tableView else { return }
if (!isMoreDataLoading) {
// Вычислить позицию длины экрана до нижней части результатов
let scrollViewContentHeight = scrollView.contentSize.height
let scrollOffsetThreshold = scrollViewContentHeight - scrollView.bounds.size.height
if(scrollView.contentOffset.y > scrollOffsetThreshold && scrollView.isDragging) {
isMoreDataLoading = true
self.tableView.isScrollEnabled = false;
self.tableView.isScrollEnabled = true;
pagination(nil)
}
}
}
}
extension ViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "goods", for: indexPath) as? TVCellGoods else { return UITableViewCell() }
guard bestGoods.count != 0, goods.count != 0 else { return UITableViewCell() }
cell.delegate = self
cell.configure(bestGoods, goods, categories)
// автообновление высоты
self.tableView.beginUpdates()
cell.collectionViewHeight.constant = cell.collectionView.collectionViewLayout.collectionViewContentSize.height
self.tableView.endUpdates()
return cell
}
}
extension ViewController: UITableViewDelegate, CallDelegate {
func callMethod() {}
func callMethod(push vc:UIViewController) {
self.navigationController?.pushViewController(vc, animated: true)
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
}
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
}
}
带有 collectionView 的 TableViewCell
class TVCellGoods: UITableViewCell {
@IBOutlet weak var collectionView:UICollectionView!
@IBOutlet weak var collectionViewHeight:NSLayoutConstraint!
weak var delegate:CallDelegate?
var bestGoods = [Goods]() // лучшие товары
var goods = [Goods]() // все товары
var categories = [Menu]()
override func layoutSubviews() {
super.layoutSubviews()
self.collectionView.collectionViewLayout.invalidateLayout()
}
override func awakeFromNib() {
super.awakeFromNib()
collectionView.delegate = self
collectionView.dataSource = self
collectionView.tag = 2
collectionView.isScrollEnabled = false
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
func configure(_ best:[Goods],_ goods:[Goods], _ category:[Menu]) {
self.bestGoods = best
self.goods = goods
self.categories = category
self.collectionView.reloadData()
}
func insertGoods(_ data:[Goods]) {
self.goods.append(contentsOf: data)
let count = self.bestGoods.count + self.categories.count + self.goods.count
let indexPaths = ((count - data.count) ..< count)
.map { IndexPath(row: $0, section: 0) }
self.collectionView.performBatchUpdates({
self.collectionView.insertItems(at: indexPaths)
}, completion: nil)
}
}
和 CollectionViewCell
class CVCellGoods: UICollectionViewCell {
@IBOutlet weak var bgView: UIView!
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var title: UILabel!
@IBOutlet weak var price: UILabel!
@IBOutlet weak var delivery: UIImageView!
@IBOutlet weak var premium: UIImageView!
override func prepareForReuse() {
super.prepareForReuse()
delivery.image = nil
premium.image = nil
title.text = nil
price.text = nil
imageView.image = nil
imageView.sd_cancelCurrentImageLoad()
}
override func awakeFromNib() {
super.awakeFromNib()
imageView.backgroundColor = UIColor(red: 215/255, green: 215/255, blue: 215/255, alpha: 1)
self.contentView.layer.cornerRadius = 5
self.contentView.layer.masksToBounds = true
self.layer.shadowColor = UIColor.black.cgColor
self.layer.shadowOffset = CGSize(width: 0, height: 0.5)
self.layer.shadowRadius = 1
self.layer.shadowOpacity = 0.3
self.layer.masksToBounds = false
self.layer.shouldRasterize = true
self.layer.rasterizationScale = UIScreen.main.scale
}
}
编辑
如果我用
self.collectionView.performBatchUpdates({
self.collectionView.insertItems(at: indexPaths)
}, completion: { _ in
self.collectionView.reloadItems(at: indexPaths)
})
使用 invalidateLayout
然后我在屏幕底部得到一个空白区域 但是如果我删除 invalidateLayout
我会得到错误的布局
如果你没有像我的那样,然后放弃你改进的项目
第二次编辑
我注意到 iPhone 11 Pro 上有一个凹痕,在 iPhone 11 Pro Max 上一切正常
最佳答案
更新:我在 iPhone SE、11 和 11 Max 的模拟器上验证了它在 Collection View 末尾没有死角的情况。
My simulator is set to dark mode to show that the bottom of the collection view is just enough for the loading icon.
我必须对其进行一些更改才能使其大小合适。首先,我更改了 TVCellGoods
类中的 insertGoods
函数,以便在插入后仅重新加载新添加的项目,列表顶部不再有缺失的项目:
self.collectionView.performBatchUpdates({
self.collectionView.insertItems(at: indexPaths)
}, completion: { _ in
self.collectionView.reloadItems(at: indexPaths)
})
一个大问题是为 tableView 单元格设置估计的行高。我已经删除了 estimatedHeightForRowAt
覆盖并将您的 heightForRowAt
替换为:
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if indexPath.row == 0 {
return (tableView.frame.width / 2.5) + 20
} else if indexPath.row == 1 {
return 70
} else {
guard let cell = tableView.cellForRow(at: indexPath) as? TVCellGoods else { return UITableView.automaticDimension }
// print(cell.collectionViewHeight.constant)
return cell.collectionViewHeight.constant
}
}
我还必须将 layoutIfNeeded
添加到您的 ViewController UITableViewDataSource
扩展中的 cellForRow:
self.tableView.beginUpdates()
cell.collectionViewHeight.constant = cell.collectionView.collectionViewLayout.collectionViewContentSize.height
self.tableView.endUpdates()
cell.collectionView.layoutIfNeeded()
self.tableView.layoutIfNeeded()
最后,在使 TVCellGoods
中的布局无效后,我必须更新您的 layoutSubviews
以分配正确的高度:
override func layoutSubviews() {
super.layoutSubviews()
self.collectionView.collectionViewLayout.invalidateLayout()
self.collectionViewHeight.constant = self.collectionView.collectionViewLayout.collectionViewContentSize.height
}
Here is the updated source code: https://drive.google.com/open?id=1ldr4Ml2prZKmr1C4i1s5Sg7LvvxL7-jO
关于ios - collectionView.collectionViewLayout.invalidateLayout(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61481436/
我在 TableView 中有一个动态 collectionView,当我添加 invalidateLayout 时出现错误(图片如下)但是如果我删除 invalidateLayout 前四个单元格被
我对 UICollectionViewLayout 进行了子类化以创建日历。我想让用户能够更改一些设置,例如屏幕上显示的天数(默认为 7)。 我将daysToShow保存在UserDefaults中。
我发现在 iOS8 中调用 invalidateLayout 会导致崩溃行为,这可能是由于上次 WWDC 引入了带有上下文的新 invalidateLayout。不过,我还没有找到等效于使整个 Col
我有一个 UICollectionViewController,它有一堆单元格,每个单元格都有屏幕尺寸。 如果我以纵向或横向启动应用程序,一切都会按预期进行。 问题是当我更改屏幕方向并调用 colle
这个问题已被问过几次,但没有一个答案足够详细,让我无法理解为什么/如何工作。作为引用,其他 SO 问题是: How to update size of cells in UICollectionVie
我有一个带有数据源和布局类的 Collection View 。该类链接到 Attributes Inspector 中的 Collection View 。 通过点击按钮,我需要检索集合的数据,这可
在 UICollectionView + UIKit Dynamics 上阅读 objc.io 的第 5 期时,第 2 部分讨论了“Tiling your Dynamic Behaviors for
UICollectionView Programming Guide说: In addition to animating insertions, deletions, and move operat
我想每分钟更新一次 UICollectionView 布局。它在 iOS 10 中运行良好,但在 iOS 9 中崩溃(我在 iPad 2 中测试过) invalidateLayout 方法使 UICo
我正在尝试刷新页脚 (supplementaryElement)。我正在使用 invalidatelayout 方法。基于 SO 建议 here . Apple 文档 here . 我收到以下错误:
问题是 collectionView 中的列数在旋转时不会保持在 7(所需数量)。需要更改什么代码才能解决此问题? 自定义 UICollectionViewFlowLayout 中的 invalida
我一直在阅读this article about using custom UICollectionViewLayouts并试图将这个想法融入我正在从事的项目中。 我们之前使用的是 UICollect
在 UITableViewController、UITableViewCell 中,我有一个网格,每行具有固定数量的静态 UICollectionViewCells(无间距)。 extension N
我是一名优秀的程序员,十分优秀!