Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.1k views
in Technique[技术] by (71.8m points)

macos - How would I do this iOS animation on OSX?

I have a very simple animation in iOS that fades a view, resizes a container to fit another view, then fades that other view back in. It's quite easy to do and very straightforward.

I've been trying to do something pretty much exactly like this on OSX, but I haven't been able to figure out how to do it. The animation stuff on OSX feels so clunky and difficult compared to iOS.

Any help would be much appreciated!!

Thanks! :)

// 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];
                                }];
                    }];
         }];
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

I've written a small class that uses blocks to accomplish essentially the same thing as above when using the animator proxy on OSX.

Please note, this class is not thread safe and hasn't undergone any specific or stressful tests.

//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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...