2017-08-15 2 views
1

J'ai un UIScrollView qui contient une "Draw View" que l'utilisateur peut dessiner à main levée avec UIBezierPath. Il utilise CATiledLayer pour pouvoir zoomer sans flou. Lorsque je dessine les chemins, il n'y a pas d'erreur EXC_BAD_ACCESS malgré le fait que le trait soit appelé plusieurs fois.EXC_BAD_ACCESS lors du tracé de UIBezierPath lors de la traduction à l'aide de CATiledLayer

Cependant, lorsque je traduis un chemin en utilisant CGAffineTransForm, il dure moins de quelques secondes avant de lancer une erreur EXC_BAD_ACCESS lorsque le chemin est parcouru. Il crée également visuellement des artefacts avec le chemin. Je suis certain que cela a quelque chose à voir avec CATiledLayer ne pas aimer la traduction, parce que quand j'arrête d'utiliser CATiledLayer il n'y a aucun problème - le chemin se traduit comme prévu sans artefacts. Cependant, j'ai besoin de la fonction CATiledLayer pour zoomer sans flou (pour autant que je sache, il n'y a pas d'autre solution que de simplement régler contentscalefactor au niveau du zoom).

L'utilisation de la mémoire/CPU n'est pas anormale lorsque l'erreur est déclenchée.

Il est intéressant de noter que j'utilise les betas iOS 11 et Xcode 9. (Edit: arrive aussi sur iOS 10, mais utilise toujours le même Xcode 9 Beta)

J'ai essayé d'activer des objets zombies mais cela ne fournit aucune information utile.

+0

Mais votre code est secret? – matt

Répondre

0

CATiledLayer utilise plusieurs threads pour dessiner son contenu. De nombreuses opérations UIKit doivent être effectuées à partir du thread principal. La meilleure façon de conserver les avantages de la couche mosaïque doit être d'utiliser un chemin graphique principal au lieu du chemin UIKit. Voir aussi Technical Q&A 1637.

+0

J'ai essayé de dessiner un CGPath. Cela fonctionne maintenant bien quand vous traduisez, mais stil se bloque avec EXC_BAD_ACCESS quand j'essaye de * redimensionner * ou de le faire tourner – user3290287

+0

Sans votre code, personne ne pourra vous aider. – clemens