33

这很简单,所以我一辈子都找不到问题所在,我查看了文档作为指南,但它仍然没有用。我有一个更大的视图。AnIBAction应该淡出内部视图......就是这样。这是我所拥有的:

NSViewAnimation *theAnim;
NSMutableDictionary *viewDict;

// Create the attributes dictionary for the view.
viewDict = [NSMutableDictionary dictionaryWithCapacity:2];

// Set the target object to be the view.
[viewDict setObject:_innerView forKey:NSViewAnimationTargetKey];

// Set this view to fade out
[viewDict setObject:NSViewAnimationFadeOutEffect forKey:NSViewAnimationEffectKey];

theAnim = [[NSViewAnimation alloc] initWithViewAnimations:@[viewDict]];

// Set some additional attributes for the animation.
[theAnim setDuration:1.0];

// Run the animation.
[theAnim startAnimation];

我检查了viewDictandtheAnim并且NSLog两者都不是nil。我几乎从一个旧程序中复制了这个程序,现在找不到问题所在。

我正在使用 Xcode 5.1.1。

4

2 回答 2

77

现代方法要容易得多:

[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
    context.duration = 1;
    view.animator.alphaValue = 0;
}
completionHandler:^{
    view.hidden = YES;
    view.alphaValue = 1;
}];

如果视图层次结构是分层支持的,那么实际上就足够了:

view.animator.hidden = YES;
于 2014-08-23T03:27:19.803 回答
11

对于那些寻找Swift版本的人:

NSAnimationContext.runAnimationGroup({ context in
    context.duration = 1
    self.view.animator().alphaValue = 0
}, completionHandler: {
    self.view.isHidden = true
    self.view.alphaValue = 1
})

对于支持层的视图,这就足够了:

view.animator().isHidden = true

对于已经使用Swift 5.3或更高版本的用户,您可以在此处利用新的Multiple Trailing Closures语法糖以获得更简洁的版本:

NSAnimationContext.runAnimationGroup { context in
    context.duration = 1
    self.view.animator().alphaValue = 0
} completionHandler: {
    self.view.isHidden = true
    self.view.alphaValue = 1
}
于 2020-06-10T01:30:59.303 回答