web-dev-qa-db-fra.com

Le catalogue de ressources Xcode 9 préserve les données vectorielles ne fonctionne pas?

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:

enter image description here

enter image description here

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:

enter image description here

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à?

22
matt

Cela fonctionne, mais uniquement si vous effectuez vous-même le redimensionnement:

enter image description here

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!

enter image description here

[~ # ~] 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é.

5
matt

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.

enter image description here

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.

11
Guillaume Algis

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 :

  1. Jamais définissez la propriété UIImageViewimage dans Interface Builder, laissez-la simplement vide.
  2. Définissez la valeur image par programme.

J'espère que ça aide.

7
Fmessina

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)

5
Nikolay Suvandzhiev