标签: uicollectionviewlayout

UICollectionViewFlowLayout vs子类化UICollectionViewLayout

我知道如果您正在做任何"像网格或基于行的破坏布局",那么记录的建议是使用UICollectionView Flow Layout.但是,我不确定这是否属实.

我想要一个网格,但想要一个换行符布局.物品应水平和垂直无限布局,无需堆叠.基本上,如果内容超出框架,则可以水平或垂直滚动​​的巨型棋盘.

要继承UICollectionView 布局,我必须:

  1. 覆盖prepareLayout以阻止布局包装项目.这似乎很多工作.
  2. 覆盖collectionViewContentSize.

Apple表示他们在制作UICollectionView Flow Layout 方面做了大量的努力工作,所以如果可以,我应该利用它.但是,如果我必须覆盖prepareLayout以关闭断线,我怀疑我正在丢弃他们的大部分工作.在剩下的工作中,我可能不会使用大部分工作(例如minimumLineSpacingForSectionAtIndex).

因为我想要的布局是如此简单,我怀疑我应该继承UICollectionViewLayout,因为:

  1. 我将在一个布局类中使用更简单,更清晰的实现,而不是在子类和委托之间传播.
  2. 我认为它不会比继承UICollectionView Flow Layout 更难,因为我必须prepareLayout在两种情况下都要覆盖,我怀疑这是所有艰苦工作的地方.
  3. 我会更自然地以自定义方式调整其他UICollectionViewLayoutAttributes,而不是尝试在UICollectionView Flow Layout子类之上添加另一个kludge .

我的结论是否正确?

ios uicollectionview uicollectionviewlayout

14
推荐指数
1
解决办法
7888
查看次数

在选择时为UICollectionView单元设置动画

我有一个基本网格UICollectionView.这是一个简单的2列,多行布局使用UICollectionViewDelegateFlowLayout.选择单元格后,我想调暗背景,将单元格浮动到屏幕中心,然后根据所选单元格设置工作流程.我很新UICollectionViews,而且我不确定最好的方法.

UICollectionView在选择单元格时,我应该有for 的自定义布局吗?

或者有一种方法可以动画选定的单元格,而无需创建新的布局

如果有人能让我朝着正确的方向前进,我想我会很好地研究如何执行它.

ios uicollectionview uicollectionviewcell uicollectionviewlayout

14
推荐指数
2
解决办法
1万
查看次数

iOS 8上的UICollectionView自调整单元格将与UIDynamic flowLayout崩溃并重复调用_updateVisibleCellsNow

我正在尝试使用所谓的"自我调整单元",这意味着:

  • 设置estimatedItemSizeflowLayout
  • 超越控制preferredLayoutAttributesFittingAttributes细胞类

例如:UICollectionView具有自动布局的自定义单元格

我需要这样的动态效果:http://www.teehanlax.com/blog/implementing-a-bouncy-uicollectionviewlayout-with-uikit-dynamics/

没有UIDynamic,它工作正常,但我需要UIDynamic.正如我所看到的那样,它会调用prepareLayout并且layoutAttributesForElementsInRect直到死亡,将会有太多_updateVisibleCellsNow排队等待.

我不知道如何解决这个问题,如果你看到,请帮助我.或者,如果我以错误的方式使用这些技术,请告诉我.

ios uicollectionview uicollectionviewcell uicollectionviewlayout uikit-dynamics

14
推荐指数
1
解决办法
2694
查看次数

UICollectionView水平分页,页面之间有空格

我正在寻找一种UIPageViewController用a 替换原生水平分页的方法UICollectionView.

到目前为止,我做了以下事情:

let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .horizontal
layout.itemSize = collectionView.frame.size
layout.minimumLineSpacing = 0
layout.minimumInteritemSpacing = 10

collectionView.setCollectionViewLayout(layout, animated: false)
collectionView.isPagingEnabled = true
collectionView.alwaysBounceVertical = false
Run Code Online (Sandbox Code Playgroud)

这工作正常,我得到水平分页效果.

现在我想要添加的页面之间的水平空间(像你将做UIPageViewControllerOptionInterPageSpacingKeyUIPageViewController)

到目前为止,我无法在不损坏分页效果的情况下添加空格.我正在寻找与以下相同的行为UIPageViewController:单元格应该填满整个屏幕宽度,并且单元格之间的空间应该只在切换页面时可见.

uikit ios uipageviewcontroller uicollectionview uicollectionviewlayout

14
推荐指数
1
解决办法
1万
查看次数

具有自动调整大小的单元格的自定义UICollectionViewLayout以较大的估计项目高度中断

