As ever, thanks very much David. I figured there was *something* going on when 
drawRect: was defined but I wouldn't have figured out what without this help. 

In this case a crossfade in every case for that particular view works 
perfectly, I implemented what you suggested and it looks so much better, it's 
amazing the difference that even a .3-.5 second smooth transition can make, 
just takes the edge off something which was quite harsh before, looks much more 
professional. 

Got the point (again) on using simple subviews when possible, a mistake I've 
made before. In this particular case I don't think that was going to work, but 
I'm very happy with what I have now. 

Andreas, thanks for your reply too. You had pretty much exactly the same 
thoughts I did and we both tried the same ideas, with the same 
..AllowAnimatedContent etc and got the same results; hope David's reply was 
useful to you too, it goes in my 'keepers' file. 

On 03-Mar-2011, at 5:10 AM, David Duncan wrote:

> On Mar 2, 2011, at 5:12 AM, 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. 
> 
> 
> When you implement -drawRect:, the background color of your view is then 
> drawn into the associated CALayer, rather than just being set on the CALayer 
> as a style property. Now Core Animation can animate both transitions, but 
> UIView disables the animation of a layer's contents, which thus prevents you 
> from getting a contents crossfade (as in the vast majority of cases this 
> wouldn't be what you want).
> 
> The crossfade may be exactly what you want in this case. Likely the best way 
> to defeat UIView's override in this case may be to create a subclass of 
> CALayer that overrides -actionForKey:. In that override, you would check for 
> the @"contents" key and return a CABasicAnimation ([CABasicAnimation 
> animation] should do it) and in all other cases return what the default 
> implementation does. This has the downside that you will *always* cross fade 
> and you won't be able to integrate with UIKit's animation APIs (you just get 
> animation for contents on all the time).
> 
> Another solution would be to use a super view that contains just the 
> background color and have your lines composited over it (assuming they are 
> simple lines this could be done with simple subviews that are sized for each 
> line). This would allow you to avoid -drawRect: entirely, which would allow 
> you to animate the background color and may offer some memory usage benefits 
> (if you can use subviews). 
> --
> David Duncan
> 

_______________________________________________

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