2010-11-21 4 views
5

ma situation: J'ai créé un UIScrollView avec un UIView à l'intérieur qui appelle une classe Graph qui dessine un joli graphique sur un contexte. Maintenant, j'ai découvert que le téléphone ne rendrait pas le UIView si sa largeur est supérieure à 8192 pixels. En fait, selon les docs d'Apple, si je le veux plus grand que 1024px, je devrais implémenter CATiledLayer. Mais après avoir beaucoup lu et googlé, j'ai encore du mal à comprendre les bases de CATiledLayer pour cette tâche - je suis en quelque sorte perdue entre Quartz et Cocoa et les couches et sous-couches par rapport aux vues et sous-vues.UIScrollView et CATiledLayer à partir de zéro

Idéalement, je voudrais garder la classe Graph intacte, juste dessiner le contexte entièrement, le diviser en carreaux et les faire défiler. Le scrollview doit simplement défiler horizontalement, pas de zoom ou de défilement vertical requis. Est-ce possible? Si oui, comment devrais-je continuer? Peut-être que quelqu'un pourrait me donner un aperçu, juste quelques points ou pseudocode, comment je devrais restructurer le scrollview, uiview et la classe graphique pour utiliser le pavage.

Merci beaucoup d'avance pour toute réponse.

Répondre

4

Cela fait un mois que vous avez demandé, mais cela peut toujours être utile. Je viens de commencer à utiliser CATiledLayer ce soir. Je pense que l'idée derrière un CATiledLayer semble être que vous l'ajoutez à une vue:

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

et que vous définissez un délégué, la mise en œuvre une seule méthode:

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

C'est fondamentalement tout ce qu'il ya à Vous pouvez simplement dessiner comme si tout l'espace de coordonnées était juste là. Vous ne devez donc modifier que légèrement votre classe Graph pour qu'elle puisse agir en tant que délégué CATiledLayer. Dans mon cas, il a été bien dépensé 20 minutes, ce qui a amélioré l'expérience utilisateur de plusieurs ordres de grandeur. (comparé à faire le défilement fastidieux, mise à l'échelle et redessiner moi-même)

ps. c'est seulement le pseudo code que vous avez demandé, vous pouvez avoir besoin de colle supplémentaire pour faire avancer les choses, par exemple. pour la qualité et/ou les tailles de cadre.

Questions connexes