标签: uicollectionviewflowlayout

UICollectionViewFlowLayout estimatedItemSize与iOS12无法正常工作,但它适用于iOS 11*

对于我们使用的UICollectionView动态高度单元,

if let layout = self.collectionViewLayout as? UICollectionViewFlowLayout {
    layout.estimatedItemSize = UICollectionViewFlowLayoutAutomaticSize
}
Run Code Online (Sandbox Code Playgroud)

对于高度和宽度的适当约束,它适用于iOS 11.*版本,但它破坏并且不会使iOS 12.0的单元格动态

uicollectionview uicollectionviewlayout swift uicollectionviewflowlayout ios12

30
推荐指数
3
解决办法
7076
查看次数

UICollectionView - 单元格之间的距离?

我正在使用单元格宽度为67的UICollectionView,现在我正在使用流布局.

我连续有3个细胞,细胞之间有30px的空间.如何减少距离,以便我可以连续安装四个细胞?这种方法与它有关吗?

 - (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section
 {
    return UIEdgeInsetsMake(10, 10, 10, 10);
 }
Run Code Online (Sandbox Code Playgroud)

objective-c storyboard ios uicollectionview uicollectionviewflowlayout

26
推荐指数
5
解决办法
7万
查看次数

在UICollectionViewFlowLayout中启用AutoSizing单元格时,DecorationView会调整大小

环境:
UICollectionView看起来像UITableView的
自定义UICollectionViewFlowLayout子类来定义frame的的DecorationView
启用自调整大小细胞

预期行为:
A DecorationView应该作为背景放置在每个部分UICollectionView

预期的行为

观察到的行为:
DecorationView崩溃到任意尺寸:

观察到的行为

似乎UICollectionView试图计算自动大小DecorationView.如果我禁用Self-Sizing单元格,则装饰视图将精确放置在预期位置.

有没有办法禁用Self-Sizing DecorationView

在我的UICollectionViewFlowLayout子类中,我只需要截取该部分中的第一个和最后一个单元格并拉伸背景以填充它们下面的空间.问题是UICollectionView不考虑那里计算的大小:

override func layoutAttributesForDecorationView(ofKind elementKind: String, at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
    guard let collectionView = collectionView else {
      return nil
    }

    let section = indexPath.section
    let attrs = UICollectionViewLayoutAttributes(forDecorationViewOfKind: backgroundViewClass.reuseIdentifier(),
                                                 with: indexPath)
    let numberOfItems = collectionView.numberOfItems(inSection: section)
    let lastIndex = numberOfItems - 1

    guard let firstItemAttributes = layoutAttributesForItem(at: IndexPath(indexes: [section, …
Run Code Online (Sandbox Code Playgroud)

ios autolayout uicollectionview swift uicollectionviewflowlayout

8
推荐指数
1
解决办法
319
查看次数

水平 UICollectionView UIKIT 需要顶部标题

我正在为 UICollectionView 实现自定义标头

我需要在水平 CollectionView 的顶部有一个标题。

在此输入图像描述

uikit uicollectionview uicollectionreusableview swift uicollectionviewflowlayout

7
推荐指数
1
解决办法
2020
查看次数

在 UICollectionViewFlowLayout 上设置estimatedItemSize 会破坏UICollectionViewDataSourcePrefetching 吗?

我正在创建一个UICollectionView具有动态高度的单元格并使用estimatedItemSize属性UICollectionViewFlowLayoutApple Docs Reference)。

虽然,我注意到一旦我设置了estimatedItemSize属性,我prefetchItemsAtUICollectionViewDataSourcePrefetching委托方法就不会被调用。

func collectionView(_ collectionView: UICollectionView, prefetchItemsAt indexPaths: [IndexPath])

如果我没有设置estimatedItemSize,预取将再次开始工作。这是已知的行为还是我在这里做错了什么?请帮忙。

示例代码:

class CollectionViewController: UICollectionViewController {

var layout: UICollectionViewFlowLayout = {
    let layout = UICollectionViewFlowLayout()
    let width = UIScreen.main.bounds.size.width
    layout.estimatedItemSize = CGSize(width: width, height: 100)
    return layout
}()

override func viewDidLoad() {
    super.viewDidLoad()
    if #available(iOS 10.0, *) {
        collectionView?.prefetchDataSource = self
    }

    collectionView.collectionViewLayout = layout

    // Register cell classes
    self.collectionView.register(UINib.init(nibName: "CollectionViewCell", bundle: nil), forCellWithReuseIdentifier: reuseIdentifier) …
Run Code Online (Sandbox Code Playgroud)

uikit ios uicollectionview swift uicollectionviewflowlayout

5
推荐指数
0
解决办法
228
查看次数

UICollectionView 粘性标题在集合过度滚动时插入部分后消失一段时间(反弹效果)

UICollectionReusableView用作UICollectionView部分的标题。我启用了“粘性标题”:

let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout
layout?.sectionHeadersPinToVisibleBounds = true
Run Code Online (Sandbox Code Playgroud)

我正在插入新的部分来收集:

collectionView.performBatchUpdates({
    self.collectionView.insertSections(IndexSet(integersIn: collectionView.numberOfSections...viewModel.numberOfSections - 1))
}, completion: nil)
Run Code Online (Sandbox Code Playgroud)

如果在集合过度滚动(启用反弹)时发生插入,标题将消失一段时间(见下面的 GIF)。我怎样才能避免这种行为?

我使用的是 iOS 12.1.4,但同样的问题也发生在 iOS 11.x 和 12.x 模拟器上。

如果关闭反弹效果,问题就不会发生,但我想保持打开状态以获得更平滑的滚动感觉。我在更新之前/之后尝试使布局无效,但没有结果。谢谢你的建议。

在此处输入图片说明

编辑 (02/26/2019)
解决方法:包装插入以performWithoutAnimation阻止标题消失但显然禁用重新加载动画。

UIView.performWithoutAnimation {
    collectionView.performBatchUpdates({
        self.collectionView.insertSections(IndexSet(integersIn: collectionView.numberOfSections...viewModel.numberOfSections - 1))
    }, completion: nil)
}
Run Code Online (Sandbox Code Playgroud)

ios uicollectionview uicollectionreusableview swift uicollectionviewflowlayout

5
推荐指数
1
解决办法
860
查看次数

如何在组合布局中创建弹性标题?

class StretchyHeader: UICollectionViewFlowLayout {

    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {

        let layoutAttributes = super.layoutAttributesForElements(in: rect)! as [UICollectionViewLayoutAttributes]
        let contentOffset = collectionView!.contentOffset

        if (contentOffset.y < 0) {
            let deltaY = abs(contentOffset.y)
            for attributes in layoutAttributes where  attributes.representedElementKind == UICollectionView.elementKindSectionHeader {
                var frame = attributes.frame
                    frame.size.height =  headerReferenceSize.height + deltaY
                    frame.origin.y = frame.minY - deltaY
                    attributes.frame = frame
            }
        }

        return layoutAttributes
    }

    override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool {
        return true
    }

}
Run Code Online (Sandbox Code Playgroud)

尝试将其实现为组合布局,但到目前为止效果不佳。我怎样才能在构图布局中实现这一目标?

uicollectionview uicollectionviewlayout swift uicollectionviewflowlayout uicollectionviewcompositionallayout

5
推荐指数
0
解决办法
384
查看次数

UICollectionView项目顺序不能从右到左语言反转

我注意到一个很大的问题,在从右到左的语言中,单元格顺序没有正确反转,只有对齐是正确的.但仅适用于水平流布局,如果集合视图包含不同的单元格大小!是的,我知道这听起来很疯狂.如果所有单元格大小相同,则排序和对齐方式都很好!

以下是我到目前为止使用示例应用程序(隔离以确保这是实际问题,而不是其他内容):

(第一个柱应始终绘制为蓝色,然后使用索引增加尺寸.) 在此输入图像描述

这是UICollectionViewFlowLayout(在iOS 11上)的内部错误吗?或者有什么明显的东西我不见了?

这是我的测试代码(Nothing fancy + XIB with UICollectionView):

public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 6
}

public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "test", for: indexPath)
    cell.backgroundColor = (indexPath.item == 0) ? UIColor.blue : UIColor.red
    return cell
}

public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width: (10 * indexPath.item) + …
Run Code Online (Sandbox Code Playgroud)

right-to-left ios uicollectionview ios11 uicollectionviewflowlayout

4
推荐指数
1
解决办法
727
查看次数

即使滚动方向设置为水平,UICollectionView仍显示垂直?

我正在尝试UIScrollView使用此代码水平绘制列表,但未按预期工作?

    let nib = UINib(nibName: cellIdentifier, bundle: nil)
    collectionView.register(nib, forCellWithReuseIdentifier: cellIdentifier)
    collectionView.collectionViewLayout = layout(withParentView: view)

    self.collectionView.delegate = self
    self.collectionView.dataSource = self
Run Code Online (Sandbox Code Playgroud)

流式布局法

// #PRAGMA mark - UICollectionViewFlowLayout()

func layout(withParentView parentView: UIView) -> UICollectionViewFlowLayout {
    let layout = UICollectionViewFlowLayout()
    layout.itemSize = CGSize(width: 160, height: 65)
    layout.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
    layout.minimumLineSpacing = 0
    layout.minimumInteritemSpacing = 0
    layout.scrollDirection = .horizontal
    return layout
}
Run Code Online (Sandbox Code Playgroud)

这是委托和数据源方法

func numberOfSections(in collectionView: UICollectionView) -> Int {
    return 1
}

func …
Run Code Online (Sandbox Code Playgroud)

uicollectionview swift uicollectionviewflowlayout

4
推荐指数
1
解决办法
5236
查看次数

UICollectionView 中的节标题,仅出现第一个

我已经为节标题创建了一个类,并将其加载到我的 UICollectionView 中。我能够显示第一个标题(尽管很奇怪,请参见下文),但是以下任何部分标题都是空白的。正在引用尺寸,但内容(背景颜色、标签)不会出现。

然后还有...确实显示的一个节标题,它以大约缩进显示。150px 无明显原因。标题默认居中对齐吗?如果是这样,我将如何左对齐它们?

我的节标题类:

func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
    switch kind {
    case UICollectionView.elementKindSectionHeader:
        let section = indexPath.section
        switch section {
        case 0:
            let tagsHeader = searchCollectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "TagsHeaderView", for: indexPath) as! SectionHeaderView
            tagsHeader.headerString = "Recent Tags"
            tagsHeader.backgroundColor = .green
            return tagsHeader
        default:
            let tagsHeader = searchCollectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "TypeHeaderView", for: indexPath) as! SectionHeaderView
            tagsHeader.headerString = "Type"
            tagsHeader.backgroundColor = .blue
            return tagsHeader
        }
    default:
        return UICollectionReusableView()
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的 …

uicollectionview swift uicollectionviewflowlayout

3
推荐指数
1
解决办法
2041
查看次数