如何在NSCollectionView中禁用动画效果

9
我希望关闭 NSCollectionView 调整大小时发生的“洗牌”动画。这是否可行?

这个问题有进展了吗?我也遇到了同样的问题,不想使用私有API。 - Sunkas
5个回答

5

这段代码可以工作,但它设置了一个私有实例变量,可能不适用于Mac App Store。

[collectionView setValue:@(0) forKey:@"_animationDuration"];

3
kainjow是正确的。加入以下内容:
- (id) animationForKey:(NSString *) key
{
    return nil;
}

对于原型视图子类(不是集合视图!)禁用动画效果


2

对于10.6版本,我能够通过子类化NSView、覆盖animationForKey:方法并返回nil来禁用动画。然后确保您在原型的视图中使用该视图。


动画ForKey: 不是在CALayer上吗,而不是NSView? - Tyler A.
它是NSAnimatablePropertyContainer协议的一部分,而NSView符合该协议。 - kainjow
我的NSCollectionView子类中,animationForKey方法没有被调用。 - voidref
我也无法让这种技术奏效,因此更长的解释或示例将会有所帮助。目前我正在按照Padraig的建议更改私有ivar。 - Mark

2

如需在Swift中禁用所有集合视图的动画,请在可动画之前执行以下操作:

NSAnimationContext.current.duration = 0

1
天才的解决方案 - sumesh

0

我只能在按照以下步骤操作后才能使其正常工作:

1)对NSCollectionViewItem使用的视图进行子类化。该子类视图需要一个CALayer,我将视图子类设置为CALayer的代理。

2)实现CALayer代理方法,以便不会发生任何动画操作:

override func actionForLayer(layer: CALayer, forKey event: String) -> CAAction? {
        return NSNull()
}

3) 最后,在NSCollectionView数据源方法中:

func collectionView(collectionView: NSCollectionView, itemForRepresentedObjectAtIndexPath indexPath: NSIndexPath) -> NSCollectionViewItem {

    // get a new collection view item
    ....

    // disable animations
    CATransaction.begin()
    CATransaction.setDisableActions(true)

    // populate your cell
    ....

    CATransaction.commit()    
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接