Try doing the animation one runloop after calling -setWantsLayer:, kinda like
this (typed in Mail):
- (void)doAnimation {
[parentView setWantsLayer:YES];
[self performSelector:@selector(noSeriouslyDoTheAnimation) withObject:nil
afterDelay:0];
}
- (void) noSeriouslyDoTheAnimation {
CATransition *transition = [CATransition animation];
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromLeft;
transition.timingFunction = [CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
[CATransaction begin];
[CATransaction setCompletionBlock:^(void) {
[parentView setWantsLayer:NO];
}];
[parentView setAnimations:[NSDictionary dictionaryWithObject:transition
forKey:@"subviews"]];
[[parentView animator] replaceSubview:firstView with:secondView];
[CATransaction commit];
}
On May 17, 2011, at 7:59 PM, Indragie Karunaratne wrote:
> Hi all,
>
> I'm trying to use CATransition in my app to provide an animated slide
> transition when swapping views. I don't want to permanently layer back my
> views because they cause various glitches (no subpixel antialiasing, resize
> issues when backed with a CATiledLayer, etc.) To get around this, I want to
> temporarily layer back my view, run the animation, and then disable layer
> backing after the animation completes. This is my code thus far:
>
> CATransition *transition = [CATransition animation];
> transition.type = kCATransitionPush;
> transition.subtype = kCATransitionFromLeft;
> transition.timingFunction = [CAMediaTimingFunction
> functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
> [parentView setWantsLayer:YES];
> [CATransaction begin];
> [CATransaction setCompletionBlock:^(void) {
> [parentView setWantsLayer:NO];
> }];
> [parentView setAnimations:[NSDictionary dictionaryWithObject:transition
> forKey:@"subviews"]];
> [[parentView animator] replaceSubview:firstView with:secondView];
> [CATransaction commit];
>
> With this code, the animation doesn't run (the views just get swapped without
> animation but the completion block is still called). The problem seems to be
> the fact that I'm calling -setWantsLayer: immediately before the animation
> begins. If I call this method in -awakeForNib, the animation will run. I'm
> thinking that this might be some sort of runloop issue, but I have no idea
> what I can do to work around this. I've tried moving my -setWantsLayer: call
> to various places within the animation method but this has no effect.
>
> Any help is greatly appreciated.
> Thanks,
> Indragie
> --------
> http://indragie.com _______________________________________________
>
> Cocoa-dev mailing list ([email protected])
>
> Please do not post admin requests or moderator comments to the list.
> Contact the moderators at cocoa-dev-admins(at)lists.apple.com
>
> Help/Unsubscribe/Update your Subscription:
> http://lists.apple.com/mailman/options/cocoa-dev/joshaber%40gmail.com
>
> This email sent to [email protected]
_______________________________________________
Cocoa-dev mailing list ([email protected])
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com
This email sent to [email protected]