我正在构建一个UICollectionViewLayout支持自动调整单元格的自定义,当估计项目高度大于最终高度时,我遇到了问题.当首选布局属性触发部分失效时,下面的某些单元格变为可见,并非所有单元格都应用了正确的框架.

在下图中,左侧屏幕截图显示了具有较大估计高度的初始渲染,右侧图像显示了估计高度小于最终高度的位置.

在iOS 10和11上会出现此问题.

使用较小的估计高度,布局期间内容大小会增加,并且首选布局属性不会导致更多项目移动到可见矩形中.集合视图完美地处理这种情况.

失效和帧计算的逻辑似乎是有效的,所以我不确定为什么集合视图不处理部分失效导致新项目进入视图的情况.

当更深入地检查时,看起来将被移动到视图中的最终视图被无效并被要求计算它们的大小,但是它们的最终属性未被应用.

在此输入图像描述

这是用于演示目的的自定义布局的非常精简版本的布局代码,它展示了这个故障:

/// Simple demo layout, only 1 section is supported
/// This is not optimised, it is purely a simplified version
/// of a more complex custom layout that demonstrates
/// the glitch.
public class Layout: UICollectionViewLayout {

    public var estimatedItemHeight: CGFloat = 50
    public var spacing: CGFloat = 10

    var contentWidth: CGFloat = 0
    var numberOfItems = 0
    var heightCache = [Int: CGFloat]()

    override public func prepare() {
        super.prepare()

        self.contentWidth …
Run Code Online (Sandbox Code Playgroud)

uikit ios uicollectionview uicollectionviewlayout

14
推荐指数
2
解决办法
911
查看次数

UIDynamicAnimator +自定义UICollectionViewLayout导致永久圆周运动

我一直在复制2013 WWDC Session 217"探索iOS 7上的滚动视图".我正在使用Xcode 7 beta 2,我的项目仅限iOS 9.

我试图以类似于会话217中提供的方式UIDynamicAnimator使用my UICollectionViewLayout来模仿Messages.app的感觉.我UICollectionViewLayout是一个习惯性的,出于某种原因,我的细胞似乎在我的项目中以圆周运动反弹.

这是我的自定义布局代码.

// Didn't write this code myself, but should be pretty simple to follow. @Goles  


#import "VVSpringCollectionViewFlowLayout.h"  

@interface VVSpringCollectionViewFlowLayout()  
@property (nonatomic, strong) UIDynamicAnimator *animator;  
@end  

@implementation VVSpringCollectionViewFlowLayout  

-(id)init {  
    if (self = [super init]) {  
        _springDamping = 0.5;  
        _springFrequency = 0.8;  
        _resistanceFactor = 500;  
    }  
    return self;  
}  

- (id)initWithCoder:(nonnull NSCoder *)aDecoder {  
  self = [super initWithCoder:aDecoder];  
  if (self) {  
        _springDamping = 0.5;  
        _springFrequency …
Run Code Online (Sandbox Code Playgroud)

ios uicollectionview uicollectionviewlayout uidynamicanimator swift

13
推荐指数
1
解决办法
1764
查看次数

设备轮换后的UICollectionView contentOffset

我想做什么:

在Apple的Photo's App上,如果在滚动到任意偏移的同时旋转设备,预先在中心的相同单元将在旋转后终止于中心.

我试图用UICollectionView实现相同的行为.' indexPathsForVisibleItems '似乎是这样做的方式....

到目前为止我得到了什么:

以下代码提供了旋转之间的平滑操作,但中心项计算似乎是关闭的:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    self.collectionView?.collectionViewLayout.invalidateLayout()

    let middleItem = (self.collectionView?.indexPathsForVisibleItems.count / 2) - 1
    let indexPath = self.collectionView?.indexPathsForVisibleItems[middleItem]

    coordinator.animate(alongsideTransition: { ctx in

        self.collectionView?.layoutIfNeeded()
        self.collectionView?.scrollToItem(at: indexPath!, at: .centeredVertically, animated: false)

    }, completion: { _ in


    })
}
Run Code Online (Sandbox Code Playgroud)

什么不适用于上述代码:

  1. 肖像 - >风景:从细胞最终应该在中心处稍微偏离.
  2. 肖像 - >风景 - >肖像:完全偏离肖像中的偏移量.
  3. 人像 - >风景 - >人像 - >风景:离开!

笔记:

  • 由于必须重新计算单元格大小和间距,我必须在旋转时使集合视图布局无效.
  • self.collectionView?.layoutIfNeeded()位于动画
    块内,使转换顺利进行
  • 可能是在集合视图布局未完成之前调用scrollToItem,导致不正确的滚动偏移?

替代方法? …

uiscrollview ios uicollectionview uicollectionviewlayout swift

13
推荐指数
2
解决办法
4785
查看次数

带有 groupPagingCentered 的 UICollectionViewCompositionalLayout 未开始居中

我的布局代码非常简单,您将在有关新组合布局的每个教程或文章中看到这一点。

  func createLayout() -> UICollectionViewLayout {
    let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0), heightDimension: .fractionalHeight(1.0))
    let item = NSCollectionLayoutItem(layoutSize: itemSize)
    item.contentInsets = .init(top: 0, leading: 5, bottom: 0, trailing: 5)

    let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(0.93), heightDimension: .fractionalHeight(1.0))
    let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item])

    let section = NSCollectionLayoutSection(group: group)
    section.orthogonalScrollingBehavior = .groupPagingCentered

    let layout = UICollectionViewCompositionalLayout(section: section)
    return layout
  }
