Как бы я сделал эту анимацию iOS на OSX?

#macos #cocoa #uiview #core-animation

#macos #какао #uiview #core-animation

Вопрос:

У меня есть очень простая анимация в 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];
                                }];
                    }];
         }];
  

Ответ №1:

Я написал небольшой класс, который использует блоки для выполнения по существу того же, что и выше, при использовании прокси-сервера animator на 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
  

Комментарии:

1. Хорошее решение 🙂 Чтобы сделать ее еще более похожей, UIView это можно было бы реализовать как категорию NSView ; анимации затем вызывались бы как методы класса NSView .

2. Отличная идея! Несколько функций класса могли бы упростить и усовершенствовать использование. Спасибо!

3. Может быть, это работает. Но какие библиотеки мне нужны, чтобы сделать ее работоспособной?

4. Использование обработчика завершения текущего NSAnimationContext было бы намного проще, чем отправка таймера, что может быть действительно неточным.

Ответ №2:

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

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

Комментарии:

1. Я пробовал это и его мусор. Это так медленно и отстает, и при использовании с такими объектами, как NSButtons, цвет фона исчезает при запуске анимации.