2012-10-17 24 views
6

La mia applicazione è in grado di fare un disegno di figura semplice (fino a quando ottengo un codice più stabile, sto attaccando solo con una figura) ed è anche in grado di ridimensionarle. Il codice che uso per creare un UIView è la seguente:Best practice di disegno UIView

- (void)drawRect:(CGRect)rect 
{  
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    [self setContextFillColor:context]; 
    [self setContextStrokeColor:context]; 
    [self setLineWidth:context]; 

    CGFloat lineThickness = [self lineWidth] ; 
    CGFloat halfLineThickess = lineThickness/2.0f; 

    CGContextAddRect(context, CGRectMake(halfLineThickess,halfLineThickess, rect.size.width - lineThickness, rect.size.height - lineThickness)); 

    CGContextDrawPath(context, kCGPathEOFillStroke); 
} 

che mi dà, con una dimensione di ingresso (100.0f, 100.0f), in questo modo:

enter image description here

Questa cifra è all'interno di un "container" UIView che a sua volta si trova all'interno di uno UIScrollView. Il mio problema con questo è quando sto ridimensionando la mia figura e raggiungo dimensioni di circa 1000 * 1000 (il mio "contenitore" è 20.000 * 20.000), inizio a ricevere avvisi di memoria e l'applicazione alla fine si arrende. Quindi le mie domande sono:

1) Dovrei prendere in considerazione di inserire una dimensione massima per il UIView?

2) Come potrei usare gli strumenti per tracciare questo tipo di problemi e vedere dove sta arrivando il problema (o dove si sta facendo il sollevamento pesante).

3) Devo utilizzare un tipo di memorizzazione nella cache come this?

4) Ci sono alcune buone pratiche da considerare, quando si disegna un UIView?

5) Devo considerare CALayer, anche se ho bisogno di ascoltare i tocchi?

Il ridimensionamento di UIView si basa principalmente su this.

+0

Hai mai pensato di utilizzare QuartzCore e solo utilizzando la proprietà layer della tua vista per disegnare un bordo? – runmad

+0

Il fatto è: questa è una figura semplice. Alla fine ne avrò di più complessi, e non penso che giocare con le proprietà di 'UIView' sia sufficiente. Ma grazie per il suggerimento. – Peres

+2

se è necessario disegnare contenuti di grandi dimensioni (magari con lo zoom), si consiglia di controllare 'CATiledLayer' http://developer.apple.com/library/ios/#documentation/GraphicsImaging/Reference/CATiledLayer_class/Introduction/Introduction.html – Bastian

risposta

1

Non dovresti creare un UIView così grande. È semplicemente troppo grande. Questo tipo di problema è ciò che è stato progettato per l'indirizzo CATiledLayer. Fondamentalmente dovrai tenere traccia delle caselle di delimitazione per le tue forme e usare quelle caselle di delimitazione per capire quali tessere intersecano le forme. Quando il sistema richiede una determinata tessera, si disegna tutte le forme che la intersecano. Per forme molto grandi e complesse, è possibile ottimizzare ulteriormente suddividendo la forma, ma spesso non è necessario.

1

1) Penso che la dimensione non è un problema se si utilizza il giusto approccio.

2) Si consiglia di utilizzare strumenti di dare un'occhiata a video WWDC sul monitoraggio dei problemi di memoria

3,4) Penso che - (void)drawRect:(CGRect)rect non è una buona pratica. Sarà meglio se guarderai il disegno CALayer. È possibile utilizzare l'CGMutablePathRef personalizzato per il disegno.

Quindi UIView è utile per l'elaborazione di tocchi ma non è adatto per disegnare forme.

+0

Voglio anche elaborare i gesti su quel particolare 'UIView' (come lo spostamento e il ridimensionamento). – Peres

+0

@JackyBoy Non è un problema qui è alcuni passi: 1) Creare nuova visione 'UIView * view' 2) creare nuovo livello ' CALayer * shapeLayer view.layer = shapeLayer' 3) Aggiungere gesti '[ visualizza addGestureRecognizer: panGesture]; ' – Danil