Run Code Online (Sandbox Code Playgroud)

当我启动应用程序时,单元格未正确居中。只有当我将单元格拖动最微小的量时,它才会弹到正确的位置。

前:

在此输入图像描述

当我拖动它一点点后:

在此输入图像描述

我还没有看到任何关于同样问题的问题。Twitter 或博客上没有人谈论它。不确定我在这里做错了什么?

uikit uicollectionview uicollectionviewlayout swift

13
推荐指数
2
解决办法
2904
查看次数

带有 pinToVisibleBounds 的 UICollectionView 组合布局标头被单元格奇怪地遮挡

我正在使用 UICollectionView 组合布局,并希望有一个粘在顶部的标题

这应该可以与

header.pinToVisibleBounds = true
Run Code Online (Sandbox Code Playgroud)

但是,在滚动过程中,标题会奇怪地被遮挡,看起来像一个错误...此外,看起来只有位于可见屏幕之外的单元格,当重新加载时,会遮挡标题

迅速

你可以在这个视频中看到它 https://www.dropbox.com/s/n5myzfceuiwzb39/stackoverflow-unsatable-header.mov?dl=0

这就是整个布局的构建方式

func buildLayout() -> UICollectionViewCompositionalLayout {

    // cells
    let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(0.5), heightDimension: .absolute(90))
    let item = NSCollectionLayoutItem(layoutSize: itemSize)
    item.contentInsets = NSDirectionalEdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0)

    let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .absolute(90))
    let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitem: item, count: 2)
    group.contentInsets = NSDirectionalEdgeInsets(top: 0, leading: 20, bottom: 0, trailing: 20)
    group.interItemSpacing = .fixed(10)

    let section = NSCollectionLayoutSection(group: group)
    section.interGroupSpacing = 10
    section.contentInsets = NSDirectionalEdgeInsets(top: …
Run Code Online (Sandbox Code Playgroud)

cocoa-touch uicollectionview uicollectionviewlayout swift uicollectionviewcompositionallayout

13
推荐指数
0
解决办法
5147
查看次数

iOS 15 UICollectionView 的 UICollectionViewRecursion 问题

该应用程序在 Xcode 12 和 iOS 14 之前工作正常,但一旦我升级到 Xcode 13 / iOS 15,我的应用程序就停止工作,并显示以下错误日志

2021-11-26 12:49:38.844428+0530 Mitaja[6170:102791] [UICollectionViewRecursion] cv == 0x7feb458e0000 Enabling recursion trigger logging
2021-11-26 12:49:39.040798+0530 Mitaja[6170:102791] [UICollectionViewRecursion] UICollectionView 0x7feb458e0000 Visible cells update scheduled with call stack:
 (
    0   UIKitCore                           0x00007fff24644a06 -[UICollectionView _setNeedsVisibleCellsUpdate:withLayoutAttributes:] + 107
    1   UIKitCore                           0x00007fff24675708 -[UICollectionView _invalidateLayoutWithContext:] + 1310
    2   UIKitCore                           0x00007fff246a660c -[UICollectionViewLayout invalidateLayoutWithContext:] + 200
    3   UIKitCore                           0x00007fff2469a329 -[UICollectionViewFlowLayout invalidateLayoutWithContext:] + 667
    4   UIKitCore                           0x00007fff246a3b5f -[UICollectionViewFlowLayout _didPerformUpdateVisibleCellsPassWithLayoutOffset:] + 430
    5   UIKitCore                           0x00007fff24653a33 -[UICollectionView _updateVisibleCellsNow:] + 10438
    6 …
Run Code Online (Sandbox Code Playgroud)

uicollectionview uicollectionviewlayout ios15

13
推荐指数
1
解决办法
4234
查看次数