当我使用ReloadSection()它时,重新加载特定部分的数据并最终产生闪烁效果(它添加了一些 alpha 并隐藏)。无论如何要隐藏这个效果吗?
当我使用时它不会出现ReloadData()
我正在尝试创建一个包含 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吗?我需要按行加载单元格,而不是按列加载。
在全新且非常整洁的情况下UICollectionViewCompositionalLayout- 如何UICollectionViewLayoutAttributes在初始创建时缓存?
所有已知的方法和属性似乎都已内置,因为新的布局类继承自UICollectionViewLayout.
回顾“旧的”自定义UICollectionViewLayout方法,据我所知,此类任务的路径是使用方法prepare()用定制的[UICollectionViewLayoutAttributes].
根据我的理解,新的布局类会逐节创建布局,从我们在 WWDC19 演讲“集合视图布局的进展”-> NSCollectionLayoutSection中看到的方法中返回createLayout(). And it seems to do that only once at initialisation.
现在,我对 a 进行了子类化UICollectionViewCompositionalLayout,并且layoutAttributesForElements该类按预期返回:
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}\nRun Code Online (Sandbox Code Playgroud)\n\n但由于它们不是手动创建的,我在哪里可以最初一次性捕获这些属性以添加到缓存数组中?
\n\n这条路径的原因是我试图重新创建一个非常非常高的collectionViewLayout,我需要它可缩放。而这(至少在过去)只能通过使用缓存、在 zion 期间修改缓存属性并layoutAttributesForElements(in: rect)在整个生命周期中从缓存返回来获得性能。\n我在 Ray Wenderlich\xc2\xb4s tuturials …
。
大家好!
因此,我为 UICollectionView 制作了自定义布局。此自定义布局支持动态单元格大小调整(仅更改单元格的宽度)。
此外,UICollectionView 具有拖放功能,使用户能够对单元格重新排序。
示例项目位于此 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
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
有什么方法可以将徽章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或不可能的任何想法?
我在使用最简单的 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) 我知道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
我正在创建一系列帮助页面,这些页面会在用户首次启动应用程序时显示.为此,我有一个以编程方式设置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
我正在创建一个全屏图像库使用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
ios ×9
swift ×7
ios10 ×1
iphone ×1
objective-c ×1
uicollectionviewcompositionallayout ×1
uikit ×1
wwdc ×1