1

多くの IOS アプリで見られるようなスライド アウト メニューを作成するために、ボーダーレス NSWindow を使用しています。現在、setFrame:display:animate: を 2 つの定義済み四角形と共に使用してスライド効果を作成しています。また、メインウィンドウの背景をフェードさせるアニメーションもあり、ウィンドウのアニメーションが終了したに現在実行されています。

両方のアニメーションを同時に実行したいと考えています。ただし、 setFrame:display:animate は、完了するまで他のすべてのコードをブロックしているようです。

setFrame:display:animate のこの機能をオーバーライドする方法はありますか? または、誰かが回避策を推奨できますか?

[[self animator]setFrame:display:] を実行する実用的なメソッドがありますが、setFrame:display:animate を使用することを好みます。これは、現在のコードで頻繁に使用されており、持続時間の設定が簡単だからです。

いくつかのコード:

//Currently used to animate the window
-(void)showPopWindow{
    [self selectAnimationTimeFor:NCpOpen];    
    [self setFrame:_initialRect display:YES];
    [self makeKeyAndOrderFront:NSApp];
    [self setFrame:_finalRect display:YES animate:YES];
}

これは私が持っているもう 1 つのアニメーションで、現在 setFrame が終了した後に実行されます (これは NSView のレイヤーで実行されることに注意してください)。

//...
[layer setBackgroundColor:CGColorCreateGenericRGB(0, 0, 0, 0.5)];

CABasicAnimation *fadeInBackground = [CABasicAnimation animationWithKeyPath:@"opacity"];
fadeBackground.duration = [self openAnimationResizeTime];
fadeBackground.fromValue = [NSNumber numberWithFloat:0.0f];
fadeBackground.toValue = [NSNumber numberWithFloat:1.0f];

[layer addAnimation:fadeInBackground forKey:@"opacity"];
4

2 に答える 2

3

[[self animator]setAlphaValue:] と共に NSAnimationContext を使用することで問題を解決しました。これにより、同時にアニメーションを実行し、完了時にブロックを実行できます。

ドキュメンテーション:

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/NSAnimationContext_class/Introduction/Introduction.html#//apple_ref/occ/clm/NSAnimationContext/runAnimationGroup:completionHandler :

作業コード:

// To avoid a strong reference cycle to self in block
__weak typeof(self)weakSelf = self;

[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
    [context setDuration: myDuration];
    [[weakSelf animator] setFrame:_initialRect display:YES];

    // ... other animations

} completionHandler:^{
    NSLog(@"done");
    [[weakSelf overCastView] removeFromSuperview];
    weakSelf.overCastView = nil;
}];
于 2013-09-27T02:40:37.870 に答える
0

以下は私にとってはうまくいきました(この回答の功績による)。明示的なため、これはより「正しい」ソリューションだと思いますNSAnimationNonblocking

NSRect myNewFrame = NSMakeRect(0, 0, 123, 456);

NSDictionary* windowResize = [NSDictionary dictionaryWithObjectsAndKeys: window, NSViewAnimationTargetKey, [NSValue valueWithRect: myNewFrame], NSViewAnimationEndFrameKey, nil];
NSArray* animations = [NSArray arrayWithObjects:windowResize, nil];
NSViewAnimation* animation = [[NSViewAnimation alloc] initWithViewAnimations: animations];

[animation setAnimationBlockingMode: NSAnimationNonblocking];
[animation setAnimationCurve: NSAnimationEaseIn];
[animation setDuration: 0.4];     
[animation startAnimation]; 
于 2015-09-15T06:42:38.733 に答える