




Вы должны использовать .resizable(), прежде чем применять какие-либо изменения размера к Image.
Image(room.thumbnailImage)
.resizable()
.frame(width: 32.0, height: 32.0)
Этот метод требует, чтобы вы указали соотношение сторон. Я хотел бы сохранить исходное соотношение сторон изображения, но ограничить его наилучшим образом по высоте кадра, центрируя содержимое изображения и обрезая кадр.
@MarkKang Я не знаю, можете ли вы сделать это динамически. Одним из решений было бы жестко закодировать соотношение сторон фактического изображения.
Image("image01") .resizable() .aspectRatio(UIImage(named: "image01")!.size, contentMode: .fit)
@MarkKang - моя версия: Image(person.photo).resizable().aspectRatio(contentMode: ContentMode.fit)
Это было бы чудесно. Но я думаю, что есть ошибка с посадкой. hackingwithswift.com/swiftui/…
Image("name").resizable().scaledToFit() не прослушивается, однако. Таким образом, вы можете обернуть свое изображение в представление, отрегулировать рамку представления до любого размера, который вам нужен, затем scaledToFit() затем сделает изображение максимально большим, сохраняя при этом соотношение сторон.
Image("name").resizable().scaledToFit() не сохраняет исходное соотношение сторон для меня
Значение типа «некоторый вид» не имеет члена «изменяемого размера»
Если вы хотите использовать соотношение сторон с изменением размера, вы можете использовать следующий код:
Image(landmark.imageName).resizable()
.frame(width: 56.0, height: 56.0)
.aspectRatio(CGSize(width:50, height: 50), contentMode: .fit)
Расширение ответа и комментариев @rraphael:
Начиная с Xcode 11 beta 2, вы можете масштабировать изображение до произвольных размеров, сохраняя при этом исходное соотношение сторон, заключая изображение в другой элемент.
например
struct FittedImage: View
{
let imageName: String
let width: CGFloat
let height: CGFloat
var body: some View {
VStack {
Image(systemName: imageName)
.resizable()
.aspectRatio(1, contentMode: .fit)
}
.frame(width: width, height: height)
}
}
struct FittedImagesView: View
{
private let _name = "checkmark"
var body: some View {
VStack {
FittedImage(imageName: _name, width: 50, height: 50)
.background(Color.yellow)
FittedImage(imageName: _name, width: 100, height: 50)
.background(Color.yellow)
FittedImage(imageName: _name, width: 50, height: 100)
.background(Color.yellow)
FittedImage(imageName: _name, width: 100, height: 100)
.background(Color.yellow)
}
}
}
Результаты
(По какой-то причине изображение выглядит немного размытым. Будьте уверены, что реальный результат резкий.)
Вы, вероятно, видите размытое изображение на SO, потому что используете монитор с высоким разрешением. Я поставил это на монитор с обычным DPI, и он выглядит четким.
Это сохраняет исходное соотношение сторон только потому, что соотношение сторон исходного изображения равно 1 (изображение квадратное), и вы используете .aspectRatio(1, ... . Не сказать, что какое-либо другое решение здесь работало для меня до сих пор...
Ну, это кажется довольно просто в SwiftUI / Следуя демонстрации, которую они дали: https://developer.apple.com/videos/play/wwdc2019/204
struct RoomDetail: View {
let room: Room
var body: some View {
Image(room.imageName)
.resizable()
.aspectRatio(contentMode: .fit)
}
Надеюсь, поможет.
Как насчет этого:
struct ResizedImage: View {
var body: some View {
Image("myImage")
.resizable()
.scaledToFit()
.frame(width: 200, height: 200)
}
}
Вид изображения имеет размер 200x200, но изображение сохраняет исходное соотношение сторон (изменение масштаба в пределах этого кадра).
Это решение не сохраняет исходное соотношение сторон в моем случае.
@ pm89 какого размера ваше исходное и окончательное изображение / вид?
Исходное соотношение сторон составляет 3/2, а в результате получается 1/1, что растягивает изображение. Кажется, это ошибка SwiftUI. В итоге я использовал метод, предложенный Марком Кангом в комментариях под принятым ответом, Image(uiImage: image!).resizable().aspectRatio(image!.size, contentMode: .fill), где image имеет тип UIImage, потому что тип Image не предоставляет никакого свойства размера.
Для меня это работает так, включая сохранение соотношения сторон, спасибо ?
Это сохраняет соотношение сторон для меня, но не учитывает размер, т. Е. Я не получаю квадратное изображение.
@ChrisPrince - в этом суть. Это сохраняет соотношение сторон изображения, но в пределах представляет собой «коробку» 200 на 200.
ОЙ! Ok. Я ошибся в первоначальной цели. Моей целью было сделать квадратное изображение, обрезав его без искажений. Но это меняет соотношение сторон изображения. Спасибо.
@ChrisPrince Я думаю, что scaledToFill() сделает это за вас
Если вы хотите изменить размер изображения в swiftUI, просто используйте следующий код:
import SwiftUI
struct ImageViewer : View{
var body : some View {
Image("Ssss")
.resizable()
.frame(width:50,height:50)
}
}
Но вот с этим проблема. Если вы добавите это изображение внутрь кнопки, изображение не будет отображаться, там будет только блок синего цвета. Чтобы решить эту проблему, просто сделайте следующее:
import SwiftUI
struct ImageViewer : View{
var body : some View {
Button(action:{}){
Image("Ssss")
.renderingMode(.original)
.resizable()
.frame(width:50,height:50)
}
}
}
В SwiftUI используйте метод .resizable() для изменения размера изображения. Используя .aspectRatio() и указав ContentMode, вы можете либо «Подогнать», либо «Заполнить» изображение, в зависимости от ситуации.
Например, вот код, который изменяет размер изображения путем подгонки:
Image("example-image")
.resizable()
.aspectRatio(contentMode: .fit)
Поскольку мы не должны жестко кодировать/фиксировать размер изображения. Вот лучший способ обеспечить диапазон для настройки в соответствии с разрешением экрана на разных устройствах.
Image("ImageName Here")
.resizable()
.frame(minWidth: 60.0, idealWidth: 75.0, maxWidth: 95.0, minHeight: 80.0, idealHeight: 95.0, maxHeight: 110.0, alignment: .center)
.scaledToFit()
.clipShape(Capsule())
.shadow(color: Color.black.opacity(5.0), radius: 5, x: 5, y: 5)
Вы можете определить свойства изображения следующим образом:
Image("\(Image Name)")
.resizable() // Let you resize the images
.frame(width: 20, height: 20) // define frame size as required
.background(RoundedRectangle(cornerRadius: 12) // Set round corners
.foregroundColor(Color("darkGreen")) // define foreground colour
Очень важно понимать логическую структуру кода. Как и в SwiftUI, размер изображения по умолчанию не изменяется. Таким образом, чтобы изменить размер любого изображения, вы должны сделать его изменяемым, применив модификатор .resizable() сразу после объявления представления изображения.
Image("An Image file name")
.resizable()
Note : My image name is
img_Logoand you can change image name define image properties this:
VStack(alignment: .leading, spacing: 1) {
//Image Logo Start
Image("img_Logo")
.resizable()
.padding(.all, 10.0)
.frame(width: UIScreen.main.bounds.width * 0.4, height: UIScreen.main.bounds.height * 0.2)
//Image Logo Done
}
Я настоятельно рекомендую вам написать краткий текст вместе с вашим кодом, какое-то объяснение. Пожалуйста, ознакомьтесь с кодексом поведения здесь: stackoverflow.com/conduct
struct AvatarImage: View {
var body: some View {
Image("myImage")
.resizable()
.scaledToFill() // <=== Saves aspect ratio
.frame(width: 60.0, height:60)
.clipShape(Circle())
}
}
Другой подход — использовать модификатор scaleEffect:
Image(room.thumbnailImage)
.resizable()
.scaleEffect(0.5)
По умолчанию представления изображений автоматически масштабируются в соответствии с их содержимым, что может привести к их выходу за пределы экрана. Если вы добавите модификатор resizable(), вместо этого размер изображения будет автоматически изменен так, чтобы он заполнил все доступное пространство:
Image("example-image")
.resizable()
Однако это также может привести к искажению исходного соотношения сторон изображения, поскольку оно будет растянуто во всех измерениях на величину, необходимую для заполнения пространства.
Если вы хотите сохранить его соотношение сторон, вы должны добавить модификатор aspectRatio, используя либо .fill, либо .fit, например:
Image("example-image")
.resizable()
.aspectRatio(contentMode: .fit)
Используйте метод .resizable() после имени изображения.
Убедитесь, что использование .resizable() необходимо объявить перед любыми изменениями.
так:
Image("An Image file name")
.resizable()
//add other modifications here
Вы можете использовать свойство изменяемый размер(), но имейте в виду, что вы не можете использовать изменяемый размер в общем модификаторе, поэтому вам нужно использовать расширение изображения для его достижения.
extension Image {
func customModifier() -> some View {
self
.resizable()
.aspectRatio(contentMode: .fit)
}
Чтобы изображение масштабировалось в соответствии с текущим представлением, мы используем модификатор resizable(), который изменяет размер изображения в соответствии с доступным пространством.
Например:
Image("ImageName")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 200, height: 200, alignment: .center)
Это уже объяснялось в других ответах, здесь ничего нового.
Предлагается использовать следующий код для соответствия нескольким размерам экрана:
Image("dog")
.resizable()
.frame(minWidth: 200, idealWidth: 400, maxWidth: 600, minHeight: 100, idealHeight: 200, maxHeight: 300, alignment: .center)
Image(systemName: "person.fill")
.font(.system(size: 13))
также будет работать, если вы используете systemName.
Изображение (room.thumbnailImage) .frame(ширина: 32,0, высота: 32,0)
Добавить изменяемый размер и рамку
.resizable() .frame( maxWidth: 600, maxHeight: 300,)
Это то же решение, что и в принятый ответ. Отвечая на старые вопросы, на которые уже есть ответы, убедитесь, что вы предоставили либо новое решение, либо значительно лучшее объяснение, чем существующие ответы.
Вам нужно добавить модификатор .resizable, чтобы иметь возможность изменять размер изображения.
Тогда код будет выглядеть так:
Image(room.thumbnailImage)
.resizable()
.frame(width: 32.0, height: 32.0)
вы также можете использовать:
Изображение("Пример") .scaleEffect (ЧислоWithSizeBetweenZeroAndOne)
И как изменить размер изображения, сохранив соотношение сторон?