- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
所以正如标题所暗示的那样,我似乎遇到了一个奇怪的问题。我在这里要做的就是创建一个 2 列的 Collection View ,而无需将任何内容硬编码到我的委托(delegate)方法中。调试后我发现 insetForSectionAt 在 sizeForItemAt 之后调用,因此在计算每个单元格的大小时不考虑自定义插图。
extension ViewController: UICollectionViewDelegateFlowLayout {
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let flowLayout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout
print("left: ", flowLayout.sectionInset.left) // Prints out 0.0
print("right: ", flowLayout.sectionInset.right) // Prints out 0.0
let marginsAndInsets = flowLayout.sectionInset.left + flowLayout.sectionInset.right + flowLayout.minimumInteritemSpacing * (cellsPerRow - 1)
let itemWidth = (collectionView.bounds.size.width - marginsAndInsets) / cellsPerRow
return CGSize(width: itemWidth, height: itemWidth)
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
return UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
}
}
这个问题可以通过将值直接硬编码到 itemWidth 变量中来非常丑陋地解决,-20 因为我知道左右插图的值,10 + 10
let itemWidth = (collectionView.bounds.size.width - marginsAndInsets - 20) / cellsPerRow
但是,我必须相信有更好的方法可以做到这一点,我如何在 UIEdgeInset 计算完成后调用 reloadData 以便我的单元格大小合适?
最佳答案
这就是我最终所做的,我只是在为 collectionView 及其单元格创建大小时直接添加了自定义项。
class PinController: UICollectionViewController {
fileprivate let pinCellId = "pinCellId"
fileprivate let cellsPerRow: CGFloat = 2.0
fileprivate let margin: CGFloat = 10.0
fileprivate let topMargin: CGFloat = 2.0
}
extension PinController: UICollectionViewDelegateFlowLayout {
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let flowLayout = customize(collectionViewLayout, margin: margin)
let itemWidth = cellWidth(collectionView, layout: flowLayout, cellsPerRow: cellsPerRow)
return CGSize(width: itemWidth, height: itemWidth * 1.1)
}
/*
Customizes the layout of a collectionView with space to the left and right of each cell that is
specified with the parameter margin
*/
private func customize(_ collectionViewLayout: UICollectionViewLayout, margin: CGFloat) -> UICollectionViewFlowLayout {
let flowLayout = collectionViewLayout as! UICollectionViewFlowLayout
// Interitem spacing affects the horrizontal spacing between cells
flowLayout.minimumInteritemSpacing = margin
// Line spacing affects the vertical space between cells
flowLayout.minimumLineSpacing = margin
// Section insets affect the entire container for the collectionView cells
flowLayout.sectionInset = UIEdgeInsets(top: topMargin, left: margin, bottom: 0, right: margin)
return flowLayout
}
/*
Calculates the proper size of an individual cell with the specified number of cells in a row desired,
along with the layout of the collectionView
*/
private func cellWidth(_ collectionView: UICollectionView, layout flowLayout: UICollectionViewFlowLayout, cellsPerRow: CGFloat) -> CGFloat {
// Calculate the ammount of "horizontal space" that will be needed in a row
let marginsAndInsets = flowLayout.sectionInset.left + flowLayout.sectionInset.right + flowLayout.minimumInteritemSpacing * (cellsPerRow - 1)
let itemWidth = (collectionView.bounds.size.width - marginsAndInsets) / cellsPerRow
return itemWidth
}
}
关于ios - UICollectionViewDelegateFlowLayout Edge Insets 未被 sizeForItemAt 函数识别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43165636/
我在 UITableViewCell 中有 UICollectionView ,它的委托(delegate)和数据源在表格单元类中声明。它第一次加载时效果很好,但后来当我滚动集合时会更改它的大小。我注
上下文- 我正在开发一个 macOS 菜单栏应用程序,它显示一系列项目。这些项目存在于 Collection View 中并包含一个文本字段。 现在, Collection View 布局的固定高度为
我希望第一部分的单元格为 Collection View 的全宽度,第二部分的单元格为宽度的一半。启动时,单元格不遵循给定的宽度,尽管高度似乎受到尊重。几秒钟后, Collection View 将重
我正在尝试根据图片的纵横比以及其他因素来动态调整单元格的大小,以创建自定义布局。这些计算似乎减慢了我的应用程序的加载速度。我想将此进程移至后台线程。下面是该函数的代码。是否可以在后台线程上运行此函数以
我正在为我的 Collection View 使用自定义布局,但如果我使用自定义布局,sizeForItemAt 方法不会调用。 我的自定义布局: public class HorizontalCol
我正在尝试根据里面的内容设置我的单元格的大小这是我的代码,它崩溃了,我找不到错误消息。 extension TimelineCollectionVC: UICollectionViewDelegate
我想给所有单元格大小以适合所有设备。这是索引路径中我的 Collection View 单元格 sizeForItem 的代码: extension PersonListViewController:
我正在使用 sizeForItemAt 设置一个 View Controller 的单元格大小,但似乎我也必须为其他 CollectionView 返回一个结果,问题是我没有其他 Collection
我正在尝试在 Collection View 中设置单元格大小变化的动画。 在“didSelectItemAt”中: collectionView.performBatchUp
我的 UICollectionView 的宽度/高度匹配所有可用空间。 我想在一行(两列)中显示两个单元格 所以一个单元格的宽度应该是UICollectionView的一半宽度(collectionV
我正在尝试布局我的 collectionViewCell 的大小,以便每行中有 7 个单元格(很简单吧?)。 cell很简单,只有一个UILabel,上、左、下、右约束均为0。 我已经设置了 size
我在 viewcontroller 中设置了 2 个 collectionView,它们都从端点获取数据,然后 reloadData()。 一个 collectionView 就像一个标题选项卡,其单
我使用自动布局来动态计算 collectionView 单元格的大小。一些单元格在第一次滚动到查看端口时使用来自重用单元格的尺寸。当我继续滚动 collectionView 时,它们将被设置为正确的值
我遇到了一个奇怪的问题,我不确定为什么会发生这种情况。如您所见,这两个图像一个是运行 ipad 的 ios 9,另一个是运行 ipad 的 ios11。对于 ios9,运行 ipad 单元格不会调整大
我有 ViewController,其中有两个 collectionView 但对于一个我想要 isPagingEnabled 用于单元格和另一个 collectionView全帧宽度的 3 项。我怎
我有一个 UICollectionViewCell,里面有一个 UICollectionView 和 UICollectionViewFlowLayout。我正在使单元格成为 Collection V
所以正如标题所暗示的那样,我似乎遇到了一个奇怪的问题。我在这里要做的就是创建一个 2 列的 Collection View ,而无需将任何内容硬编码到我的委托(delegate)方法中。调试后我发现
我有一个 collectionView 设置如下,但是在 sizeForItemAt 中 collectionView!.frame.size 与渲染结果不同。 注意:我只对 collectionVi
我使用 UICollectionView 制作了画廊。 如果你降低屏幕,图像应该继续出现并停在 20。 代码不断更新。但是设置cell大小的函数collectionView(_:layout:size
实现 我想在 UICollectionView 中拥有两种不同的项目大小。因此我已经实现了 UICollectionViewDelegateFlowLayout 的 collectionView(_:
我是一名优秀的程序员,十分优秀!