如何动画NSCollectionView的scrollToIndexPaths:scrollPosition:?

时间:2016-06-15 15:13:46

标签: objective-c macos cocoa appkit nscollectionview

我试图动画NSCollectionView scrollToIndexPaths:scrollPosition:,根据文档可以实现此消息发送到集合视图的animator代理。但是,我无法让它发挥作用。

我已经设置了一个非常简单的项目,其中只包含一个集合视图,并创建了1000个100x100项目。一个简单的操作将可见索引路径增加50并尝试滚动到它。我的滚动代码如下:

- (IBAction)increment:(id)sender {
  NSIndexPath *visibleIndexPath = [[self.collectionView indexPathsForVisibleItems] anyObject];
  NSIndexPath *toIndexPath = [NSIndexPath indexPathForItem:visibleIndexPath.item + 50 inSection:visibleIndexPath.section];
  [self.collectionView.animator scrollToItemsAtIndexPaths:[NSSet setWithObject:toIndexPath] scrollPosition:NSCollectionViewScrollPositionCenteredHorizontally];
}

这会将集合视图跳转到目标索引路径,但不会设置动画。基于我在此发现的其他一些主题,我确保滚动视图也是图层支持的:

enter image description here

项目中唯一的其他代码是在viewDidLoad:中设置集合视图和流布局的几行:

  // Do any additional setup after loading the view.
  NSCollectionViewFlowLayout *flowLayout = [[NSCollectionViewFlowLayout alloc] init];
  flowLayout.itemSize = CGSizeMake(100.f, 100.f);
  flowLayout.scrollDirection = NSCollectionViewScrollDirectionHorizontal;
  self.collectionView.collectionViewLayout = flowLayout;

  [self.collectionView registerClass:[CollectionViewItem class] forItemWithIdentifier:@"identifier"];

是否有人能够使用scrollToIndexPaths:scrollPosition:制作动画?文档听起来很明显,但我无法让它工作。

3 个答案:

答案 0 :(得分:7)

我遇到了同样的问题并花了一些时间来修复它。它们具有隐式动画的概念,其注意非属性改变代码。即看起来像animator会为某些属性设置动画,但不会对其他布局更改设置动画。允许那些"其他"更改是动画的,您必须将允许隐式动画设置为当前动画上下文。这是我的工作代码:

let ctx = NSAnimationContext.current()
ctx.allowsImplicitAnimation = true

collectionView.animator().scrollToItemsAtIndexPaths(Set<NSIndexPath>(arrayLiteral: nextPath), scrollPosition: .TrailingEdge)

注意:我编辑了代码段以支持更新的Swift语法。

答案 1 :(得分:2)

因为我的应用程序在ObjectiveC中,所以我翻译了Swift的上述答案,并在真实代码中对其进行了测试:

[NSAnimationContext beginGrouping];
[[NSAnimationContext currentContext] setDuration:0.5];
[NSAnimationContext currentContext].allowsImplicitAnimation=YES;
[[myCollectionView animator] scrollToItemsAtIndexPaths:myIndexPathSet scrollPosition:NSCollectionViewScrollPositionNearestHorizontalEdge];
[NSAnimationContext endGrouping];

答案 2 :(得分:-3)