2011-12-05 10 views
7

W jaki sposób można zabarwiać UIView? Nie kolor tła, ale całe UIView z wszystkimi jego subviewsami.Odcień UIView z wszystkimi jego subviewsami

np. - UIView z animacją obracającej się gwiazdy, tzn. Kształt UIView ciągle się zmienia.

+2

Można dodać nowy podrzędny, aby wypełnić całą widok ramkę, ustawić kolor bg tym podrzędny i uczynić go nieco przezroczysty .... chociaż to nie będzie „barwienie” naprawdę. –

+0

Docelowy UIView nie jest prostokątem, ma unikalny kształt, np. Gwiazdkę. –

+0

Masz UIView w kształcie gwiazdy z subviewsami w nim? –

Odpowiedz

7

końcu stworzyłem kategorię UIView, który umożliwia barwienie UIView, bez wypełnienia prostokąta UIView, tutaj jest:

Bierze reprezentację obrazu z UIView, wtedy kolory go w danego UIColor , ta kategoria została utworzona w celu replikowania domyślnego zachowania podświetlenia UIButton , więc jest również dostępna metoda, która może aktywować zachowanie i pozwolić kategorii obsługiwać wszystkie metody dotykowe.

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

Aby zabarwić UIView, dodaj na wierzchu inny wyrób z tego samego zestawu frame i przezroczystości alfa.

Na przykład załóżmy, że pojemnik typu pogląd nazywa containerView, można by zrobić w następujący sposób:

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

[containerView addSubview:overlayView]; 

To daje półprzezroczystą (0.5f) Czarny odcień, który pozwoli odcień podobny wyglądem do wszystkie podekspozycje poniżej.

+1

Jeśli widok zabarwienia ma pewną przezroczystość, będzie to odbarwianie do "pod spodem" (tj. Prostokątny obszar jest zabarwiony). Mogłoby się to obejść za pomocą warstwy maski, tak myślę. – occulus

Powiązane problemy