2010-11-21 6 views
5

meine Situation: Ich habe eine UIScrollView mit einem UIView innerhalb erstellt, die eine Graph-Klasse aufruft, die ein nettes Diagramm auf einen Kontext zeichnet. Jetzt entdeckte ich, dass das Telefon die UIView nicht rendern würde, wenn die Breite größer als 8192 Pixel ist. In der Tat, nach Apple's Docs, wenn ich es größer als 1024px will, sollte ich CATiledLayer implementieren.UIScrollView und CATiledLayer von Grund auf

Aber nachdem ich viel gelesen und gegoogelt habe, fällt es mir immer noch schwer, die Grundlagen von CATiledLayer für diese Aufgabe zu verstehen - ich bin irgendwie zwischen Quartz vs. Cocoa und Layern und Sublayern vs. Views und Subviews verloren.

Idealerweise möchte ich die Graph-Klasse unberührt lassen, einfach den Kontext komplett zeichnen, in Kacheln aufteilen und diese durchblättern. Die Scrollansicht sollte nur horizontal scrollen, kein Zoomen oder vertikales Scrollen erforderlich. Ist das möglich? Wenn ja, wie soll ich fortfahren? Vielleicht könnte mir jemand einen Umriss geben, nur ein paar Bulletpoints oder Pseudocode, wie ich die Scrollview, die uiview und die Graphklasse neu strukturieren sollte, um Tiling zu verwenden.

Vielen Dank im Voraus für eine Antwort.

Antwort

4

Es ist ein Monat her, seit Sie gefragt haben, aber das kann immer noch von Nutzen sein. Ich habe gerade angefangen, CATiledLayer heute Abend zu benutzen. Ich denke, die Idee hinter einem CATiledLayer zu sein scheint, dass Sie es zu einer Ansicht hinzufügen:

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

und dass Sie einen Delegaten, nur ein Verfahren implementiert:

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! 
} 

, die im Grunde ist alles, was es zu Sie können einfach so zeichnen, als ob der gesamte Koordinatenraum gerade da wäre. Daher sollten Sie Ihre Graph-Klasse nur geringfügig ändern müssen, damit sie als CATiledLayer-Delegat fungieren kann. In meinem Fall waren es gut 20 Minuten, um die Benutzererfahrung um mehrere Größenordnungen zu steigern. (im Vergleich zum langwierigen Scrollen, Skalieren und Neuzeichnen)

ps. Dies ist nur der Pseudo-Code, nach dem Sie gefragt haben. Möglicherweise benötigen Sie etwas zusätzlichen Klebstoff, um die Dinge in Gang zu bringen, z. für Qualität und/oder Rahmengrößen.

Verwandte Themen