SwiftUI 缩放视图而不影响几何

Posted

技术标签:

【中文标题】SwiftUI 缩放视图而不影响几何【英文标题】:SwiftUI scale view without affecting geometry 【发布时间】:2020-05-18 08:55:13 【问题描述】:

寻找一种在不影响底层几何图形的情况下缩放视图(屏幕)的方法。

所以目前我有一个 SwiftUI 视图 (ScaleViewTest),我添加了一个 ZStack,其背景为矩形,覆盖了整个视图(忽略安全区域)

在我的预览结构中,我添加了一个值为 0.99 的缩放修饰符,它应该按比例将视图缩放到该因子...理论上。

实际发生的是它正在改变内部视图的几何形状,(在这种情况下,内部视图显示,“我们只获得了 99% 的屏幕可以使用,因此,我们没有安全区域)

我想要实现的是能够在没有内部视图几何形状的情况下缩放视图。

我试过了:

使用GeometryReader 获取safeAreaInsets 但不起作用,因为没有安全区域。

粘贴代码以提供参考。

struct ScaleViewTest: View 
    var body: some View 
      ZStack 
        Rectangle()
        .fill(LinearGradient(gradient: Gradient(colors: [Color.init(hexadecimal: "#005A65"), Color.init(hexadecimal: "#002D33")]), startPoint: .top, endPoint: .bottom))
          .edgesIgnoringSafeArea(.all)

        Text("Hello, this is a new view")
          .foregroundColor(.white)
          .font(.system(size: 22))

      
    


struct ScaleViewTest_Previews: PreviewProvider 
    static var previews: some View 
        ScaleViewTest()
          .scaleEffect(0.99)
    

很难理解正在发生的事情,如果您需要任何其他信息,请留下一些 cmet。但是我想要实现的一个例子就像 Airbnb,当你点击一个列表时,你会看到父视图缩小。

【问题讨论】:

【参考方案1】:

任何修饰符创建新视图,它在父容器中与默认规则对齐,直到明确指定。

所以这个

    ScaleViewTest()
        .scaleEffect(0.99) // << new view

和这个类似

    ScaleViewTest()
        .frame(height: 400) // << new view

可能大家都认为从第二个开始期待全屏是很奇怪的,所以第一个也是一样。

因此,将结果视图拉伸到全屏的解决方案显然是,

    ScaleViewTest()
      .scaleEffect(0.99)
      .edgesIgnoringSafeArea(.all)

更新:建议的解决方案 - 通过绑定将比例移动到内部(外部可管理和动画)

所以在预览中

ScaleViewTest(scale: .constant(0.99))

给予

struct ScaleViewTest: View 
    @Binding var scale: CGFloat
    var body: some View 
      ZStack 
        Rectangle()
            .fill(LinearGradient(gradient: Gradient(colors: [Color.blue, Color.yellow]), startPoint: .top, endPoint: .bottom))

        Text("Hello, this is a new view")
          .foregroundColor(.white)
          .font(.system(size: 22))

      
      .scaleEffect(scale)
      .edgesIgnoringSafeArea(.all)
    

【讨论】:

如果你还想在ScaleViewTest中使用安全区怎么办?例如,文本位于屏幕顶部而不是中心?在该视图中,我似乎无法从几何阅读器访问安全区域 酷!这就说得通了。让我困惑的是操作的顺序。

以上是关于SwiftUI 缩放视图而不影响几何的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI/UIKit:水平滚动视图缩放视图

复杂视图中的 SwiftUI 字体缩放

SwiftUI - 缩放、缩放和裁剪图像

在 SwiftUI 视图中发布后台上下文 Core Data 更改而不阻塞 UI

如何使 AVFoundation 预览视图占据 SwiftUI 中的所有屏幕,而不考虑安全区域?

SwiftUI 将值从几何阅读器传递给函数