Frage

Ich habe eine Ansicht, die ich einige benutzerdefinierte Zeichnung hinzufügen möchten.

Ich weiß, wie dies mit einem Blick zu tun, die nicht auf eine Nib / Xib Datei verbunden ist

  • Sie schreiben die Zeichnung Code in der -drawRect: Methode.

Aber wenn ich init die Ansicht mit

[[MyView alloc] initWithNibName:@"MyView" bundle:[NSBundle mainBundle]];

-drawRect: natürlich nicht aufgerufen. Ich habe versucht, den Code unten in -viewDidLoad tun

CGRect rect = [[self view] bounds];

CGContextRef ref = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(ref, 2.0);
CGContextSetRGBStrokeColor(ref, 1.0, 1.0, 1.0, 1.0);
CGContextSetRGBFillColor(ref, 0, 0, 0, 0);
CGContextAddRect(ref, CGRectMake(1, 1, rect.size.width - 10, rect.size.height - 10));
CGContextStrokePath(ref);
CGContextDrawPath(ref, kCGPathFillStroke);

Aber nichts gezogen bekommen. Irgendwelche Ideen?

War es hilfreich?

Lösung

Ich denke, das Problem ist, dass Sie einen Blick und seinen View-Controller als austauschbar sind zu behandeln. Zum Beispiel gibt es keine -[UIView initWithNibName:bundle:] Methode - das ist eine UIViewController Methode

.

Darüber hinaus ist eine Ansicht, nicht wirklich wie eine „Leinwand“ für das Zeichnen. Ein Blick wird aufgefordert, sich zu ziehen; in der Regel wird es nicht aus gezogenem in seinem „draußen“.

So:

  1. Benennen Sie Ihre Unterklasse von UIViewController von MyView zu MyViewController.

  2. Erstellen Sie eine neue UIView Unterklasse namens MyView.

  3. eine -drawRect: Methode zu Ihrer neuen MyView Klasse hinzufügen, die Sie wollen nicht die Zeichnung.

  4. Schließlich setzen die benutzerdefinierte Klasse Ihrer Ansicht des View-Controller in Interface Builder MyView Identity Inspector verwenden.

Zum Beispiel sollten Sie in der Lage sein, diese Implementierung für Ihre -[MyView drawRect:] zu verwenden:

- (void)drawRect:(CGRect)rect {
    CGRect bounds = [[self view] bounds];

    CGContextRef ref = UIGraphicsGetCurrentContext();
    CGContextSetLineWidth(ref, 2.0);
    CGContextSetRGBStrokeColor(ref, 1.0, 1.0, 1.0, 1.0);
    CGContextSetRGBFillColor(ref, 0, 0, 0, 0);
    CGContextAddRect(ref, CGRectMake(1, 1, bounds.size.width - 10, bounds.size.height - 10));
    CGContextStrokePath(ref);
    CGContextDrawPath(ref, kCGPathFillStroke);
}

wird die Zeichnung auf das Aktualisierungsrechteck in geben abgeschnitten.

Andere Tipps

Hier sind drei mögliche Lösungen, je nach Randbedingungen.

  1. Stellen Sie die Klasse des NSView Objekt in der Xib Datei einer Ihrer benutzerdefinierten Klassen zu sein. Sie erwähnen, dass Sie wissen, wie benutzerdefinierte mit einer „hartcodiert“ NSView Unterklasse zeichnen zu tun, und dies würde die gleiche Art und Weise arbeiten. Wenn die Xib-Datei geladen wird, wird die NSView als Objekt Ihrer benutzerdefinierten Klasse in den Speicher geladen anstelle des Standard. Ändern des Klassentyp der Ansicht, in der Xib ist einfach mit Interface Builder.
  2. Wenn die NSView Objekt in der Xib Datei ist bereits eine Art benutzerdefinierte Ansicht, die Sie nicht wollen, außer Kraft zu setzen, können Sie eine Subview zu dieser Ansicht im Interface Builder, fügen und einfach die subview machen in einem benutzerdefinierten Klasse Ihres Designs (wie in # 1)
  3. Sie können programmatisch eine Subview zum NSView Objekt in der Xib-Datei zur Laufzeit hinzufügen. In Ihrem Beispielcode oben, könnten Sie eine Instanz Ihrer eigenen benutzerdefinierten NSView Unterklasse, erstellen und es dann an die bestehende Ansicht fügen Sie die addSubView: Methode.

Wie wäre es all die Zeichnung in einem einfachen subview tun und es in die XIB-Ansicht (in viewDidLoad)?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top