如何确保更改集合视图单元格显示在手机屏幕的中央?

时间:2016-10-09 04:22:35

标签: ios objective-c uicollectionview uicollectionviewcell uicollectionviewlayout

场景:我有一个每15秒重新加载一次的集合视图。此集合视图中可以包含的单元格数量没有限制,但一次只突出显示一个单元格。只有一个部分,collectionview水平滚动。我需要确保突出显示的单元格始终位于手机屏幕的中央。例如,如果突出显示第24个单元格,则必须一直滚动直到找到它是一种糟糕的用户体验。但是,当集合视图在另外15秒内重新加载时,可以突出显示完全不同的单元格。

See bottom portion of the image for a better idea of highlighted and unhighlighted cells.

以下是我尝试过的与突出显示的单元格的索引路径相关的内容,并确保它位于手机屏幕的中心。

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

  EZPlayerCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"PlayerCellID" forIndexPath:indexPath];

  NSDictionary *rowData = [[_gameBoardDictionary objectForKey:@"players"] objectAtIndex:indexPath.row];

  if ([[rowData objectForKey:@"possession"] integerValue] == 1) {
     cell.isHighlighted = YES;
  } else {
     cell.isHighlighted = NO;
  }

  if (cell.isHighlighted) {

     self.highlightedCellIndexPath = [self.collectionView indexPathForCell:cell];

  } else {

  }

  return cell;
}

- (void)viewDidLayoutSubviews {

  [self.collectionView scrollToItemAtIndexPath:self.highlightedCellIndexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:YES];

}

我尝试了很多东西,但这应该为我的思路提供参考。任何帮助,将不胜感激。非常感谢你!

2 个答案:

答案 0 :(得分:0)

请为" contentSize"添加观察者集合视图的keypath。

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

然后,您可以在observeValueForKeyPath方法中移动滚动代码。

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary  *)changeDict context:(void *)context
{
  [self.collectionView scrollToItemAtIndexPath:self.highlightedCellIndexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:YES];
}

答案 1 :(得分:0)

这就是为我解决问题的原因。我没有尝试在cellForItemAtIndexPath中获取indexPath,而是根据我的数据获取了indexPath,然后滚动到该indexPath的单元格。

NSArray *players = [_gameBoardDictionary objectForKey:@"players"];

self.itemNumber = [players indexOfObjectPassingTest:
                       ^BOOL(NSDictionary *dict, NSUInteger idx, BOOL *stop)
                       {
                           return [[dict objectForKey:@"possession"] isEqual:@1];
                       }
                       ];

[self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:self.itemNumber inSection:0] atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:YES];