Mam duży obraz w Assets.xcassets. Jak zmienić rozmiar tego obrazu za pomocą SwiftUI, aby był mały?
Próbowałem ustawić ramkę, ale to nie działa:
Image(room.thumbnailImage)
.frame(width: 32.0, height: 32.0)
Odpowiedzi:
Powinieneś użyć .resizable()
przed zastosowaniem jakichkolwiek modyfikacji rozmiaru na Image
.
Image(room.thumbnailImage)
.resizable()
.frame(width: 32.0, height: 32.0)
aspectRatio(_:contentMode:)
Image("name").resizable().scaledToFit()
nie jest jednak zbugowany. Możesz więc zawinąć obraz w widoku, dostosować ramkę widoku do dowolnego wymaganego rozmiaru, a scaledToFit()
następnie sprawić, by obraz był tak duży, jak to tylko możliwe, zachowując proporcje.
Co powiesz na to:
struct ResizedImage: View {
var body: some View {
Image("myImage")
.resizable()
.scaledToFit()
.frame(width: 200.0,height:200)
}
}
widok obrazu ma wymiary 200x200, ale obraz zachowuje oryginalne proporcje (przeskalowanie w ramach tej klatki)
Image(uiImage: image!).resizable().aspectRatio(image!.size, contentMode: .fill)
gdzie image
jest typu, UIImage
ponieważ Image
typ nie ujawnia żadnej właściwości size.
Rozwinięcie odpowiedzi i komentarzy @ rraphael:
Począwszy od Xcode 11 beta 2, możesz skalować obraz do dowolnych wymiarów, zachowując oryginalne proporcje, zawijając obraz w inny element.
na przykład
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)
}
}
}
Wyniki
(Z jakiegoś powodu obraz jest nieco rozmyty. Możesz mieć pewność, że rzeczywisty obraz jest ostry).
.aspectRatio(1, ...
. Nie mówię, że jak dotąd inne rozwiązanie zadziałało dla mnie ...
W SwiftUI użyj .resizable()
metody, aby zmienić rozmiar obrazu. Używając .aspectRatio()
i określając a ContentMode
, możesz odpowiednio „Dopasować” lub „Wypełnić” obraz.
Na przykład, oto kod, który zmienia rozmiar obrazu przez dopasowanie:
Image("example-image")
.resizable()
.aspectRatio(contentMode: .fit)
Cóż, wydaje się to całkiem proste w SwiftUI / Po pokazie, które dali: 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)
}
Mam nadzieję, że to pomoże.
Uwaga: Moja nazwa obrazu to
img_Logo
i możesz zmienić nazwę obrazu zdefiniować właściwości obrazu w ten sposób:
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
}
Innym podejściem jest użycie scaleEffect
modyfikatora:
Image(room.thumbnailImage)
.resizable()
.scaleEffect(0.5)
Jeśli chcesz użyć proporcji przy zmianie rozmiaru, możesz użyć następującego kodu:
Image(landmark.imageName).resizable()
.frame(width: 56.0, height: 56.0)
.aspectRatio(CGSize(width:50, height: 50), contentMode: .fit)
Ponieważ nie powinniśmy kodować / naprawiać rozmiaru obrazu. Oto lepszy sposób na zapewnienie zakresu dostosowanego do rozdzielczości ekranu na różnych urządzeniach.
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)
Domyślnie widoki obrazów automatycznie dopasowują się do ich zawartości, co może spowodować, że wyjdą poza ekran. Jeśli dodasz modyfikator resizable (), obraz zostanie automatycznie dopasowany tak, aby wypełniał całą dostępną przestrzeń:
Image("example-image")
.resizable()
Jednak może to również spowodować zniekształcenie oryginalnego współczynnika kształtu obrazu, ponieważ zostanie rozciągnięty we wszystkich wymiarach o dowolną wielkość potrzebną do wypełnienia przestrzeni.
Jeśli chcesz zachować współczynnik proporcji, dodaj modyfikator AspectRatio, używając .fill lub .fit, na przykład:
Image("example-image")
.resizable()
.aspectRatio(contentMode: .fit)
Jeśli chcesz zmienić rozmiar obrazu w swiftUI, użyj następującego kodu:
import SwiftUI
struct ImageViewer : View{
var body : some View {
Image("Ssss")
.resizable()
.frame(width:50,height:50)
}
}
Ale tutaj jest z tym problem. Jeśli dodasz ten obraz do przycisku, obraz nie będzie wyświetlany, tylko blok koloru niebieskiego będzie tam. Aby rozwiązać ten problem, po prostu zrób to:
import SwiftUI
struct ImageViewer : View{
var body : some View {
Button(action:{}){
Image("Ssss")
.renderingMode(.original)
.resizable()
.frame(width:50,height:50)
}
}
}
Możesz zdefiniować właściwości obrazu w następujący sposób: -
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
Bardzo ważne jest zrozumienie logicznej struktury kodu. Podobnie jak w SwiftUI, rozmiar obrazu nie jest domyślnie zmieniany. W związku z tym, aby zmienić rozmiar dowolnego obrazu, należy nadać mu możliwość zmiany rozmiaru, stosując modyfikator .resizable () natychmiast po zadeklarowaniu widoku obrazu.
Image("An Image file name")
.resizable()