标签: uicollectionviewlayout

UICollectionView ReloadData 与 ReloadSections

当我使用ReloadSection()它时,重新加载特定部分的数据并最终产生闪烁效果(它添加了一些 alpha 并隐藏)。无论如何要隐藏这个效果吗?

当我使用时它不会出现ReloadData()

iphone ios uicollectionview uicollectionviewlayout ios10

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

如何创建单列集合视图?

我正在尝试创建一个包含 1 列的 collectionView

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

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 10
}
Run Code Online (Sandbox Code Playgroud)

但这没有用。主要问题是我的单元格大小动态变化。那么我可以将列限制为1吗?我需要按行加载单元格,而不是按列加载。

ios uicollectionviewcell uicollectionviewlayout swift

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

iOS 13:UICollectionViewCompositionalLayout 的缓存?

在全新且非常整洁的情况下UICollectionViewCompositionalLayout- 如何UICollectionViewLayoutAttributes在初始创建时缓存?

\n\n

所有已知的方法和属性似乎都已内置,因为新的布局类继承自UICollectionViewLayout.

\n\n

回顾“旧的”自定义UICollectionViewLayout方法,据我所知,此类任务的路径是使用方法prepare()用定制的[UICollectionViewLayoutAttributes].

\n\n

根据我的理解,新的布局类会逐节创建布局,从我们在 WWDC19 演讲“集合视图布局的进展”-> NSCollectionLayoutSection中看到的方法中返回createLayout(). And it seems to do that only once at initialisation.

\n\n

现在,我对 a 进行了子类化UICollectionViewCompositionalLayout,并且layoutAttributesForElements该类按预期返回:

