2012-03-31 13 views
9

Ich bin ein Anfänger in iOS-Programmierung, so tut mir leid, wenn meine Frage eine dumme Frage ist.UIView Unterklasse: drawRect nicht aufgerufen

Ich versuche, eine App zu machen, die benutzerdefinierte Zeichnung auf einem geladenen Bild ausführt.

Um es zu tun, fand ich heraus, dass eine Lösung zu Unterklasse UIView und bearbeiten Sie die drawRect Methode.

Ich machte das auf den folgenden Code, der auf einem IBAction aktiviert mit einer Schaltfläche in der Interface Builder Storyboard-Datei verknüpft.

UIImageView *image = [[UIImageView alloc] initWithImage: [UIImage imageNamed:  @"SampleImage.jpg"]]; 
image.frame = previewView.frame; 
[image setContentMode:UIViewContentModeScaleAspectFit];  

[previewView addSubview:image]; 

customView *aCustomView = [[customView alloc] initWithFrame: CGRectMake(image.bounds.origin.x, image.bounds.origin.y, image.bounds.size.width, image.bounds.size.height)]; 
[previewView addSubview:aCustomView]; 

customView ist die UIView Unterklasse, die ich erstellt, deren init und drawRect Methoden sind wie folgt festgelegt:

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    NSLog(@"INITIALIZING"); 
    if (self) { 
     // Initialization code 
     [self setBackgroundColor:[UIColor clearColor]]; 
    } 
    return self; 
} 


- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    NSLog(@"DRAWING"); 

    CGContextClearRect(ctx, rect); 

    CGContextSetRGBFillColor(ctx, 0, 255, 0, 0.3); 
    CGContextFillEllipseInRect(ctx, rect); 

    CGContextSetRGBStrokeColor(ctx, 255, 0, 0, 1); 
    CGContextSetLineWidth(ctx, 2); 
    CGContextStrokeEllipseInRect(ctx, rect); 
} 

Das Problem, das ich habe, ist, dass keine Zeichnung gemacht wird und auf NSLog Ich habe die "INITIALIZING" Nachricht, aber nicht die Zeichnung "Zeichnung".

Also im Grunde macht es die initWithFrame, aber es ruft nicht die drawRect Methode.

Können Sie mir bitte zeigen, was mache ich falsch?

Antwort

5

Paolo,

Hier sind ein paar Dinge, die Sie können versuchen:

  1. in initWithFrame prüfen, ob die frame Variable enthält, was Sie es erwarten würde: NSLog(@"Frame: %@", NSStringFromCGRect(frame));
  2. Versuchen [preview setNeedsDisplay]; Aufruf nach dem Hinzufügen zu seinem Superview

Schließlich würde ich ändern

image.frame = previewView.frame;

mit:

image.bounds CGRectMake = (0, 0, previewView.frame.size.width, previewView.frame.size.height);

+0

Danke, indem ich den NSLog habe ich herausgefunden, dass etwas falsch beim Aufruf der DrawRect-Methode war. Durch Hinzufügen des [previewView setNeedDisplay] wird die Methode aufgerufen, aber nicht, wenn ich es erwarte. Ich meine, die Ausführung der Zeile [previewView setNeedDisplay] führt nicht dazu, dass die benutzerdefinierte Zeichnung angezeigt wird, sondern durch spätere Code-Schritte. Ich würde gerne verstehen, in welchem ​​Moment die Methode drawRect aufgerufen wird, aber trotzdem ist das anfängliche Problem gelöst, danke :) – Dobrodeveloper

13
  1. Stellen Sie sicher, Ihre neue Ansichtsklasse die UIView ist Subklassen, nicht die UIImageView.
  2. Um sicherzustellen, dass die neue Ansicht angezeigt wird, müssen Sie [viewContainer addSubView:] aufrufen, um den drawRect aufzurufen.

Ref aus dem doc:

Die UIImageView Klasse ist optimiert seine Bilder auf dem Display zu zeichnen. UIImageView ruft drawRect nicht auf: eine Unterklasse.Wenn Ihre Unterklasse benutzerdefinierten Zeichencode benötigt, wird empfohlen, UIView als Basisklasse zu verwenden.

https://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIImageView_Class/Reference/Reference.html

+0

Sie können die benutzerdefinierte Klasse festlegen, die die Zeichnungsrect auf Coder überschreiben – Subhash

2

die Frage sein kann, ist aCustomView-Rahmen ist (0,0,0,0).
Sie können versuchen, einen konstanten CGRect-Parameter wie folgt zu übergeben: CGRectMake(5, 5, 100, 100)。

Verwandte Themen