在我的应用中,我需要显示图像(纹理)。有些是平铺的,有些是拉伸的。
当时,我已经运行了以下代码:
Image(frame.image)
.resizable(resizingMode: (frame.repeatTexture == true) ? .tile : .stretch)
.frame(width: frame.width, height: frame.height)
但是,.tile 的渲染效果不佳。纹理在 X 轴上被裁剪。在发送的图像中,您可以看到右侧没有边框,边框被截断了。
原始纹理,左右都有边框:
例如,我希望仅在 Y 中“重复”。默认情况下似乎没有此选项。
是否有一个提示,一个选项,或者另一个想法,例如使用 background() 强制纹理仅在一个轴上平铺?
您可以使用 绘制图像的拉伸版本
GraphicsContext
,然后使用 平铺该版本resizable
,或者,只需用 绘制整个平铺图像
GraphicsContext
。我知道这是可以接受的,但我想展示一种不同的方法,让一些人可能觉得更容易接受。
如果
.resizable()
可以在设置图像的框架大小或缩放以适合后应用,则不会出现问题。但据我所知,.resizable()
必须是第一个修饰符,否则会出现成员错误。那么问题是,您如何首先设置图像的宽度或纵横比,以便最终获得一个
Image
可以使用的视图.resizable(resizingMode:)
?您可以先调整输入图像的大小以适合框架的宽度,然后渲染为(新)图像,再使用调整大小后的图像作为
Image
您将使用的视图的输入.resizable(resizingMode:)
。现在,有多种方法可以做到这一点,正如@Sweeper 所展示的那样,但在下面的代码中
ImageRenderer
,我使用了 iOS 16 中引入的,它可以从 SwiftUI 视图创建图像。这意味着您可以随心所欲地构建视图,然后将其用作 的输入ImageRenderer
,然后它基本上会成为您的重复图块。请参阅最后的示例。完整代码如下:
注意:我保存了您提供的原始图块图像,并对其进行了粗略裁剪,然后将其导入到 Assets 中,名称为“tile”。您也可以按照以下格式提供名称,也可以将类型更新为适合您的模型的任何类型:
这是使用的平铺图像:
可选示例- 由于
ImageRenderer
可以将任何视图作为输入,因此您可以根据需要自定义视图。这是一个粗略的示例,使用添加到的叠加层imageView
,添加将与图块重复的水印。