Je pensais que la nouvelle coche Préserver les données vectorielles dans le catalogue d'actifs Xcode 9 nous donnerait enfin un redimensionnement des images vectorielles PDF, mais apparemment pas. Voici mon image de test vue à deux zooms dans Aperçu:
Agréable et net avec beaucoup de zoom, il s'agit donc clairement d'une image vectorielle. Mais voici à quoi ressemblent deux vues d'image dans mon application:
Alors, où sont mes données vectorielles? Cette fonctionnalité tant souhaitée est-elle toujours manquante en action? Cela fonctionne-t-il toujours uniquement pour les images 2x et 3x générées automatiquement? Et si oui, que nous donne la case Préserver les données vectorielles que nous n'avions pas déjà?
Cela fonctionne, mais uniquement si vous effectuez vous-même le redimensionnement:
Cela a été réalisé en code, comme ceci:
let im = UIImage(named:"Image")!
let r = UIGraphicsImageRenderer(size:self.iv2.bounds.size)
let im2 = r.image {
_ in
im.draw(in: self.iv2.bounds)
}
self.iv2.image = im2
self.iv2.contentMode = .center
Ainsi, UIImageView sera pixellisé à mesure qu'il évolue (par exemple pour Aspect Fit), mais le dessin dans le code préservera les données vectorielles.
[~ # ~] modifier [~ # ~] Nouveau dans Xcode 9 beta 5, cela fonctionne maintenant comme prévu! Dans cette capture d'écran, la deuxième vue d'image ne fait qu'une mise à l'échelle, pas plus. Nous redimensionnons fortement!
[~ # ~] edit [~ # ~] En jouant avec Xcode 11, j'ai finalement trouvé une formule qui fonctionne toujours. Cela signifie qu'au lancement, sans code supplémentaire, dans une vue d'image ou ailleurs, une image vectorielle apparaît nette à n'importe quelle taille.
Dans le catalogue d'actifs, vous devez définir le menu local Échelles sur Échelles individuelles et placer l'image vectorielle dans l'emplacement 1x. Cochez Conserver les données vectorielles. Terminé.
Edit: Toujours le même comportement de buggy dans Xcode 9 GM (9A235)
À partir d'aujourd'hui (Xcode 9 beta 6 9M214v), l'image ne sera rendue correctement (non floue) que si UIImageView a au moins 3 contraintes liées à l'espacement.
par exemple. l'espacement vers la gauche, l'espacement vers la droite, l'espacement vers le haut et une autre contrainte pour définir la hauteur UIImageView.
Notez également que la désactivation complète de la mise en page automatique rendra tout le rendu UIImageView incorrect.
J'ai rempli rdar: // 34306192 ( http://www.openradar.me/radar?id=4968083747766272 ) pour ce bogue.
J'ai rencontré plusieurs fois le même problème avec le nouveau Preserves Vector Data
.
Solution super simple qui a très bien fonctionné pour moi :
UIImageView
image
dans Interface Builder, laissez-la simplement vide.image
par programme.J'espère que ça aide.
Dans mon cas (Xcode 9.4.1), avec imageView
créé dans Interface Builder - j'ai remarqué que lorsque j'arrive à l'écran, l'image est floue. Si je change ensuite l'orientation de l'appareil, l'image devient nette. J'ai essayé d'appeler différentes méthodes manuellement dans viewDidLoad()
et voici ce que j'ai trouvé jusqu'à présent:
Cela a fonctionné:
let image = imageView.image
imageView.image = nil
imageView.image = image
Aucun de ceux-ci n'a fonctionné:
imageView.layoutSubviews()
imageView.layoutMarginsDidChange()
imageView.setNeedsLayout()
imageView.setNeedsDisplay()
imageView.reloadInputViews()
imageView.updateConstraints()
imageView.contentMode = .center ; imageView.contentMode = .scaleToFill
Vous devez bien sûr étendre ou sous-classer UIImageView
si vous l'appelez souvent, comme ceci par exemple
class UIImageViewWithPreserveVectorDataFix: UIImageView {
override func awakeFromNib() {
super.awakeFromNib()
let image = self.image
self.image = nil
self.image = image
}
}
(et bien sûr, définissez UIImageViewWithPreserveVectorDataFix
comme classe dans Interface Builder)