\n\n
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {\n        let superAttributes = super.layoutAttributesForElements(in: rect)\n        print("I am returning attributes: ", supersAttributes)\n        return superAttributes\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

但由于它们不是手动创建的,我在哪里可以最初一次性捕获这些属性以添加到缓存数组中?

\n\n

这条路径的原因是我试图重新创建一个非常非常高的collectionViewLayout,我需要它可缩放。而这(至少在过去)只能通过使用缓存、在 zion 期间修改缓存属性并layoutAttributesForElements(in: rect)在整个生命周期中从缓存返回来获得性能。\n我在 Ray Wenderlich\xc2\xb4s tuturials …

wwdc ios uicollectionview uicollectionviewlayout swift

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

在 UICollectionView 中使用动态大小的单元格重新排序自定义布局

大家好!

因此,我为 UICollectionView 制作了自定义布局。此自定义布局支持动态单元格大小调整(仅更改单元格的宽度)。

此外,UICollectionView 具有拖放功能,使用户能够对单元格重新排序。

  • 关闭动态单元格大小后,重新排序不会出现任何问题(GIF
  • 启用动态单元格大小,在拖动动画期间重新排序会出现一些问题(如下所示)。

示例项目位于此 Github 存储库中:

https://github.com/rgipd/uicollectionview-reorder-error

Github 的 README.md 文件也列出了所有错误。

我已经阅读了一些博客和答案,例如:

https://nshint.github.io/blog/2015/07/16/uicollectionviews-now-have-easy-reordering/

另外,我确实实现了该invalidationContextForInteractivelyMovingItems...方法,但是,即使使用本文中的 NSHint 示例(您可以下载),当您拖动一个小单元格以占据较大单元格的空间时,某些单元格会被替换并出现错误!此外,单元格与中间的光标保持交换,因为对 moveAt 方法的硬编码调用(可能)。文章作者示例中的问题位于 Github 存储库的 Wiki 中:

https://github.com/rgipd/uicollectionview-reorder-error/wiki/NSHint-reorder-collection-view-error

任何人都可以帮我解决这个问题吗?

提前致谢!

更新:2020 年 7 月 28 日 没有新内容。也无法使用简单的水平 UICollectionView 自定义布局来做到这一点。

objective-c ios uicollectionview uicollectionviewlayout swift

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

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

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
查看次数

将徽章(补充视图)添加到 UICollectionLayoutListConfiguration

有什么方法可以将徽章NSCollectionLayoutSupplementaryItem) 添加到 a吗UICollectionLayoutListConfiguration

我正在尝试使用现代集合视图实现侧边栏:

var configuration = UICollectionLayoutListConfiguration(appearance: .sidebar)
...

let section = NSCollectionLayoutSection.list(using: configuration, layoutEnvironment: layoutEnvironment)
Run Code Online (Sandbox Code Playgroud)

但我找不到如何实现badge配置:

var configuration = UICollectionLayoutListConfiguration(appearance: .sidebar)
...

let section = NSCollectionLayoutSection.list(using: configuration, layoutEnvironment: layoutEnvironment)
Run Code Online (Sandbox Code Playgroud)

就像Apple提供的示例代码一样:

let badgeAnchor = NSCollectionLayoutAnchor(edges: [.top, .trailing], fractionalOffset: CGPoint(x: 0.3, y: -0.3))
let badgeSize = NSCollectionLayoutSize(widthDimension: .absolute(20),
                                                  heightDimension: .absolute(20))
let badge = NSCollectionLayoutSupplementaryItem(
                layoutSize: badgeSize,
                elementKind: "badge",
                containerAnchor: badgeAnchor)
Run Code Online (Sandbox Code Playgroud)

(苹果提供的示例代码,顺便说一句崩溃了)

关于如何实现徽章UICollectionLayoutListConfiguration或不可能的任何想法?

uikit ios uicollectionview uicollectionviewlayout swift

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

使用带有流布局的基本 UICollectionView 时奇怪的删除项目动画

我在使用最简单的 UICollectionView 和 UICollectionViewFlowLayout 时遇到了问题。

集合本身工作正常,但是当单元格被删除时,动画就会出现问题。

这是演示该问题的代码示例:

class Cell: UICollectionViewCell { }

class MyViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout {
    var items = Array(repeating: [UIColor.red, .blue, .yellow, .cyan, .magenta, .green], count: 100).flatMap { $0 }
    
    lazy var collectionView: UICollectionView = {
        let collectionViewLayout = UICollectionViewFlowLayout()
        collectionViewLayout.scrollDirection = .vertical
        collectionViewLayout.minimumLineSpacing = 10
        collectionViewLayout.minimumInteritemSpacing = 10
        
        let collectionView = UICollectionView(frame: .zero, collectionViewLayout: collectionViewLayout)
        collectionView.translatesAutoresizingMaskIntoConstraints = false
        collectionView.register(Cell.self, forCellWithReuseIdentifier: "Cell")
        collectionView.delegate = self
        collectionView.dataSource = self
        return collectionView
    }()

    override func viewDidLoad() {
        super.viewDidLoad() …
Run Code Online (Sandbox Code Playgroud)

ios uicollectionview uicollectionviewlayout swift

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

UICollectionViewDelegateFlowLayout之间的区别UICollectionViewFlowLayout

我知道UICollectionViewDelegateFlowLayout是协议,而UICollectionViewFlowLayout是类,并且我知道协议和类之间的区别。据我了解,我可以拥有一个遵循UICollectionViewDelegateFlowLayout协议的类,以实现与继承自UICollectionViewFlowLayout的类完全相同的效果。我通过找到协议和类之间的这种关系来得出这个结论:UICollectionViewDelegateFlowLayout ------------- UICollectionViewFlowLayout collectionView:layout:sizeForItemAtIndexPath:---- itemSize collectionView:layout:insetForSectionAtIndex:--- -sectionInset – collectionView:layout:referenceSizeForHeaderInSection:-headerReferenceSize – collectionView:layout:referenceSizeForFooterInSection:-footerReferenceSize

我还在该协议的参考中阅读了以下内容:“该协议中的所有方法都是可选的。如果您未实现特定方法,则流布局委托将在其自己的属性中使用值来获取适当的间距信息”理解是:如果CollectionView具有布局属性和委托流布局,则委托流布局可能会覆盖某些内容。换句话说,我可以同时拥有该协议和更高的优先级。对?

那么,发明能做同样事情的协议和类背后的逻辑是什么?

ios uicollectionview uicollectionviewlayout uicollectionviewdelegate

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

当在第一个显示的UIViewController中使用时,全屏水平滚动UICollectionView单元向下移动

我正在创建一系列帮助页面,这些页面会在用户首次启动应用程序时显示.为此,我有一个以编程方式设置UIViewController,初始化(编程设置)UICollectionView视图控制器边界的大小.每个单元格包含一个全屏大小的图像.

当已经存在现有视图控制器时按下此视图控制器时,它显示正常.但是,当此视图控制器用作app导航控制器的初始根视图控制器时,集合视图具有正确的大小和对齐方式,但单元格从屏幕顶部向下移动约10个像素,因此集合查看背景显示通过.

虫子的形象 (注意红色是集合视图背景颜色)

如果我在viewDidLoad,viewDidLayoutSubviews或viewWillAppear中设置集合视图,我会遇到同样的问题.如果我在viewDidAppear中设置集合视图,则不会遇到此问题,但这不起作用,因为用户在加载集合视图之前会看到黑屏.

以下是在应用程序中显示视图控制器的代码:didFinishLaunchingWithOptions:launchOptions:

UIViewController* viewControllerToPush = [[OnboardingViewController alloc] initWithNibName:nil bundle:nil];
_nav = [[UINavigationController alloc] initWithRootViewController:viewControllerToPush];
[_nav setNavigationBarHidden:YES];
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[self.window setRootViewController:_nav];
[self.window makeKeyAndVisible];
Run Code Online (Sandbox Code Playgroud)

以下是设置集合视图和布局的代码:

UICollectionViewFlowLayout* layout = [[UICollectionViewFlowLayout alloc] init];
layout.minimumInteritemSpacing = 0;
layout.minimumLineSpacing = 0;
layout.itemSize = CGSizeMake(self.view.bounds.size.width, self.view.bounds.size.height);
layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;

CGRect collectionViewFrame = self.view.bounds;
_collectionView = [[UICollectionView alloc] initWithFrame:collectionViewFrame collectionViewLayout:layout];
_collectionView.delegate = self;
_collectionView.dataSource = self;
_collectionView.pagingEnabled = YES;
_collectionView.showsHorizontalScrollIndicator = NO;

[_collectionView registerClass:[OnboardingCollectionViewCell class] forCellWithReuseIdentifier:@"Cell"];
[self.view addSubview:_collectionView];
Run Code Online (Sandbox Code Playgroud)

uinavigationcontroller ios uicollectionview uicollectionviewcell uicollectionviewlayout

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

没有调用Swift viewWillTransition

我正在创建一个全屏图像库使用UICollectionView.当用户旋转设备时,我会对UICollectionView内部进行更新

func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator)

我以UIViewController模态方式呈现这个并UICollectionView占据了整个屏幕.在内部viewDidLoad,我创建流程布局为:

let flowLayout = UICollectionViewFlowLayout()
flowLayout.scrollDirection = .horizontal
flowLayout.minimumInteritemSpacing = 0
flowLayout.minimumLineSpacing = 0
photosCollectionView.isPagingEnabled = true
photosCollectionView.setCollectionViewLayout(flowLayout, animated: true)
Run Code Online (Sandbox Code Playgroud)

我的大小也是:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return photosCollectionView.frame.size
}
Run Code Online (Sandbox Code Playgroud)

当我旋转设备时,viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator)永远不会调用,这会导致UICollectionViewLayout不更新.当我旋转设备时,我收到消息:

The behavior of the UICollectionViewFlowLayout is not defined because: the item height must be less …
Run Code Online (Sandbox Code Playgroud)

collectionview ios uicollectionviewlayout swift viewwilltransitiontosize

4
推荐指数
2
解决办法
9230
查看次数