SwiftUI:动态设置图像的大小

Posted

技术标签:

【中文标题】SwiftUI:动态设置图像的大小【英文标题】:SwiftUI: Dynamically set size for Image 【发布时间】:2019-07-02 06:59:41 【问题描述】:

我想在视图中显示图像,其中图像源的大小会有所不同。 有没有办法将图像的大小动态调整为包含视图的宽度,或者甚至获得屏幕大小? 我有一个水平滚动视图,每个元素都是图像和文本的堆栈。我想根据屏幕宽度调整每个图像的大小,因为我想独立于设备。 你会如何在 SwiftUI 中做到这一点? 谢谢!

struct ImageRow: View 
    var items: [ImageWithDescription]

    var body: some View 

        ScrollView(showsHorizontalIndicator: false) 
                HStack(alignment: .bottom)

                    ForEach(self.items.identified(by: \.name))  item in
                       Spacer()
                        VStack 
                        Image(uiImage: item.image ?? UIImage())
                            .resizable()
                            .frame(minWidth: (item.image.size.width) / 3, height: (item.image.size.height) / 3)
                            .cornerRadius(20, antialiased: true)
                            .clipShape(Rectangle())
                            .shadow(radius: 10)

                        Text(item.name)
                        .color(.primary)
                        .font(.subheadline)

                        
                    
                    .padding()
                
                
                .frame(height: 300)

    

【问题讨论】:

【参考方案1】:

您可以获取屏幕(或窗口,如果您使用的是带分屏的 iPad)的大小。

在下面的示例中,顶视图使用 GeometryReader 获取大小并将其向下传递到层次结构。子视图使用该数据创建一个只有屏幕一半大小的蓝色矩形。如果设备旋转,它也会适应。

GeometryReader 有很多功能,虽然它们几乎没有文档记录,但我已经写了一篇文章充分解释了如何使用它们:https://swiftui-lab.com/geometryreader-to-the-rescue/

struct ContentView: View 

    var body: some View 

        GeometryReader  geometry in
            MySubview(size: geometry.size)
        

    


struct MySubview: View 
    let size: CGSize

    var body: some View 
        print("size = \(size)")
        return Color.blue.frame(width: size.width / 2, height: size.height / 2).fixedSize()
    

【讨论】:

当我这样做时,我收到错误“无法将 'CGSize.Type' 类型的值转换为预期的参数类型 'CGSize'”。你知道如何解决这个问题吗:?

以上是关于SwiftUI:动态设置图像的大小的主要内容,如果未能解决你的问题,请参考以下文章

在 SwiftUI 中,如何通过动态变化的滚动区域来缩放 scrollView 内的内容?

SwiftUI:如何在动态列表或 LazyVStack 中获取视图框架

SwiftUI 列表中基于约束的图像布局

SwiftUI:如何限制图像大小?

SwiftUI:使用 ForEach 动态加载图像

SwiftUI 视图,如 UIKit UIView,如何更改图像的大小