构建 UICollectionViewLayout - 自定义单个项目的大小
Building UICollectionViewLayout - customize size of a single item
下面的代码可以使 UICollectionViewLayout
中的一个 sectionIndex
与其他部分相比,该部分中的每个项目具有不同的 width/height。我的问题是如何进一步更改本节中第一项的宽度:
myCollectionView = UICollectionView(frame: myFrame, collectionViewLayout: generateLayout())
.
func generateLayout() -> UICollectionViewLayout {
let layout = UICollectionViewCompositionalLayout { (sectionIndex: Int,
layoutEnvironment: NSCollectionLayoutEnvironment) -> NSCollectionLayoutSection? in
return self.generateStoryLayout(forSection: sectionIndex)
}
return layout
}
.
func generateStoryLayout(forSection: Int) -> NSCollectionLayoutSection {
let itemSize = NSCollectionLayoutSize(
widthDimension: .fractionalWidth(1.0),
heightDimension: .fractionalWidth(1.0))
let item = NSCollectionLayoutItem(layoutSize: itemSize)
print("generate story layout for this section")
var groupSize = NSCollectionLayoutSize(
widthDimension: .absolute(180),
heightDimension: .absolute(216))
//taller row in section 1
if forSection == 1 {
groupSize = NSCollectionLayoutSize(
widthDimension: .absolute(250),
heightDimension: .absolute(300))
}
let group = NSCollectionLayoutGroup.vertical(layoutSize: groupSize, subitem: item, count: 1)
let section = NSCollectionLayoutSection(group: group)
section.orthogonalScrollingBehavior = .continuousGroupLeadingBoundary //.groupPaging
return section
}
非常感谢您的帮助!
我分别使用不同的 UICollectionView
,它使用 UICollectionViewFlowLayout
作为其布局,并且为 UICollectionView
中的每个项目调用函数 layout:sizeForItemAt:
,我可以在那里确定它们的尺寸。
自定义 myCollectionView
不调用此 layout:sizeForItemAt:
ViewController
确实符合UICollectionViewDelegate
您是否设置了估计大小是none?
layout:sizeForItemAt: 如果 Estimate Size 是自动的,则不会调用
您需要使视图控制器符合 UICollectionViewDelegateFlowLayout
和 UICollectionViewDelegate
才能使此方法起作用:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { }
您正在使用 UICollectionViewCompositionalLayout
,因此不需要 sizeForItemAt
:
请查看这些教程:
我在这里收到了一个建议,我在其他类似的线程上反复看到它需要关闭 "estimate size" 才能使 layout:sizeForItemAt:
工作 - 但 layout:sizeForItemAt:
特定于 UICollectionViewFlowLayout
,并且不被自定义调用 UICollectionViewLayout
这里的解决方案实际上是使用估计尺寸。当告诉集合视图单元格估计大小时,您是在告诉它们使用内容的大小来确定单元格的大小。
我的目标是增加某个部分中第一个单元格的宽度,因为该单元格中的图像比其余单元格中的图像宽。通过使用 .estimated widthDimension
第一个单元格由于图像更宽而自动将自身尺寸变大。
谢谢 UICollectionView!
下面的代码可以使 UICollectionViewLayout
中的一个 sectionIndex
与其他部分相比,该部分中的每个项目具有不同的 width/height。我的问题是如何进一步更改本节中第一项的宽度:
myCollectionView = UICollectionView(frame: myFrame, collectionViewLayout: generateLayout())
.
func generateLayout() -> UICollectionViewLayout {
let layout = UICollectionViewCompositionalLayout { (sectionIndex: Int,
layoutEnvironment: NSCollectionLayoutEnvironment) -> NSCollectionLayoutSection? in
return self.generateStoryLayout(forSection: sectionIndex)
}
return layout
}
.
func generateStoryLayout(forSection: Int) -> NSCollectionLayoutSection {
let itemSize = NSCollectionLayoutSize(
widthDimension: .fractionalWidth(1.0),
heightDimension: .fractionalWidth(1.0))
let item = NSCollectionLayoutItem(layoutSize: itemSize)
print("generate story layout for this section")
var groupSize = NSCollectionLayoutSize(
widthDimension: .absolute(180),
heightDimension: .absolute(216))
//taller row in section 1
if forSection == 1 {
groupSize = NSCollectionLayoutSize(
widthDimension: .absolute(250),
heightDimension: .absolute(300))
}
let group = NSCollectionLayoutGroup.vertical(layoutSize: groupSize, subitem: item, count: 1)
let section = NSCollectionLayoutSection(group: group)
section.orthogonalScrollingBehavior = .continuousGroupLeadingBoundary //.groupPaging
return section
}
非常感谢您的帮助!
我分别使用不同的 UICollectionView
,它使用 UICollectionViewFlowLayout
作为其布局,并且为 UICollectionView
中的每个项目调用函数 layout:sizeForItemAt:
,我可以在那里确定它们的尺寸。
自定义 myCollectionView
不调用此 layout:sizeForItemAt:
ViewController
确实符合UICollectionViewDelegate
您是否设置了估计大小是none?
layout:sizeForItemAt: 如果 Estimate Size 是自动的,则不会调用
您需要使视图控制器符合 UICollectionViewDelegateFlowLayout
和 UICollectionViewDelegate
才能使此方法起作用:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { }
您正在使用 UICollectionViewCompositionalLayout
,因此不需要 sizeForItemAt
:
请查看这些教程:
我在这里收到了一个建议,我在其他类似的线程上反复看到它需要关闭 "estimate size" 才能使 layout:sizeForItemAt:
工作 - 但 layout:sizeForItemAt:
特定于 UICollectionViewFlowLayout
,并且不被自定义调用 UICollectionViewLayout
这里的解决方案实际上是使用估计尺寸。当告诉集合视图单元格估计大小时,您是在告诉它们使用内容的大小来确定单元格的大小。
我的目标是增加某个部分中第一个单元格的宽度,因为该单元格中的图像比其余单元格中的图像宽。通过使用 .estimated widthDimension
第一个单元格由于图像更宽而自动将自身尺寸变大。
谢谢 UICollectionView!