NSAttributedString: image qui s'adapte au containeur
Bonjour,
J'ai une NSAttributedString crée à partir d'un code HTML et ça affiche des images mais elles ne sont pas adaptées au containeur c'est à dire qu'elles dépassent l'écran. Comment faire pour les redimentionner ?
Merci d'avance,
Flow
Mots clés:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Comment faire pour remplacer par une version plus petite ?
Bah il faut générer l'image en plus petit, puis la remplacer :P
Après pour générer une miniature d'une UIImage existante tu as déjà des sujets qui traà®nent sur le sujet (perso j'ai un fait un pod il y a longtemps qui s'appelle UIImage-Resize dispo sur mon GitHub mais sur Google tu en trouves plein)
J'ai trouvé quelque chose qui devrait faire l'affaire pour ça mais je suis un peu bloqué.
Je ne comprend pas pourquoi attachment.image n'est pas défini alors que ce sont des images et que image.fileType renvoie "public.png"
EDIT: J'ai compris, cela doit être défini mais alors comment transformer mon NSTextAttachment en image ?
Tu serais peut-être intéresser par cela: http://stackoverflow.com/questions/19671666/how-to-subclass-nstextattachment/21150241#21150241
Si j'ai bien tout suivi : Subclassing de NSTextAttachment pour qu'il resize lui-même les images en fonction des settings (taille de la font, taille arbitraire, etc.)
Je me suis un peu amusé avec la manipulations des images dans un NSAttributedString, pour un de mes projets. J'ai écris un code "SpaceInvader" parcourant un NSAttributedString et remplaçant toutes les images rencontrées par des aliens.
Les graphismes sont de petites images png de 32x32 pixels.
Le problème c'est que textAttachement.image renvoie nil...
Chez moi, textAttachement.image contient bien une image UIImage. Est-ce que tu as essayé d'afficher la taille de l'image, comme dans le code ci-joint ?
Je précise que j'utilise Xcode bêta 6.3 (swift 1.2).
@Draken: Je pense que ça dépend d'où vient l'image. Dans le cas d'HTML, j'pense qu'il faudrait faire un truc comme j'ai fait. Donc à vérifier si attachment.image est nil et si le fileType correspond bien à une image.
Draken: Non, c'est bien une optionnel vide
Larme: textContainer ne peut pas être nil de plus, la condition range.location == 0 ne semble jamais être remplie dans mon cas
Pardon, le range.location == 0 est dans mon cas de test (j'ai mis 2 images, et j'voulais vérifier que j'arrivais bien à récupérer la première image et la mettre dans une UIImageView.
J'ai pu mettre le paramètre textContainer à nil sans problème dans mon cas. Faudrait peut-être chercher sinon ce qu'on pourrait dedans.
Effectivement ça a l'air de fonctionner !
Je cherche maintenant à redimensionner mon image.
Voilà mon code, l'image est bien redimensionnée (avec une fonction maison) quand j'affiche les nouvelles tailles dans la console mais la nouvelle image n'a pas l'air de s'afficher:
Une fonction pour changer la taille d'une image :
J'ai modifié ma séquence "invader" pour réduire les images à 75% au lieu de les remplacer par un alien.
Résultat en image :
ça marche super ! Merci beaucoup à tous !
Voilà mon code final:
Draken, j'ai modifié ta fonction pour l'intégrer directement à UIImage via une extension:
Ton code ne risque pas de fonctionner. Il faut détruire l'ancien NSTextAttachment, en créer un nouveau et le stocker dans la chaine. Toi, tu détruis l'ancien NSTextAttchement sans en créer un autre. Tu transmets une UIImage alors qu'il faudrait un NSTextAttachment encapsulant l'UIImage. Le compilateur ne repère pas l'erreur, parce que le paramètre Value étant de type AnyObject, peut contenir n'importe quoi.
Euh, si j'ai bien tout suivi, ton idée, c'est de faire :
stringHTML => NSAttributedString => RedimensionnementImage du NSAttributedString => Affichage
Du coup, le dispatch main queue, il sert à quoi exactement ? Et pour rappel, normalement, il n'y a pas besoin de supprimer l'ancien NSTextAttachment, car le tout est mis dans un dictionnaire avec la clé NSAttachmentAttributeName, or un dictionnaire (et si on garde le même range dans notre cas pour l'application de ce dernier), y'a unicité de la valeur.
Mon problème est résolu (voir mon dernier post), merci à tous effectivement j'avais aussi oublié de passer un NSTextAttachment.
Ah, je suis face à un nouveau problème:
Je viens d'installer Xcode 6.2, avec le simulateur d'iOS 8.2 donc et la fonction resizeImage() provoque ce message d'erreur dans la console:
Je ne comprend pas pourquoi, tout fonctionnait bien avec Xcode 6.1 et iOS 8.1...
Pourtant ça fonctionne avec Xcode 6.3 Beta !
Bon apparemment c'est juste l'extension qui buguait...