web-dev-qa-db-ja.com

Xcode 9アセットカタログでベクターデータが保持されない

Xcode 9アセットカタログの新しい[ベクターデータを保持]チェックマークを使用すると、最終的にベクターPDF=画像のサイズ変更ができるようになりましたが、どうやらそうではありません。プレビューで2つのズームで見たテスト画像は次のとおりです。

enter image description here

enter image description here

ズームが多いので見た目もシャープなので、明らかにこれはベクター画像です。しかし、これが私のアプリで2つの画像ビューがどのように見えるかです。

enter image description here

では、ベクターデータはどこにあるのでしょうか。この待望の機能stillが機能していませんか?自動生成された2倍および3倍の画像でのみ機能しますか?もしそうなら、「ベクターデータを保持」チェックボックスは、私たちがまだ持っていなかったことに何を与えますか?

22
matt

それは機能しますが、自分でサイズ変更を実行する場合にのみ:

enter image description here

これは、次のようにコードで実現されました。

    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

そのため、UIImageViewはスケーリングに応じてラスタライズしますが(たとえば、アスペクトフィットの場合)、コードで描画するとベクターデータが保持されます。

[〜#〜] edit [〜#〜]Xcode 9ベータ5の新機能で、期待どおりに動作するようになりました!このスクリーンショットでは、2番目のイメージビューは拡大縮小のみを行い、それ以上は行いません。大幅リサイズ!

enter image description here

[〜#〜] edit [〜#〜]Xcode 11をいじってみると、常に機能する数式がようやく見つかりました。これは、起動時に、追加のコードなしで、イメージビューまたはその他の場所で、ベクトルベースのイメージがどのサイズでも鮮明に表示されることを意味します。

アセットカタログで、[スケール]ポップアップメニューを[個別スケール]に設定し、ベクターベースの画像を1xスロットに配置する必要があります。 [ベクターデータの保持]をチェックします。できました。

5
matt

編集:Xcode 9でも同じバグのある動作GM(9A235)

今日(Xcode 9ベータ6 9M214v)の時点では、UIImageViewに少なくとも3つの間隔関連の制約がある場合にのみ、画像が適切にレンダリングされます(ぼやけていない)。

例えば。左への間隔、右への間隔、上への間隔、およびUIImageViewの高さを定義する別の制約。

enter image description here

また、自動レイアウトを完全に無効にすると、すべてのUIImageViewが正しくレンダリングされないことに注意してください。

このバグについては、rdar:// 34306192( http://www.openradar.me/radar?id=4968083747766272 )と入力しました。

11
Guillaume Algis

新しいPreserves Vector Dataで同じ問題が何度も発生しました。

私にとって非常にうまく機能した超単純なソリューション:

  1. なし Interface BuilderでUIImageViewimageプロパティを設定し、空のままにします。
  2. プログラムでimage値を設定します。

それが役に立てば幸い。

7
Fmessina

私の場合(Xcode 9.4.1)で、Interface BuilderでimageViewを作成しました-最初に画面に到達したとき、画像がぼやけていることに気付きました。次にデバイスの向きを変更すると、画像がくっきりします。 viewDidLoad()でさまざまなメソッドを手動で呼び出してみました。

これはうまくいきました:

let image = imageView.image
imageView.image = nil
imageView.image = image

これらのどれもうまくいきませんでした:

imageView.layoutSubviews()
imageView.layoutMarginsDidChange()
imageView.setNeedsLayout()
imageView.setNeedsDisplay()
imageView.reloadInputViews()
imageView.updateConstraints()
imageView.contentMode = .center ; imageView.contentMode = .scaleToFill

たとえば、次のように頻繁に呼び出す場合は、UIImageViewを拡張またはサブクラス化する必要があります。

class UIImageViewWithPreserveVectorDataFix: UIImageView {
    override func awakeFromNib() {
        super.awakeFromNib()
        let image = self.image
        self.image = nil
        self.image = image
    }
}

(そしてもちろん、UIImageViewWithPreserveVectorDataFixをInterface Builderのクラスとして設定します)

5