Question

J'ai vue que je veux ajouter un peu de dessin personnalisé à.

Je sais comment faire cela avec une vue non connecté à un fichier Nib / Xib

  • vous écrivez le code de dessin dans la méthode -drawRect:.

Mais si je init la vue en utilisant

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

-drawRect: bien sûr ne s'appelle pas. J'ai essayé de faire le code ci-dessous dans -viewDidLoad

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);

Mais rien ne se tirer. Toutes les idées?

Était-ce utile?

La solution

Je pense que le problème est que vous traitez une vue et son contrôleur de vue comme interchangeables. Par exemple, il n'y a pas de méthode de -[UIView initWithNibName:bundle:] - c'est une méthode UIViewController

.

En outre, une vue n'est pas vraiment comme une « toile » pour le dessin. Un point de vue sera invité à se dessiner; en général, il ne sera pas aspiré dans de « l'extérieur ».

  1. Renommer votre sous-classe de UIViewController de MyView à MyViewController.

  2. Créer une nouvelle sous-classe UIView nommée MyView.

  3. Ajoutez une méthode de -drawRect: à votre nouvelle classe MyView qui ne le dessin que vous voulez.

  4. Enfin, définissez la classe personnalisée du point de vue de votre contrôleur de vue dans Interface Builder pour MyView utilisant l'inspecteur Identity.

Par exemple, vous devriez pouvoir l'utiliser pour l'implémentation de -[MyView drawRect:]:

- (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);
}

Le dessin sera coupé au rectangle de mise à jour transmis.

Autres conseils

Voici trois solutions possibles, en fonction de vos contraintes.

  1. Définissez la classe de l'objet NSView dans le fichier Xib d'être l'un de vos classes personnalisées. Vous mentionnez que vous savez comment faire le dessin sur mesure avec un « codé en dur » sous-classe NSView, et cela fonctionnerait de la même façon. Lorsque le fichier Xib est chargé, le NSView est chargé dans la mémoire comme un objet de votre classe personnalisée au lieu de la valeur par défaut. Modification du type de classe de la vue dans le Xib est simple avec Interface Builder.
  2. Si l'objet NSView dans le fichier Xib est déjà une sorte de vue personnalisée que vous ne voulez pas passer outre, vous pouvez ajouter un sous-vue à ce point de vue dans Interface Builder et faites simplement le sous-vue dans une mesure classe de votre conception (comme dans # 1)
  3. Vous pouvez ajouter un programme sous-vue à l'objet NSView dans le fichier Xib lors de l'exécution. Dans votre code exemple ci-dessus, vous pouvez créer une instance de votre propre sous-classe NSView personnalisée, puis l'ajouter à la vue existante en utilisant la méthode addSubView:.

Que diriez-vous de faire tout le dessin dans un simple sous-vue et l'ajouter à la vue XIB (en viewDidLoad)?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top