Не удается заставить [[id Animator] setAlphaValue: 0.0] работать - PullRequest
3 голосов
/ 13 июня 2011

Я пытаюсь анимировать исчезновение непрозрачности + изменение размера кадра NSImageView.FrameSize работает плавно, но по какой-то причине альфа-значение просто переходит непосредственно к своему окончательному значению в начале анимации.Я попытался отложить наложение суперпредставления, и у меня заканчиваются идеи здесь.Вот мой пример кода ->

AABLCLogo   -> NSImageView IBOutlet
speed       -> 1.0f 

//setting target frame for image view

NSRect newFrame      = [AABLCLogo frame];
newFrame.origin.x    = newFrame.origin.x + (newFrame.size.width*0.1);
newFrame.origin.y    = newFrame.origin.y + (newFrame.size.height*0.1);
newFrame.size.width  = newFrame.size.width * 0.8;
newFrame.size.height = newFrame.size.height * 0.8;

//backing layer for super view

[[AABLCLogo superview] setWantsLayer:YES];

//animating image view

[NSAnimationContext beginGrouping];
[[NSAnimationContext currentContext] setDuration: speed];
[[AABLCLogo animator] setFrame: newFrame];
[[AABLCLogo animator] setAlphaValue: 0.0];
[NSAnimationContext endGrouping];

//XCode 4 delay snippet

double delayInSeconds   = speed;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 
                                        delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, 
               dispatch_get_main_queue(), 
               ^(void) {

    //code executes after ''speed'' seconds

    [[AABLCLogo superview] setWantsLayer:NO];
    [[self view] removeFromSuperview];

                });

Ответы [ 3 ]

0 голосов
/ 07 декабря 2011

Вы хотите отправить setWantsLayer: YES представлению, которое вы анимируете, а не его суперпредставлению.

setViewAlphaValue NSView: работает только на уровне слоя или экземпляре размещения слоя, так каконо перенаправляет значение в свойство opacity слоя NSView.

Для полной истории прочитайте «Обсуждение» setAlphaValue NSView: в документации Apple.

0 голосов
/ 08 декабря 2011

Я полагаю, что запрашиваемый вами слой не будет создан, пока в следующий раз не будет отображено представление.

Таким образом, вам нужно либо принудительно отобразить суперпредставление, либо дождаться следующей итерации цикла выполнения, прежде чем добавлять анимацию.

0 голосов
/ 08 июля 2011

Я подозреваю, что это проблема с анимацией в главном потоке.В большинстве случаев, если вы хотите анимировать две вещи одновременно, вам нужно использовать NSViewAnimation.Используйте этот код в качестве руководства, он изменяет размеры окна, а часть его содержимого исчезает.

NSRect newWindowFrame = NSMakeRect(self.window.frame.origin.x, self.window.frame.origin.y, 640, self.window.frame.size.height);
NSMutableArray *viewAnimations = [NSMutableArray array];
NSDictionary *windowSizeDict = [NSDictionary dictionaryWithObjectsAndKeys:self.window, NSViewAnimationTargetKey, [NSValue valueWithRect:newWindowFrame], NSViewAnimationEndFrameKey, nil];
[viewAnimations addObject:windowSizeDict];

NSDictionary *animateOutDict = [NSDictionary dictionaryWithObjectsAndKeys:self.dataSidebarController.containerView, NSViewAnimationTargetKey, NSViewAnimationFadeOutEffect, NSViewAnimationEffectKey, nil];
[viewAnimations addObject:animateOutDict];

NSViewAnimation *animation = [[NSViewAnimation alloc] initWithViewAnimations:viewAnimations];
[animation setDuration:0.35];
[animation setAnimationBlockingMode:NSAnimationNonblocking];
[animation setDelegate:self];
[animation startAnimation];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...