【问题标题】:How would I do this iOS animation on OSX?我将如何在 OSX 上制作这个 iOS 动画?
【发布时间】:2011-12-08 23:51:38
【问题描述】:

我在 iOS 中有一个非常简单的动画,它淡化一个视图,调整一个容器的大小以适应另一个视图,然后淡化另一个视图。这很容易做到而且非常简单。

我一直在尝试在 OSX 上做类似这样的事情,但我无法弄清楚如何去做。与 iOS 相比,OSX 上的动画感觉如此笨拙和困难。

任何帮助将不胜感激!

谢谢! :)

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

【问题讨论】:

    标签: macos cocoa uiview core-animation


    【解决方案1】:

    我编写了一个小类,在 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
    

    【讨论】:

    • 不错的解决方案 :-) 为了使它更像UIView,可以将其实现为NSView 的类别;然后动画将作为NSView 的类方法调用。
    • 好主意!一些类函数可以简化和改进用法。谢谢!
    • 也许可行。但是我需要哪些库才能使其可行?
    • 使用当前 NSAnimationContext 的完成处理程序比调度计时器要好得多,这可能真的不准确。
    【解决方案2】:

    你可以使用:

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

    【讨论】:

    • 我试过这个和它的垃圾。它是如此缓慢和滞后,当与 NSButtons 等对象一起使用时,动画开始时背景颜色会消失。
    猜你喜欢
    • 2015-02-22
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 2016-09-30
    • 2015-06-26
    • 1970-01-01
    相关资源
    最近更新 更多