Xcode 9アセットカタログの新しい[ベクターデータを保持]チェックマークを使用すると、最終的にベクターPDF=画像のサイズ変更ができるようになりましたが、どうやらそうではありません。プレビューで2つのズームで見たテスト画像は次のとおりです。
ズームが多いので見た目もシャープなので、明らかにこれはベクター画像です。しかし、これが私のアプリで2つの画像ビューがどのように見えるかです。
では、ベクターデータはどこにあるのでしょうか。この待望の機能stillが機能していませんか?自動生成された2倍および3倍の画像でのみ機能しますか?もしそうなら、「ベクターデータを保持」チェックボックスは、私たちがまだ持っていなかったことに何を与えますか?
それは機能しますが、自分でサイズ変更を実行する場合にのみ:
これは、次のようにコードで実現されました。
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番目のイメージビューは拡大縮小のみを行い、それ以上は行いません。大幅リサイズ!
[〜#〜] edit [〜#〜]Xcode 11をいじってみると、常に機能する数式がようやく見つかりました。これは、起動時に、追加のコードなしで、イメージビューまたはその他の場所で、ベクトルベースのイメージがどのサイズでも鮮明に表示されることを意味します。
アセットカタログで、[スケール]ポップアップメニューを[個別スケール]に設定し、ベクターベースの画像を1xスロットに配置する必要があります。 [ベクターデータの保持]をチェックします。できました。
編集:Xcode 9でも同じバグのある動作GM(9A235)
今日(Xcode 9ベータ6 9M214v)の時点では、UIImageViewに少なくとも3つの間隔関連の制約がある場合にのみ、画像が適切にレンダリングされます(ぼやけていない)。
例えば。左への間隔、右への間隔、上への間隔、およびUIImageViewの高さを定義する別の制約。
また、自動レイアウトを完全に無効にすると、すべてのUIImageViewが正しくレンダリングされないことに注意してください。
このバグについては、rdar:// 34306192( http://www.openradar.me/radar?id=4968083747766272 )と入力しました。
新しいPreserves Vector Data
で同じ問題が何度も発生しました。
私にとって非常にうまく機能した超単純なソリューション:
UIImageView
image
プロパティを設定し、空のままにします。image
値を設定します。それが役に立てば幸い。
私の場合(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のクラスとして設定します)