标签: uicollectionviewlayout

UICollectionView:设置新布局和目标内容偏移量

我有一个UICollectionView和两个子类UICollectionViewFlowLayout。选择单元格时,我调用setCollectionViewLayout:animated:在布局之间切换。过渡完成后,选定的单元格居中,这很好。

可以在不实际选择单元格的情况下完成相同的居中行为吗?我尝试调用setContentOffset:animated:不同的方法但没有成功。或者,我可以contentOffset为要显示的布局指定一个自定义的吗?

更清楚地说,我想在不修改单元格selected属性的情况下拥有这样的东西:在此处输入图片说明

编辑#1

这是我已经拥有的:

[self.collectionView selectItemAtIndexPath:indexPath animated:NO scrollPosition:UICollectionViewScrollPositionNone];
[self.collectionView setCollectionViewLayout:layout animated:YES];
Run Code Online (Sandbox Code Playgroud)

看起来不错:https : //www.dropbox.com/s/9u6cnwwdbe9vss0/17249646-0.mov


但如果我跳过selectItemAtIndexPath

[self.collectionView setCollectionViewLayout:layout animated:YES];
[self.collectionView scrollRectToVisible:targetFrame animated:YES];
Run Code Online (Sandbox Code Playgroud)

这不是很好(一种挥手动画):https : //www.dropbox.com/s/s3u2eqq16tmex1v/17249646-1.mov

cocoa-touch objective-c ios uicollectionview uicollectionviewlayout

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

UICollectionView 在更改布局时显示旧单元格

我在 UIViewController 中有一个 UICollectionView 。我还有两种不同的布局,当按下按钮时我会更改为它们。

我在两个 nib 文件中创建的两个单元格之间的布局发生变化。由于这两个单元格做了相同的更改,并且它们的布局只是不同 - 我为它们使用了相同的类,它是 UICollectionViewCell 的子类。

因此,当我的视图加载时,我注册我的两个单元格,如下所示:

[self.tradeFeedCollectionView registerNib:[UINib nibWithNibName:@"BBItemTableViewCell" bundle:nil] forCellWithReuseIdentifier:@"TableItemCell"];
[self.tradeFeedCollectionView registerNib:[UINib nibWithNibName:@"BBItemGridViewCell" bundle:nil] forCellWithReuseIdentifier:@"GridItemCell"];
Run Code Online (Sandbox Code Playgroud)

这两个布局都是 UICollectionViewFlowLayout 的子类。在布局子类中,我只使用一种方法来设置布局/单元格的大小和间距 - 如下所示:

-(id)init
{
    self = [super init];

    if (self){

        self.itemSize = CGSizeMake(320, 80);
        self.minimumLineSpacing = 0.1f;
    }

    return self;
}
Run Code Online (Sandbox Code Playgroud)

这是因为在更改视图时单元格始终具有正确的大小。

要更改视图,我有一个 UIButton,其中包含以下代码:

[self.tradeFeedCollectionView.collectionViewLayout invalidateLayout];

if (!self.gridLayoutActive){

    self.gridLayoutActive = YES;
    [self.tradeFeedCollectionView setCollectionViewLayout:self.grideLayout animated:YES];
    self.lastLayoutUsed = @"GridLayout";

}

else {

    self.gridLayoutActive = NO;

    [self.tradeFeedCollectionView setCollectionViewLayout:self.tableViewLayout animated:YES];
    self.lastLayoutUsed = @"TableLayOut";
}
Run Code Online (Sandbox Code Playgroud)

通过上面的代码,我得到了一个很好的动画,并且两个单元格之间的视图发生变化。

问题

更改视图时,UICollectionView 的可见区域会留下旧单元格,并且尚未更新为新单元格。这些牢房实际上已经改变了形状,但旧牢房的景色却被留下了。当我开始滚动时 …

iphone objective-c ios uicollectionviewcell uicollectionviewlayout

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

迅速定位中心UICollectionViewCell

我正在尝试实现" 快速生效 ",但无法使其正常工作,是否存在我做错的事情?

子类化UICollectionViewFlowLayout和覆盖targetContentOffsetForProposedContentOffset函数:

