2013-09-26 15 views
1

Я использую NSWindow без полей, чтобы создать меню выпадающего меню, которое вы можете найти во многих приложениях IOS. В настоящее время я использую setFrame: display: animate: с двумя предустановленными прямоугольниками, чтобы создать эффект скольжения, и у меня также есть анимация, которая угасает фон mainwindow, который в настоящее время работает после, окно закончило анимацию.NSWindow's setFrame: display: animimate: запускается одновременно с другими анимациями

Я бы очень хотел запустить обе эти анимации одновременно. Однако setFrame: display: animate, кажется, блокирует все остальные коды до тех пор, пока они не закончатся.

Есть ли способ переопределить эту функцию setFrame: display: animate? Или может кто-нибудь порекомендовать работу?

У меня есть методы работы, которые запускают [[self animator] setFrame: display:], но я бы предпочел использовать setFrame: display: animimate, потому что он сильно зависит от моего текущего кода и легко настраивается на длительность.

Некоторый код:

//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]; 
} 

И это другая анимация у меня есть, которая в настоящее время работает после 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"]; 

ответ

2

решаемая проблема с использованием NSAnimationContext вместе с [[само] аниматор setAlphaValue:], которые позволяют мне работать одновременно анимации, а затем выполнить блок на доработку.

Документация:

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 
myClass __weak *weakSelf = self; 


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

    ... //other animations 

}completionHandler:^{ 
    NSLog(@"done"); 
    [[weakSelf overCastView]removeFromSuperview]; 
    weakSelf.overCastView = nil; 
}]; 
0

Следующие работал для меня (с кредита this answer). Я думаю, что это более «правильное» решение из-за явного ответа 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];