On Mar 2, 2011, at 2:12 PM, Roland King wrote:

> I was trying to animate the backgroundColor of one of my UIView subclasses 
> yesterday using 
> 
>       [ UIView animateWithDuration:2.0 animations:^{ [ myView 
> setBackgroundColor:someColor ]; } ];
> 
> but no matter what the duration set, the background color was changing 
> instantly. Whilst looking to see if there were two places I called 
> setBackgroundColor: (there weren't) I realized that my UIView subclass has 
> its own drawRect: method (this view is basically a piece of paper with some 
> lines drawn on it, so it needs a custom drawRect: method). Commenting that 
> out, the view background animated properly, but of course I had no content. 
> Even just adding an empty drawRect: method was enough to defeat the 
> animation. 
> 
> My assumption is that if there is no custom drawing, the view can smoothly 
> animate its layer between the two colors, and animate any other simple 
> properties, but if there is custom drawing, it doesn't want to call that 
> constantly as it animates the color change, so animation doesn't happen. 
> 
> Is there anything I missed which will make this work,? I was thinking that 
> the other transition animation methods ( [ UIView transitionWithView: .. ] ) 
> take a 'before' and 'after' snapshot and then, if you are flipping, animate 
> one away, and one in. I perhaps expected that UIView to do basically that, 
> and crossfade the old view out and the new one in, but I see no option for 
> that, just flips and curls, I want fade. This would be more generally useful 
> than just this example. 

Intuitively, a possibly solution would look like this:

    UIView* view = self.helloView;
    [UIView transitionWithView:view 
                      duration:2.0 
                       options:UIViewAnimationOptionAllowAnimatedContent | 
UIViewAnimationOptionTransitionNone
                    animations:^{ view.backgroundColor = [UIColor greenColor]; 
} 
                    completion:NULL];

Unfortunately, I couldn't get the background color to fade smoothly for UILabel 
or IUView whose drawRect is overridden as well. Implicit layer animations 
didn't work either.

For plain UIView instances the code above works with smooth animations, though. 
The simplest version is:

    [UIView animateWithDuration:2.0 animations:^{ 
        self.helloView.backgroundColor = [UIColor greenColor];
    }];

> 
> Obviously I have a few other options including building an entirely new 
> UIView on a color change, adding them both and fading their alphas in and 
> out, or splitting my 'paper' into a background view and an otherwise-clear 
> lines view. That may well be the right way to go with this, however I was 
> interested to know if there was some part of UIView animation which would 
> automatically handle a smooth transition of one single UIView between two 
> drawn states. 
Well, there is - but "transition" means the process of creating another image 
(from the original) and then move (in some animated way) from the original 
position to the target position. Fading the background color might not be a 
"transition". However, when specifying the option 
UIViewAnimationOptionAllowAnimatedContent in a transition I would hope property 
changes would be simultaneously animated - and it did for UIViews.

A solution for your problem may look like this:

    UIView* fromView = self.helloView;
    UIView* toView = ...  // copy the fromView
    toView.alpha = 0.0;
    toView.backgroundColor = [UIColor greenColor]; // change the background 
color
    [self.view insertSubview:toView aboveSubview:fromView];

    [UIView animateWithDuration:2.0 
                     animations:^{ 
                         fromView.alpha = 0.0;
                         toView.alpha = 1.0;
                     }
                     completion:^(BOOL finished){ [fromView 
removeFromSuperview]; }];
    
    self.helloView = toView;
    [toView release], toView = nil;


Regards
Andreas

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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 arch...@mail-archive.com

Reply via email to