SwiftUI Image scaledToFill 布局行为

Posted

技术标签:

【中文标题】SwiftUI Image scaledToFill 布局行为【英文标题】:SwiftUI Image scaledToFill layout behaviour 【发布时间】:2021-06-13 16:36:14 【问题描述】:

在我的 ios 14 小部件中,我想连续显示多个圆形图像。

当使用scaledToFit() 时,图像会奇怪地拉伸以适应圆圈。 scaledToFill() 给了我想要的输出,如下所示:

Image("Person")
    .resizable()
    .scaledToFill()
    .clipShape(Circle())

但这会改变视图的行为以忽略它的父级并扩展到它之外。设置固定框架可以防止这种情况,但我需要这些图像动态调整大小。当我将此视图放在我的小部件中的 HStack 中时,图像太大了。

我怎样才能让图像像scaledToFill() 一样缩放并且仍然尊重父视图。

【问题讨论】:

【参考方案1】:

您可以尝试使用几何阅读器。这是我在 Widget 中使用的示例代码,因此您必须针对您的项目对其进行调整,但是,您会明白的。

GeometryReader  geo in
        ZStack(alignment: .bottom) 
        HStack 
               Image("Person")
                    .resizable()
                    .frame(width: geo.size.width, height: geo.size.height)
                    .aspectRatio(contentMode: .fit)
            
        
    

【讨论】:

【参考方案2】:

我在这篇文章中找到了一个解决方案,第一个答案在小部件中效果很好:

***.com/questions/58290963/clip-image-to-square-in-swiftui

但是,我在我的应用程序中重用了视图,这导致了一些奇怪的行为。相反,我现在在创建视图之前将图像剪裁为圆形。这让我可以使用.scaledToFit() 并且仍然保持图像的原始纵横比。

【讨论】:

【参考方案3】:

我发现将 GeometryReader 直接包装到图像中时效果最好

HStack 
    GeometryReader  geo in
        Image("Person")
          .resizable()
          .scaledToFill()
          .frame(width: geo.size.width, height: geo.size.height)
    


【讨论】:

以上是关于SwiftUI Image scaledToFill 布局行为的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 SwiftUI TabView 点指示器位置?

在 SwiftUI 中填充父级

背景图像顶部周围的空间

SwiftUI基础 - Image 图片

SwiftUI基础 - Image 图片

为啥 SwiftUI 教程中没有显示 Image 对象?