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];
}
für das gleiche tun können Sie fügen den Code hinzu, von dem Sie diese Graustufenansicht initialisieren? – rishi
hinzugefügt viewcontroller initcode und redrawcode – jalmaas
versuchen mit GreyscaleAllView * grau = [[[GreyscaleAllView alloc] initWithFrame: CGRectMake (0,0,320,480)] Autorelease]; – rishi