2012-05-10 9 views
5

ich es geschafft, eine UIView in Graustufen zu erhalten, indem die folgende Ansicht Hinzufügen von oben:UIView in Graustufen. Ansicht ist nicht neu gezeichnet

@interface GreyscaleAllView : UIView 

@property (nonatomic, retain) UIView *underlyingView; 

@end 

@implementation GreyscaleAllView 

@synthesize underlyingView; 

- (void)drawRect:(CGRect)rect { 

    CGContextRef context = UIGraphicsGetCurrentContext(); 

    // draw the image 
    [self.underlyingView.layer renderInContext:context]; 

    // set the blend mode and draw rectangle on top of image 
    CGContextSetBlendMode(context, kCGBlendModeColor); 
    CGContextSetRGBFillColor(context, 0.0, 0.0, 0.0, 1.0); 
    CGContextFillRect(context, rect); 
    [super drawRect:rect]; 
} 

@end 

Es funktioniert, aber der Inhalt nicht aktualisiert, es sei denn ich setNeedsDisplay manuell aufrufen. (Ich kann eine UIButton drücken und die Aktion wird ausgelöst, aber nichts ändert sich im Aussehen.) Damit es sich wie erwartet verhält, rufe ich setNeedsDisplay 60 Mal pro Sekunde auf. Was mache ich falsch?

UPDATE:

Der Viewcontroller inits der Overlay mit diesem:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    GreyscaleAllView *grey = [[[GreyscaleAllView alloc] initWithFrame:self.view.frame] autorelease]; 
    grey.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 
    grey.userInteractionEnabled = NO;  
    [self.view addSubview:grey]; 
} 

ich dies für die Unterlegung Ansichten hinzugefügt haben neu zu zeichnen:

@implementation GreyscaleAllView 

- (void)setup { 

    self.userInteractionEnabled = FALSE; 
    self.contentMode = UIViewContentModeRedraw; 

    [self redrawAfter:1.0/60.0 repeat:YES]; 

} 

- (void)redrawAfter:(NSTimeInterval)time repeat:(BOOL)repeat { 

    if(repeat) { 
     // NOTE: retains self - should use a proxy when finished 
     [NSTimer scheduledTimerWithTimeInterval:time target:self selector:@selector(setNeedsDisplay) userInfo:nil repeats:YES]; 
    } 

    [self setNeedsDisplay]; 
} 
+0

für das gleiche tun können Sie fügen den Code hinzu, von dem Sie diese Graustufenansicht initialisieren? – rishi

+0

hinzugefügt viewcontroller initcode und redrawcode – jalmaas

+0

versuchen mit GreyscaleAllView * grau = [[[GreyscaleAllView alloc] initWithFrame: CGRectMake (0,0,320,480)] Autorelease]; – rishi

Antwort

1

Was Sie wirklich wollen ist für die Unteransicht nur neu gezeichnet, wenn die übergeordnete Ansicht neu gezeichnet wird, in diesem Fall können Sie -setNeedsDisplay im übergeordneten v überschreiben iew und rufen Sie -setNeedsDisplay auf der GreyscaleAllView. Dies erfordert die Unterklasse UIView für Ihre UIViewControllerview Eigenschaft.

dh implementieren loadView in der Steuerung und stellen

self.view = [[CustomView alloc] initWithFrame:frame]; 

wo Custom setNeedsDisplay außer Kraft gesetzt, wie oben beschrieben:

@implementation CustomView 

- (void)setNeedsDisplay 
{ 
    [grayView setNeedsDisplay]; // grayView is a pointer to your GreyscaleAllView 
    [super setNeedsDisplay]; 
} 

@end 

Für Vollständigkeit, sollten Sie auch -setNeedsDisplayInRect:

Verwandte Themen