- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个带有自定义 UICOllectionViewLayout 的 UICollectionViewSubclass
如何最好地处理方向更改时的 itemSize 更改?
class CollectSubclass: UICollectionView {
/// When orientation changes, then invalidate the layout
open override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if ((traitCollection.verticalSizeClass != previousTraitCollection?.verticalSizeClass) || (traitCollection.horizontalSizeClass != previousTraitCollection?.horizontalSizeClass)) {
collectionViewLayout.invalidateLayout()
}
}
}
一旦布局因方向改变而失效,我将单元格的 size.width
计算为 UICollectionView 的 width
。
这在 iPhone 7 Plus 模拟器上运行良好,但在 iPhone 7、5、SE 等较小的模拟器上失败。
似乎一旦 invalidateLayout
被调用,下面的函数就会被触发
/// Lays out subviews.
override open func layoutSubviews() {
super.layoutSubviews()
}
此函数依次调用 UICollectionViewLayout
子类上的 prepare
函数,我在其中使用 collectionView 的新框架来计算单元格的大小。
在 iPhone-7-Plus 上,traitCollectionDidChange
被触发一次。并且layoutSubviews
被触发一次导致prepare
被触发一次。
然而,在较小的模拟器上,traitCollectionDidChange
被触发一次,但 layoutSubviews
被触发两次。
随着 layoutSubviews
的第一个触发器,UICOllectionView 帧大小几乎应该是什么。在第二次触发时,UICOllectionView 框架大小现在是它应该的正确大小。
使用两种不同的帧尺寸被调用两次将使我准备两次布局(这是非常昂贵的)。
我在继承 UICOllectionViews 和 UICollectionViewLayouts 时遗漏了什么吗?感谢您的帮助。
如果需要我也可以提供示例工程
最佳答案
如果在您的设置中,其中一个 UICollectionViewCells
的宽度仅基于 UICollectionView
的大小以及屏幕的大小和方向(并且没有其他因素),以下是设置 Collection View 单元格大小的简洁方法:
1) 首次加载 View 时,预先计算纵向和横向单元格的大小。同时创建一个变量 currCellDimensions
来保存单元格的当前尺寸,并设置其初始值。
2) 沿这些行覆盖函数 viewWillTransitionToSize:
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
setCurrentCollectionCellDimensions(size) // This code executes before the rotation begins, but "size" is the size that the main view is going to be after the rotation occurs. As of iOS 8, the size of an object swaps its width and its height when the UI changes its orientation.
}
3) 实现 setCurrentCollectionCellDimensions():
func setCurrentCollectionCellDimensions(newSize: CGSize) {
if (newSize.width < newSize.height) {
// set currCellDimensions to what it should be in portrait orientation
} else {
// set currCellDimension to what it should be in landscape orientation
}
if collectionView != nil {
collectionView.collectionViewLayout.invalidateLayout() // To trigger sizeForItemAtIndexPath to recalculate cell sizes
collectionView.reloadData() // To trigger cellForItemAtIndexPath to redraw the cells that are visible to the user. Without this call, the cell layout looks wrong on some iPhones.
}
}
4) 最后,让 sizeForItemAtIndexPath()
返回 currCellDimensions
。
关于ios - 如何在方向更改时正确处理 UICollectionViewLayout 的 itemSize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42826342/
加载腌制字典时 --> 使用 pickle 我收到此错误: ValueError: itemsize cannot be zero 使用 cPickle 我收到此错误: ValueError: ('i
如果我尝试设置 itemSize,我会收到此错误。如何正确设置 itemSize? class CenterAlignedCollectionViewFlowLayout: UICollectionV
我是 iOS/Swift 开发的初学者。当我使用布局的 itemSize 属性时,我收到以下错误消息,我不明白为什么: Value of type `UICollectionViewLayout` h
在我的应用程序中,我有一个全屏分页 Collection View ,每个单元格也需要全屏,因此 Collection View 布局的项目大小需要与 View Controller 的 View 边
我需要在 collectionView 中制作单元格屏幕允许的宽度。 显然这应该通过 itemSize 到达。属性(property)。 在我的示例中,我将宽度设置为 400,但如何设置为用户屏幕的宽
我有一个带有自定义 UICOllectionViewLayout 的 UICollectionViewSubclass 如何最好地处理方向更改时的 itemSize 更改? class Collect
我正在以编程方式工作(没有 Storyboard ),并且无法针对不同的屏幕尺寸动态设置 layout.itemSize。我收到此错误消息: "UICollectionView must be ini
我正在使用 UICollectionView 在多个行和列上显示一组图形。用户可以使用 pinchGesture 来放大/缩小。 当用户放大图形大小增加和用户缩小图形大小减小。要更改图形的大小,我只是
我的代码如下,每次运行都会出错; “ValueError:数据类型必须提供项目大小” 我找不到它不起作用的原因。 不知道为什么? from sklearn.linear_model import Lo
您好,我正在尝试使用 UICollection View 并让它们具有多个布局。 当我使用 swift/obj-cs setCollectionViewLayout(toLayout, animate
我真的在努力实现一些相当简单的事情:我想创建一个水平 Collection View ,其中 UICollectionViewCell s 是 UICollectionView 的大小本身。 到目前为
我使用dynamo set函数将数据存储在DynamoDB中,但有时数据太大。是否有一个函数可以用来确定数据是否太大而无法保存在 DynamoDB 中? Node.js 函数?谢谢 即使数据是包含数组
我正在为我的collectionView使用CompositionalLayout来在我的应用程序的某些detailView中创建水平 ScrollView 。我需要这些项目来保存圆形 ImageVi
我正在尝试将一个大型稀疏数据帧保存到一个 hdf5 文件中,但我收到了一个归因错误: one_hot = pd.get_dummies(my_DF, columns=['cat'], sparse=T
给定一个数组 arr = array([ 9.93418544e+00, 1.17237323e+01, 1.34554537e+01, 2.43598467e+01,
我正在尝试将类似的东西从 python 转换为 R: dt = my_array.dtype fw = int(dt.itemsize/dt.alignment) b = numpy.array([l
我是一名优秀的程序员,十分优秀!