加载后如何将 UICollectionView 单元格居中?

Posted

技术标签:

【中文标题】加载后如何将 UICollectionView 单元格居中?【英文标题】:How to centerize a UICollectionView cell after it has been loaded? 【发布时间】:2017-06-04 14:51:33 【问题描述】:

下面我的代码使其居中:-

- (void)centerUpNext:(NSIndexPath*)indexPath 
    //[super viewDidLayoutSubviews];
    [self.collectionView2 scrollToItemAtIndexPath:indexPath
                                    atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:YES];

这就是我分配 indexPath 值的方式:-

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView
                  cellForItemAtIndexPath:(NSIndexPath *)indexPath

    if(result == NSOrderedDescending)
        
            NSLog(@"reminderTime is later than systemTime");
            self.upNextIndexPath = indexPath;
        

我会从 viewWillAppear 中调用它

-(void) viewWillAppear:(BOOL)animated
[self centerUpNext:self.upNextIndexPath];

这没有按预期工作。因为在加载集合视图后我无法将确切的单元格居中。我应该在何时何地调用此方法[self centerUpNext:self.upNextIndexPath];

【问题讨论】:

首先,您是否获得了您想要获得的indexPath?如果在viewWillAppear 中执行print(self.upNextIndexPath),它是否显示了您想要居中的正确单元格? 【参考方案1】:

我认为使用KVO 是最好的解决方案。

viewDidLoad,可以添加

[self.collectionView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:"contentSize"];

然后:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context 
    if ([keyPath isEqual: @"contentSize"]) 
        if ([change[NSKeyValueChangeNewKey] CGSizeValue].height != 0 && [change[NSKeyValueChangeNewKey] CGSizeValue].width != 0) 
        [self centerUpNext:self.upNextIndexPath];
    

【讨论】:

以上是关于加载后如何将 UICollectionView 单元格居中?的主要内容,如果未能解决你的问题,请参考以下文章

首次加载后如何在 UICollectionView 中选择一些项目?

页面加载时滚动后如何访问 UICollectionView 中的特定单元格?

完成加载后,在 UICollectionView 中的第一个单元格上调用函数

iOS - 如何在将单元格动态插入 UICollectionView 之前正确重新加载单元格

UICollectionView 在滚动 Alamofire 时将图像加载到错误的位置

如果在重新加载期间触摸单元格,则重新加载后无法选择 UICollectionView 单元格