2010-11-21 10 views
5

la mia situazione: ho creato un UIScrollView con un UIView all'interno del quale chiama una classe Graph che disegna un bel grafico su un contesto. Ora ho scoperto che il telefono non renderebbe UIView se la sua larghezza è maggiore di 8192 pixel. In effetti, secondo i documenti di Apple, se lo volessi più grande di 1024px, dovrei implementare CATiledLayer.UIScrollView e CATiledLayer da zero

Ma dopo aver letto e fatto molte ricerche su Google, trovo ancora difficile comprendere le basi di CATiledLayer per questo compito: sono in qualche modo perso tra Quartz vs Cocoa e livelli e sottostrati rispetto a visualizzazioni e sottoview.

Idealmente mi piacerebbe mantenere intatta la classe Graph, basta disegnare il contesto interamente, dividerlo in riquadri e scorrere quelli. La scrollview dovrebbe semplicemente scorrere in orizzontale, senza zoom o scorrimento verticale richiesto. È possibile? Se sì, come dovrei continuare? Forse qualcuno potrebbe darmi una bozza, solo alcuni punti elenco o pseudocodice, come dovrei ristrutturare la scrollview, uiview e la classe del grafico per usare la piastrellatura.

Grazie mille in anticipo per qualsiasi risposta.

risposta

4

È passato un mese da quando hai chiesto ma potrebbe ancora essere utile. Ho appena iniziato a usare CATiledLayer stasera. Penso che l'idea dietro a un CATiledLayer sembra essere che si aggiunge ad una vista:

CATiledLayer *tiled = [CATiledLayer layer]; 
[self.view.layer addSublayer:tiled]; 

e di impostare un delegato, attuando solo un metodo:

MyTLDelegate *myDelegate = [[MyTLDelegate alloc] init]; 
tiled.delegate = myDelegate; 
// I haven't checked if CATiledLayer retains myDelegate, check this! 

... 
@implementation MyTLDelegate { 

-(void)drawLayer:(CATiledLayer *)layer inContext:(CGContextRef)ctx 
{ 
    CGRect dirtyRect = CGContextGetClipBoundingBox(ctx); 
    // draw! 
} 

Questo è fondamentalmente tutto quello che c'è da puoi disegnare come se l'intero spazio di coordinate fosse proprio lì. Quindi è necessario solo modificare leggermente la classe Graph in modo che possa fungere da delegato CATiledLayer. Nel mio caso sono stati spesi ben 20 minuti, aumentando l'esperienza degli utenti di diversi ordini di grandezza. (rispetto al fare noioso scorrimento, ridimensionamento e ridisegno)

ps. questo è solo lo pseudo-codice che hai richiesto, potresti aver bisogno di un po 'di colla extra per far funzionare le cose, ad es. per qualità e/o dimensioni del telaio.

Problemi correlati