用所有子视图淡入一个UIView

任何方式你可以着色UIView? 不是背景颜色,而是整个UIView及其所有子视图。

例如 – 一个UIView与animation的星形旋转,即UIView形状不断变化。

最终我创build了一个UIView类别,可以在不填充UIView矩形的情况下对UIView进行着色,在这里是:

获取UIView的图像表示,然后在给定的UIColor中对其进行着色,创build此类别以复制UIButton默认突出显示行为,所以它还附带了一个可以激活该行为的方法,并让该类别处理所有触摸方法。

//------------------ .h Interface file ------- // // // UIView UIView_Tint.h // BabyQA // // Created by yogev shelly on 8/10/12. // Copyright (c) 2012 __MyCompanyName__. All rights reserved. // #import <UIKit/UIKit.h> #define tintColorClassicUIButton [UIColor colorWithWhite:0.0 alpha:0.5] @interface UIView(Tint) //proprties should not be used, use the methods decalred bellow @property (nonatomic,retain) UIColor* tintColor; @property(nonatomic,retain) UIImageView* tintImageView; @property(nonatomic,assign) BOOL tintOnTouchActive; -(void)tintToColor:(UIColor*)color; -(void)clearTint; -(void)enableTintOnTouchWithColor:(UIColor*)color; -(void)disableTintOnTouch; -(UIImage *)imageRepresentation; -(UIImage*)imageRepresentationWithTintColor:(UIColor*)color; @end //------------------ .m Implementation file ------- // // UIView UIView_Tint.m // BabyQA // // Created by yogev shelly on 8/10/12. // Copyright (c) 2012 __MyCompanyName__. All rights not reserved - go wild! // #import "UIView Tint.h" #import <objc/runtime.h> #import <QuartzCore/QuartzCore.h> static char const * const tintImageViewKey = "tintImageView"; static char const * const tintColorKey = "tintColorKey"; static char const * const tintOnTouchActiveKey = "tintOnTouchActive"; @implementation UIView (Tint) @dynamic tintImageView; @dynamic tintColor; @dynamic tintOnTouchActive; -(void)enableTintOnTouchWithColor:(UIColor*)color { self.tintColor = color; self.tintOnTouchActive = TRUE; } -(void)disableTintOnTouch { self.tintOnTouchActive = FALSE; } -(void)tintToColor:(UIColor*)color { if(![self.tintColor isEqual:color] || !self.tintImageView) { self.tintColor = color; UIImage* tintImage = [self imageRepresentationWithTintColor:self.tintColor]; self.tintImageView = [[[UIImageView alloc] initWithImage:tintImage] autorelease]; } [self addSubview:self.tintImageView]; } -(void)clearTint { [self.tintImageView removeFromSuperview]; } -(void)clearTintWithSecondsDelay:(float)delay { [self performSelector:@selector(clearTint) withObject:self afterDelay:delay]; } #pragma mark - TouchToggling -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [super touchesBegan:touches withEvent:event]; if(self.tintOnTouchActive) [self tintToColor:self.tintColor]; } -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { [super touchesEnded:touches withEvent:event]; if(self.tintOnTouchActive) [self clearTintWithSecondsDelay:0.05]; } -(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { [super touchesCancelled:touches withEvent:event]; if(self.tintOnTouchActive) [self clearTintWithSecondsDelay:0.05]; } #pragma mark - TintingPart -(UIImage *)imageRepresentation { UIGraphicsBeginImageContext(self.bounds.size); [self.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage * img = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return img; } -(UIImage*)imageRepresentationWithTintColor:(UIColor*)color { UIImage* viewImage = [self imageRepresentation]; viewImage = [self tintedImage:viewImage UsingColor:color]; return viewImage; } -(UIImage *)tintedImage:(UIImage*)image UsingColor:(UIColor *)tintColor { UIGraphicsBeginImageContextWithOptions(image.size, NO, [[UIScreen mainScreen] scale]); CGRect drawRect = CGRectMake(0, 0, image.size.width, image.size.height); [image drawInRect:drawRect]; [tintColor set]; UIRectFillUsingBlendMode(drawRect, kCGBlendModeSourceAtop); UIImage *tintedImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return tintedImage; } #pragma mark - Dynamic setters/getters for Associative References -(void)setTintImageView:(UIImageView *)tintImageView { objc_setAssociatedObject(self, tintImageViewKey, tintImageView, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } -(UIImageView*)tintImageView { return objc_getAssociatedObject(self , tintImageViewKey); } -(UIColor*)tintColor { return objc_getAssociatedObject(self , tintColorKey); } -(void)setTintColor:(UIColor *)tintColor { objc_setAssociatedObject(self, tintColorKey, tintColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } -(BOOL)tintOnTouchActive { return [objc_getAssociatedObject(self, tintOnTouchActiveKey) boolValue]; } -(void)setTintOnTouchActive:(BOOL)tintOnTouchActive { objc_setAssociatedObject(self, tintOnTouchActiveKey, [NSNumber numberWithBool:tintOnTouchActive], OBJC_ASSOCIATION_RETAIN_NONATOMIC); } @end 

为了给一个UIView着色,在其上添加另一个子视图,使用相同的frame和一个alpha透明度集。

例如,假设你的容器types视图叫做containerView ,你可以这样做:

 CGRect overlayFrame = containerView.frame; UIView *overlayView = [UIView alloc] initWithFrame:overlayFrame]; overlayView.alpha = 0.5f; overlayView.color = [UIColor blackColor]; [containerView addSubview:overlayView]; 

这给你一个半透明(0.5f)的黑色色调,会给下面的所有子视图带来色调。