Domanda

Ho una visione che voglio aggiungere qualche disegno personalizzato a.

Io so come fare questo con una vista che non è collegato a un file pennino / Xib

  • si scrive il codice di disegno nel metodo -drawRect:.

Ma se io init la vista utilizzando

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

-drawRect: ovviamente non viene chiamato. Ho provato a fare il codice qui sotto in -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);

Ma niente ottenere disegnato. Tutte le idee?

È stato utile?

Soluzione

Credo che il problema è che si sta trattando una vista e la sua vista controller come intercambiabili. Per esempio, non c'è nessun metodo -[UIView initWithNibName:bundle:] - questo è un metodo UIViewController

.

Inoltre, la vista non è davvero come una "tela" per il disegno. Un punto di vista sarà chiesto di disegnare per sé; in generale, non sarà coinvolto in dall "" esterno".

  1. Rinominare il sottoclasse di UIViewController da MyView a MyViewController.

  2. Crea un nuovo UIView sottoclasse di nome MyView.

  3. Aggiungere un metodo -drawRect: alla nuova classe MyView che fa il disegno che si desidera.

  4. Infine, impostare la classe personalizzata di vista del vostro controller della vista in Interface Builder per MyView utilizzando Impostazioni identità.

Per esempio, si dovrebbe essere in grado di utilizzare questo per l'implementazione -[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);
}

Il disegno viene tagliata sul rettangolo aggiornamento passata.

Altri suggerimenti

Qui ci sono tre possibili soluzioni, a seconda delle vostre vincoli.

  1. Imposta la classe dell'oggetto NSView nel file XI ter essere una delle vostre classi personalizzate. Lei parla che si sa come fare il disegno personalizzato con un "hard-coded" sottoclasse NSView, e questo dovrebbe funzionare allo stesso modo. Quando il file viene caricato Xib, il NSView viene caricato in memoria come un oggetto della classe personalizzata al posto del default. Modifica del tipo di classe della vista nella Xib è semplice con Interface Builder.
  2. Se l'oggetto NSView nel file Xib è già una sorta di visualizzazione personalizzata che non si desidera ignorare, è possibile aggiungere una visualizzazione secondaria a quella vista in Interface Builder, e semplicemente fare la visualizzazione secondaria in un personalizzato classe di vostro disegno (come in # 1)
  3. di programmazione è possibile aggiungere una visualizzazione secondaria all'oggetto NSView nel file Xib in fase di esecuzione. Nel codice di esempio sopra riportato, è possibile creare un'istanza di tue NSView sottoclasse, e poi aggiungerlo alla vista esistente utilizzando il metodo addSubView:.

Che ne dite di fare tutto il disegno in una semplice visualizzazione secondaria e aggiungerlo alla vista XIB (in viewDidLoad)?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top