Я провел параллельное сравнение для обоих векторных изображений, используя предоставленные вами:
Сначала я использовал встроенный SwiftUI
Image
и, как уже упоминалось, оба плохо работали на своих крайних концах:
- Большое изображение получило четкие края при уменьшении
- Маленькое изображение было размыто при увеличении
Сначала я подумал, что это могут быть ваши векторы pdf, поэтому я использовал те, которые Я знаю, что хорошо работал в моих предыдущих проектах, но у меня были те же проблемы.
Думая, что это проблема UIImage
, я использовал SwiftUI
s Image(uiImage:)
, но та же проблема.
Последняя предположим, это был контейнер изображений, и зная, что UIImageView
хорошо справился с векторными изображениями, получение UIViewRepresentable
для переноса UIImageView
, похоже, решило эту проблему. И на данный момент это выглядит как возможный обходной путь.
Обходное решение:
struct MyImageView: UIViewRepresentable {
var name: String
var contentMode: UIView.ContentMode = .scaleAspectFit
var tintColor: UIColor = .black
func makeUIView(context: Context) -> UIImageView {
let imageView = UIImageView()
imageView.setContentCompressionResistancePriority(.fittingSizeLevel,
for: .vertical)
return imageView
}
func updateUIView(_ uiView: UIImageView, context: Context) {
uiView.contentMode = contentMode
uiView.tintColor = tintColor
if let image = UIImage(named: name) {
uiView.image = image
}
}
}
Это теряет некоторые SwiftUI
Image
модификаторы (у вас все еще есть обычные View
модификаторы), но вы всегда можно передать некоторые параметры, такие как contentMode
и tintColor
, как показано выше. Добавьте больше, если необходимо, и обработайте соответственно.
Пример использования:
struct ContentView: View {
var body: some View {
VStack {
MyImageView(name: "icon", //REQUIRED
contentMode: .scaleAspectFit, //OPTIONAL
tintColor: .black /*OPTIONAL*/)
.frame(width: 27, height: 27)
MyImageView(name: "icon_small", //REQUIRED
contentMode: .scaleAspectFit, //OPTIONAL
tintColor: .black /*OPTIONAL*/)
.frame(width: 27, height: 27)
}
}
}
Теперь это все предположение, но похоже, что SwiftUI
рассматривает векторные изображения как PNG
.
Следующий пример представляет собой простое параллельное сравнение малых и больших векторных изображений, отображаемых в UIKit
* UIImageView
и SwiftUI
* Image
.
Сравнение:
struct ContentView: View {
let (largeImage, smallImage) = ("icon", "icon_small")
let range = stride(from: 20, to: 320, by: 40).map { CGFloat($0) }
var body: some View {
List(range, id: \.self) { (side) in
ScrollView(.horizontal) {
VStack(alignment: .leading) {
Text(String(format: "%gx%g", side, side))
HStack {
VStack {
Text("UIKit")
MyImageView(name: self.smallImage)
.frame(width: side, height: side)
MyImageView(name: self.largeImage)
.frame(width: side, height: side)
}
VStack {
Text("SwiftUI")
Image(self.smallImage)
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: side)
Image(self.largeImage)
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: side)
}
}
}
}
}
}
}
Результаты:
- Верхний ряд; Слева: маленькое изображение в
UIImageView
- Верхний ряд; Справа: маленькое изображение в
SwiftUI
Image
- Нижний ряд; Слева: большое изображение в
UIImageView
- Нижний ряд; Справа: большое изображение в
SwiftUI
Image
UIKit
UIImageView
имеет стабильную производительность, в то время как SwiftUI
* Image
имеет проблемы.
![20x20](https://i.stack.imgur.com/Phs8f.png)
![60x60](https://i.stack.imgur.com/23Jf8.png)
![100x100](https://i.stack.imgur.com/Zbp3N.png)
![180x180](https://i.stack.imgur.com/5GnA8.png)