Obtenir une capture d'écran d'une UIScrollView, y compris hors pièces
J'ai un UIScrollView
decendent qui implémente un takeScreenshot méthode qui ressemble à ceci:
-(void)takeScreenshot {
CGRect contextRect = CGRectMake(0, 0, 768, 1004);
UIGraphicsBeginImageContext(contextRect.size);
[self.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//do something with the viewImage here.
}
Fondamentalement déplace vers le haut de défilement de la vue, et prend une capture d'écran de la zone visible. Il fonctionne très bien lorsque l'iPad est orientée vers le portrait, mais quand il est dans le paysage du bas de l'image est coupée (comme la hauteur de la zone visible est seulement 748, pas 1004).
Est-il possible d'obtenir un instantané de l' UIScrollView
, y compris les zones qui ne sont pas sur l'écran? Ou ai-je besoin pour faire défiler l'affichage vers le bas, prendre une deuxième photo et de les coudre ensemble?
Vous devez vous connecter pour publier un commentaire.
Voici le code qui fonctionne ...
La dernière quelques lignées de simplement écrire l'image /tmp/test.png et puis l'ouvre dans l'Aperçu.app. De toute évidence, cela ne fonctionne que dans le Simulateur 🙂
Complète du projet dans le ScrollViewScreenShot Github
/tmp
dossier est vide!Pour moi, le actuellement accepté de répondre à de Stefan Arentz n'a pas fonctionné.
J'ai eu à mettre en œuvre ce sur iOS 8 et ci-dessus, et testé sur l'iPhone. La accepté de réponse juste, rend la partie visible d'un défilement de la vue, tandis que le reste de l'image reste vide.
J'ai essayé de fixation à l'aide de cette
drawViewHierarchyInRect
- pas de chance. SelonafterScreenUpdates
êtretrue
oufalse
j'ai tendu la partie de l'image ou une partie seulement du contenu.Le seul moyen que j'ai trouvé pour parvenir à corriger les instantanés d'une
UIScrollView
'ensemble du contenu est pour l'ajouter à un autre temporaire de la vue, puis l'afficher.Exemple de code est ci-dessous (
scrollview
est prise dans mon VC)Exemple de travail de UIView Extension avec la manipulation pour UIScrollView:
J'ai pris cette solution de @Roopesh Mittal réponse et le rend plus sûr et de nettoyage.
Swift 4 compatible
frame
etcontentOffset
ne seront pas restaurés. etUIGraphicsEndImageContext
ne sera pas appelé.Raffiné Swift 4.x/version 5.0, basé sur @RyanG 's réponse:
SWIFT 3 version:
Cela a fonctionné pour moi
Voici une autre manière de faire, qui prend le niveau de zoom en compte. J'ai un scrollview avec 4 différents UIImageView couches en elle, et je veux prendre une capture d'écran de leur état actuel:
Cela prend la capture d'écran en coordonnées absolues. C'est, si vous avez un 2048*2048 image dans la scrollview et vous pouvez voir environ un quart d'elle, alors quelle que soit la résolution de votre écran, il serait prendre une capture d'écran de 512*512. Si vous voulez prendre une capture d'écran à la résolution de votre écran (par exemple, 320*480), alors vous avez à régler l'image comme suit, directement après le code ci-dessus:
Si vous n'avez pas envie de développer votre défiler la vue au-delà de la totalité de l'écran (et il ne fonctionnera pas avec mise en page automatique de toute façon) il y a une meilleure façon.
Vous pouvez utiliser les graphiques de base se transforme en collaboration avec le
contentOffset
de défilement de la vue d'accomplir la même chose.Voici un post de blog j'ai écrit expliquant le processus.
Le processus de génération d'un PDF est très similaire à la capture instantanée d'une image, sauf qu'au lieu de pages, vous aurez besoin de faire une grande toile qui correspond à la taille de défilement de la vue et prenez ensuite le contenu dans les morceaux.
SWIFT 3 version grâce à @gleb vodovozov:
Je ne connais pas trop mais je suppose que si nous avons fixé la taille de la
contextRect
ce genre de paysage, il peut bien travailler:Parce que ce contextRect permettra de déterminer la taille de la
UIGraphicsBeginImageContext
j'espère donc que le double de la hauteur pour résoudre votre problème