Как бы я сделал эту iOS-анимацию на OSX? - PullRequest
23 голосов
/ 17 октября 2011

У меня есть очень простая анимация в iOS, которая затеняет представление, изменяет размеры контейнера, чтобы соответствовать другому представлению, а затем возвращает это другое представление обратно. Это довольно легко сделать и очень просто.

У меня естьпытался сделать что-то в точности как это на OSX, но я не смог понять, как это сделать.Анимация в OSX кажется такой неуклюжей и сложной по сравнению с iOS.

Любая помощь будет высоко оценена !!

Спасибо!:)

// Fade out viewOne, resize frame to fit viewTwo, fade in viewTwo
[UIView animateWithDuration: 0.15
        animations: ^{
            [viewOne setAlpha:0.0];
        }
        completion: ^(BOOL finished) {
            [UIView animateWithDuration: 0.2
                    animations: ^{
                        [self setFrame: [viewTwo frame]];
                    }
                    completion: ^(BOOL finished) {
                        [viewTwo setAlpha: 0.0];
                        [self addSubview: viewTwo];
                        [UIView animateWithDuration: 0.15
                                animations: ^{
                                    [viewTwo setAlpha:1.0];
                                }];
                    }];
         }];

Ответы [ 2 ]

22 голосов
/ 24 октября 2011

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

Обратите внимание, этот класс не является потокобезопасным и не подвергался каким-либо специальным или стрессовым тестам.

//Interface
@interface MZAnimator : NSObject{}

+ (void)animateWithDuration:(NSTimeInterval)duration 
                  animation:(void (^)(void))animationBlock;
+ (void)animateWithDuration:(NSTimeInterval)duration 
                  animation:(void (^)(void))animationBlock
                 completion:(void (^)(void))completionBlock;
@end


//Implementation
@interface MZAnimator ()
+ (void)runEndBlock:(void (^)(void))completionBlock;
@end

@implementation MZAnimator

+ (void)animateWithDuration:(NSTimeInterval)duration 
                  animation:(void (^)(void))animationBlock
{
  [self animateWithDuration:duration animation:animationBlock completion:nil];
}
+ (void)animateWithDuration:(NSTimeInterval)duration 
                  animation:(void (^)(void))animationBlock
                 completion:(void (^)(void))completionBlock
{
  [NSAnimationContext beginGrouping];
  [[NSAnimationContext currentContext] setDuration:duration];
  animationBlock();
  [NSAnimationContext endGrouping];

  if(completionBlock)
  {
    id completionBlockCopy = [[completionBlock copy] autorelease];
    [self performSelector:@selector(runEndBlock:) withObject:completionBlockCopy afterDelay:duration];
  }
}

+ (void)runEndBlock:(void (^)(void))completionBlock
{
  completionBlock();
}
@end
18 голосов
/ 03 декабря 2013

Вы можете использовать:

  [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
    [context setDuration:2.0];
    //Animation code
  } completionHandler:^{
    //Completion Code
    NSLog(@"Completed");
  }];
...