Как изменить размер изображения с помощью SwiftUI?

У меня есть большое изображение в Assets.xcassets. Как изменить размер этого изображения с помощью SwiftUI, чтобы сделать его маленьким?

Я попытался установить рамку, но это не работает:

Image(room.thumbnailImage)
    .frame(width: 32.0, height: 32.0)
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
172
0
147 311
23
Перейти к ответу Данный вопрос помечен как решенный

Ответы 23

Ответ принят как подходящий

Вы должны использовать .resizable(), прежде чем применять какие-либо изменения размера к Image.

Image(room.thumbnailImage)
    .resizable()
    .frame(width: 32.0, height: 32.0)

И как изменить размер изображения, сохранив соотношение сторон?

Mark Kang 11.06.2019 13:22

@MarkKang Я не пробовал, но есть метод с именем aspectRatio(_:contentMode:)

rraphael 11.06.2019 13:37

Этот метод требует, чтобы вы указали соотношение сторон. Я хотел бы сохранить исходное соотношение сторон изображения, но ограничить его наилучшим образом по высоте кадра, центрируя содержимое изображения и обрезая кадр.

Mark Kang 11.06.2019 14:03

@MarkKang Я не знаю, можете ли вы сделать это динамически. Одним из решений было бы жестко закодировать соотношение сторон фактического изображения.

rraphael 11.06.2019 14:12

Image("image01") .resizable() .aspectRatio(UIImage(named: "image01")!.size, contentMode: .fit)

Mark Kang 11.06.2019 14:22

@MarkKang - моя версия: Image(person.photo).resizable().aspectRatio(contentMode: ContentMode.fit)

Alex 13.06.2019 15:05

Это было бы чудесно. Но я думаю, что есть ошибка с посадкой. hackingwithswift.com/swiftui/…

Mark Kang 13.06.2019 15:09
Image("name").resizable().scaledToFit() не прослушивается, однако. Таким образом, вы можете обернуть свое изображение в представление, отрегулировать рамку представления до любого размера, который вам нужен, затем scaledToFit() затем сделает изображение максимально большим, сохраняя при этом соотношение сторон.
jemmons 14.06.2019 02:57
Image("name").resizable().scaledToFit() не сохраняет исходное соотношение сторон для меня
p8me 27.12.2019 19:50

Значение типа «некоторый вид» не имеет члена «изменяемого размера»

Ben 15.05.2021 00:19

Если вы хотите использовать соотношение сторон с изменением размера, вы можете использовать следующий код:

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)

        }
    }
}

Результаты

Fitted images preserving aspect ratio

(По какой-то причине изображение выглядит немного размытым. Будьте уверены, что реальный результат резкий.)

Вы, вероятно, видите размытое изображение на SO, потому что используете монитор с высоким разрешением. Я поставил это на монитор с обычным DPI, и он выглядит четким.

Ky. 09.07.2019 18:33

Это сохраняет исходное соотношение сторон только потому, что соотношение сторон исходного изображения равно 1 (изображение квадратное), и вы используете .aspectRatio(1, ... . Не сказать, что какое-либо другое решение здесь работало для меня до сих пор...

p8me 27.12.2019 19:58

Ну, это кажется довольно просто в 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, но изображение сохраняет исходное соотношение сторон (изменение масштаба в пределах этого кадра).

Это решение не сохраняет исходное соотношение сторон в моем случае.

p8me 27.12.2019 19:50

@ pm89 какого размера ваше исходное и окончательное изображение / вид?

Confused Vorlon 29.12.2019 16:26

Исходное соотношение сторон составляет 3/2, а в результате получается 1/1, что растягивает изображение. Кажется, это ошибка SwiftUI. В итоге я использовал метод, предложенный Марком Кангом в комментариях под принятым ответом, Image(uiImage: image!).resizable().aspectRatio(image!.size, contentMode: .fill), где image имеет тип UIImage, потому что тип Image не предоставляет никакого свойства размера.

p8me 30.12.2019 00:38

Для меня это работает так, включая сохранение соотношения сторон, спасибо ?

laka 01.06.2020 18:41

Это сохраняет соотношение сторон для меня, но не учитывает размер, т. Е. Я не получаю квадратное изображение.

Chris Prince 17.11.2020 06:23

@ChrisPrince - в этом суть. Это сохраняет соотношение сторон изображения, но в пределах представляет собой «коробку» 200 на 200.

Confused Vorlon 17.11.2020 15:13

ОЙ! Ok. Я ошибся в первоначальной цели. Моей целью было сделать квадратное изображение, обрезав его без искажений. Но это меняет соотношение сторон изображения. Спасибо.

Chris Prince 18.11.2020 17:33

@ChrisPrince Я думаю, что scaledToFill() сделает это за вас

Confused Vorlon 18.11.2020 18:15

Если вы хотите изменить размер изображения в 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_Logo and 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

disp_name 07.04.2020 17:55
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)

Это уже объяснялось в других ответах, здесь ничего нового.

Eric Aya 17.05.2021 11:00

Предлагается использовать следующий код для соответствия нескольким размерам экрана:

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.

Чтобы отобразить изображение с подходящим соотношением сторон и отсечением по границам, используйте этот код:

struct ContentView: View {
    var body: some View {
        Image("donuts")
            .resizable()
            .scaledToFill()
            .frame(width: 200, height: 200)
            .border(Color.pink)
            .clipped()
    }
}

Результат:

Изображение (room.thumbnailImage) .frame(ширина: 32,0, высота: 32,0)

Добавить изменяемый размер и рамку

.resizable() .frame( maxWidth: 600, maxHeight: 300,)

Это то же решение, что и в принятый ответ. Отвечая на старые вопросы, на которые уже есть ответы, убедитесь, что вы предоставили либо новое решение, либо значительно лучшее объяснение, чем существующие ответы.

Eric Aya 16.11.2021 00:10

Вам нужно добавить модификатор .resizable, чтобы иметь возможность изменять размер изображения.

Тогда код будет выглядеть так:

Image(room.thumbnailImage)
    .resizable()
    .frame(width: 32.0, height: 32.0)

вы также можете использовать:

Изображение("Пример") .scaleEffect (ЧислоWithSizeBetweenZeroAndOne)

Другие вопросы по теме