override func targetContentOffsetForProposedContentOffset(proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint {

    var offsetAdjustment:CGFloat = CGFloat(MAXFLOAT)
    let verticalCenter:CGFloat = proposedContentOffset.y + (CGRectGetHeight(self.collectionView!.bounds) / 2.0)
    let proposedRect:CGRect = CGRectMake(proposedContentOffset.x,0.0,self.collectionView!.bounds.size.width,self.collectionView!.bounds.size.height)

    let array:NSArray = self.layoutAttributesForElementsInRect(proposedRect)!

    for layoutAttributes : AnyObject in array {

        if let _layoutAttributes = layoutAttributes as? UICollectionViewLayoutAttributes {

            if _layoutAttributes.representedElementCategory != UICollectionElementCategory.Cell {
                continue
            }

            let itemVerticalCenter:CGFloat = layoutAttributes.center.y

            let _verticalCenter = fabsf(Float(itemVerticalCenter) - Float(verticalCenter))
            let _offsetAdjustment = fabsf(Float(offsetAdjustment))

            if (_verticalCenter < _offsetAdjustment) {
                offsetAdjustment …
Run Code Online (Sandbox Code Playgroud)

ios uicollectionview uicollectionviewcell uicollectionviewlayout swift

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

iOS 8 UICollectionViewLayout 在 Swift 中切换神秘崩溃

我是新来的UICollectionView。我正在尝试UICollectionViewLayout使用以下代码从网格切换到列表,反之亦然:

@IBAction func switchLayout(sender: AnyObject) {
    isGridLayout = !isGridLayout

    collectionView?.reloadData()

    if isGridLayout {            

        collectionView?.performBatchUpdates({ () -> Void in
            self.collectionView?.collectionViewLayout.invalidateLayout()
            self.collectionView?.setCollectionViewLayout(self.gridLayout, animated: true)
            }, completion: { (completion) -> Void in
        })

    } else {            

        collectionView?.performBatchUpdates({ () -> Void in
            self.collectionView?.collectionViewLayout.invalidateLayout()
            self.collectionView?.setCollectionViewLayout(self.listLayout, animated: true)
            }, completion: { (completion) -> Void in
        })            
    }
}
Run Code Online (Sandbox Code Playgroud)

我一直遇到以下方法崩溃setCollectionViewLayout:animated:,我不明白。任何有关修复此崩溃的帮助都会很棒!

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** setObjectForKey: object cannot be nil (key: <NSIndexPath: 0xc000000000000016> {length = 2, path …
Run Code Online (Sandbox Code Playgroud)

ios uicollectionview uicollectionviewlayout swift

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

如何在uicollectionview中放大单元格的内容

在此处输入图片说明

在上图中,A、B、C、D、E 是集合视图的每个自定义单元格,我想像 c 单元格一样一一放大单元格。

有什么建议吗?

objective-c ios uicollectionview uicollectionviewcell uicollectionviewlayout

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

UICollectionViewData updateItemCounts 崩溃

我从 Apple 的 UICollectionViewFlowLayout 布局代码深处收到崩溃,我不知道如何解决这些问题(下面的堆栈跟踪)。任何建议将不胜感激。

细节:

  • 不幸的是我无法重现这个问题
  • 这个问题并不常见(它发生在不到 0.1% 的会话中)但它是我们的 #1 崩溃
#0. Crashed: com.apple.main-thread
0  libsystem_platform.dylib       0x1879490d4 __bzero + 36
1  UIKit                          0x18e824e40 -[UICollectionViewData _updateItemCounts] + 544
2  UIKit                          0x18e824e40 -[UICollectionViewData _updateItemCounts] + 544
3  UIKit                          0x18e8e67e0 -[UICollectionViewData numberOfSections] + 28
4  UIKit                          0x18f086bc0 -[UICollectionViewFlowLayout _getSizingInfosWithExistingSizingDictionary:] + 612
5  UIKit                          0x18f088834 -[UICollectionViewFlowLayout _fetchItemsInfoForRect:] + 152
6  UIKit                          0x18e8e66b4 -[UICollectionViewFlowLayout prepareLayout] + 224
7  UIKit                          0x18e7cf574 -[UICollectionViewData _prepareToLoadData] + 164
8  UIKit                          0x18e7ceb5c -[UICollectionViewData validateLayoutInRect:] + 100
9  UIKit                          0x18e7ce55c …
Run Code Online (Sandbox Code Playgroud)

ios uicollectionview uicollectionviewlayout

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

尽管实现了sizeForItemAt,UICollectionViewFlowLayout单元格的大小从未改变

我有一个UICollectionViewCell具有UICollectionViewUICollectionViewFlowLayout内。我将单元格作为集合视图的委托和数据源。我正在遵循UICollectionViewDelegateFlowLayout并实现collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize(并返回正确的大小)。

但是,当我打电话时,layout.itemSize.height我得到默认的高度50。

class MyCell: UICollectionViewCell {
  fileprivate lazy var collectionView: UICollectionView = {
    let collectionView = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout())
    collectionView.delegate = self
    collectionView.dataSource = self
    collectionView.register(SomeOtherCell.self, forCellWithReuseIdentifier: SomeOtherCell.reuseIdentifier)
    collectionView.showsHorizontalScrollIndicator = false
    collectionView.showsVerticalScrollIndicator = false
    return collectionView
  }()

  fileprivate lazy var layout: UICollectionViewFlowLayout? = {
    let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout
    layout?.scrollDirection = .horizontal
    layout?.sectionInset = UIEdgeInsets.zero
    return …
Run Code Online (Sandbox Code Playgroud)

ios uicollectionview uicollectionviewlayout swift

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

如何在swift 4的分页模式下在集合视图中使用垂直居中的单元格?

我读了 如何垂直居中 UICollectionView 内容 但是当我在这里使用代码时

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {

let navBarHeight       = self.navigationController?.navigationBar.frame.height
let collectionViewHeight = (self.collectionView?.frame.height)! - navBarHeight!
let itemsHeight        = self.collectionView?.contentSize.height

let topInset = ( collectionViewHeight - itemsHeight! ) / 4

return UIEdgeInsetsMake(topInset ,0, 0 , 0)
}
Run Code Online (Sandbox Code Playgroud)

但是当滚动集合视图时,这将显示不正确的形式,所以这是我的代码,因为我的集合视图单元格是方形的并且等于屏幕宽度

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    showImagesCV.contentInset = UIEdgeInsets(top: spacing, left: spacing, bottom: spacing, right: spacing)
    if let flowLayout = showImagesCV.collectionViewLayout as? UICollectionViewFlowLayout{
        cellWidth = UIScreen.main.bounds.width
        cellHeight = cellWidth //yourCellHeight = …
Run Code Online (Sandbox Code Playgroud)

ios uicollectionview uicollectionviewcell uicollectionviewlayout swift4

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

iOS - 更改 UICollectionView 布局以填充行而不是列

是否可以更改 UICollectionView 以填充行而不是列?这是解释它的图像:

编辑:这是一个水平滚动

编辑 2 :我已经连续容纳了 3 个单元格,我的问题是 4 个单元格没有填充第一行。

在此处输入图片说明

uikit ios uicollectionview uicollectionviewcell uicollectionviewlayout

5
推荐指数
2
解决办法
370
查看次数

用于非网格或半网格布局的 UICollectionView

我正在尝试实现项目的多行序列(如下所示的 Final Cut Pro 或 Adob​​e Premiere pro 中的视频编辑序列)。

虽然我总是可以使用 UIScrollView 并手动放置自定义视图来实现它,但它会很乏味,尤其是在重新排序项目和动画更改以及使用捏合手势缩放时间线时。是否可以使用 UICollectionViewCompositionalLayout 和 UICollectionViewDiffableDataSource 使用 UICollectionView 来实现它?从 WWDC 视频来看,使用组合布局似乎几乎所有事情都是可能的,但尚不清楚是否可以使用它来实现时间线。也许 UICollectionView 不是这个用例的正确范例,应该使用 UIScrollView?即使我使用 UIScrollView,管理诸如拖动和重新排序项目、动画数据源更改、修剪项目、缩放内容也将成为问题。任何指向实现这些功能的现有代码库的指针?

在此处输入图片说明

在此处输入图片说明

ios uicollectionview uicollectionviewlayout swift uicollectionviewcompositionallayout

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