12
votes

Précharge / Predisplay Drajets dans une catileDlayer?

sur l'iPhone (bien que j'imagine que c'est une question de cacao tout aussi valable), j'ai une question d'Uiscrollview autour d'un UIView avec une catilledlayer. La façon dont il fonctionne par défaut consiste à charger les carreaux non liés / non décédés lorsque ma fenêtre se déplace sur une section vierge de la catileDlayer.

Ce que j'aimerais savoir, c'est s'il y a un moyen de déclencher CatileDlayer de charger une tuile qui n'est pas activement affichée? Je voudrais, par exemple, précharger toutes les carreaux contiguës à la tuile actuellement affichée alors qu'elles sont toujours décrénales, évitant ainsi clignoter un écran vierge qui s'estompe à l'image une fois qu'elle est chargée de manière asynchrone.

Des idées?


2 commentaires

Avez-vous compris cela? J'aimerais vraiment savoir comment vous l'avez fait si vous l'avez fait.


Nan. Jamais fait. :( Utilisation de SETNEDEDSDISPLAYInrect: fonctionne pour rafraîchir le contenu d'une tuile déjà chargée, mais ne semble pas le faire précharger.


3 Réponses :


0
votes

Vous devez essayer d'appeler SetNeedsDisplayInrect: sur les zones que vous souhaitez afficher. Si vous souhaitez conserver dans les limites des tuiles, vous pouvez utiliser la propriété TileSize pour calculer des limites de tuiles.

Mais je ne sais pas avec certitude si cela fonctionnera et nous ne savons pas comment fonctionne le mécanisme de mise en cache de tuiles.


0 commentaires

4
votes

Catilelayer est l'une de ces classes frustrantes où elle fait une chose géniale, mais elle n'a aucune flexibilité.

À ce stade, tout ce qui est laissé, c'est la créativité:

1) Faites votre vision de défilement énorme. J'ai essayé 5x la taille de l'écran avant d'avoir arrêté de voir des tuiles "vierges". Méfiez-vous d'une utilisation de la mémoire! Vous vous dessinez dans une vaste zone, même si l'utilisateur ne voit que 2% de celui-ci.

2) avoir deux version de votre image, une RES élevée et une résolution faible. Vous devriez être capable de blouer le faible résolution très rapidement et, fondamentalement, vous obtenez des "flous" au lieu de tuiles "vierges". Le code d'exemple de Apple ZoomingPDFViewer vous montre comment faire cela.

http://developer.apple.com/Library /ios/#samplecode/zoomingPDViewer/introduction/intro.html

Bien sûr, une combinaison des deux pourrait fonctionner si vous souhaitez investir le temps.


1 commentaires

Toutes les grandes idées. J'aimerais pouvoir nommer deux réponses!



14
votes

Je ne pense pas que Catilledlayer fera ce que vous voulez. Il y a quelques autres options cependant. Vous pouvez d'abord désactiver la carreau de la tuile et avoir l'affichage immédiatement avec quelque chose comme ceci: xxx p> second, vous pouvez faire votre propre pré-extraction et mise en cache des carreaux adjacents afin qu'ils soient Prêt à partir lorsque Catilelayer appelle DrawLayer: incontext. J'étais implémenter ScrollViewDidscroll: et ScrollViewDidLezoom: Pour déterminer les carreaux et le niveau de niveau adjacents. Ensuite, faites une recherche de cache et ajoutez tout non présent à une file d'attente pré-extraire / rendu. Un fil d'arrière-plan pourrait servir la file d'attente et les défilations ultérieures ou les zooms effaceraient et reconstruire la file d'attente. Ensuite, avoir DrawLayer: Incontext Vérifiez le cache d'abord et seulement chercher / rendu si nécessaire.


1 commentaires

J'ai essayé cette approche de préjugé (y compris la sous-classe de couche sans fade-durée) et elle ne semble pas aider beaucoup, malheureusement. Je suis à perte de pourquoi; Cela ressemble certainement à une bonne approche.