首页 > 其他分享 >如何在 SwiftUI 中熟练使用 visualEffect 修饰符

如何在 SwiftUI 中熟练使用 visualEffect 修饰符

时间:2024-07-12 20:28:34浏览次数:15  
标签:visualEffect initial 修饰符 视图 视觉效果 SwiftUI View

在这里插入图片描述

在这里插入图片描述

文章目录

前言

在 WWDC 23 中,SwiftUI 引入了一个名为 visualEffect 的新视图修饰符。此修饰符允许我们通过访问特定视图的布局信息来附加一组可动画化的视觉效果。下面我们将学习如何在 SwiftUI 中使用新的 visualEffect 视图修饰符。

介绍 visualEffect

让我们从使用 visualEffect 视图修饰符的最简单示例开始。

struct ContentView: View {
    var body: some View {
        Text("Hello World!")
            .visualEffect { initial, geometry in
                initial.offset(geometry.size)
            }
    }
}

正如你在上面的示例中所看到的,我们定义了一个文本视图并附加了 visualEffect 视图修饰符。每当你附加 visualEffect 视图修饰符时,你应该指定效果闭包。这是你应用所有需要的效果的地方。

效果闭包为你提供了两个参数。第一个是附加到视图的效果集合的初始状态。它是 EmptyVisualEffect 类型的实例。我们使用此实例来附加额外的效果。第二个参数是包含视图的所有布局信息的 GeometryProxy 类型的实例,比如 frame、安全区域等。

什么是视觉效果?

视觉效果是可以改变视图的视觉外观但不影响其布局的任何东西。在 SwiftUI 框架的先前版本中,我们有视图修饰符,如缩放、偏移、模糊、对比度、饱和度、不透明度、旋转等。它们全部都是视觉效果,并且现在符合 VisualEffect 协议。你可以在 visualEffect 闭包中使用其中任何一个。

struct ContentView: View {
    
    var body: some View {
        Text("Hello World!")
            .visualEffect { initial, geometry in
                initial
                    .blur(radius: 8)
                    .opacity(0.9)
                    .scaleEffect(.init(width: 2, height: 2))
            }
    }
}

像 frame 和 padding 这样的东西不是视觉效果,你不能在 visualEffect 闭包中使用它们,因为它们修改了视图层次结构的布局。

visualEffect 修饰符视觉效果

visualEffect 视图修饰符是完成旧事物的新方法。我们可以使用旧视图修饰符修改视图的不透明度和偏移。如果你不需要布局信息,你可以继续使用它们。新方法的唯一区别是我们通过从 GeometryProxy 提供的布局信息计算视图的视觉效果的方式来限定视图的视觉效果。

visualEffect 视图修饰符支持可动画化的值。因此,你可以继续使用它根据视图在视图层次结构中的框架和边界来动画化视图的视觉外观。

struct ContentView: View {
    @State private var isScaled = false
    
    var body: some View {
        VStack {
            Button("Scale") {
                isScaled.toggle()
            }
            
            Text("Hello World!")
                .visualEffect { initial, geometry in
                    initial.scaleEffect(
                        CGSize(
                            width: isScaled ? 2 : 1,
                            height: isScaled ? 2 : 1
                        )
                    )
                }
                .animation(.smooth, value: isScaled)
        }
    }
}

完整的代码

import SwiftUI

struct ContentView: View {
    var body: some View {
        Text("Hello World!")
            .visualEffect { initial, geometry in
                initial.offset(geometry.size)
            }
    }
}

struct ContentViewWithEffects: View {
    var body: some View {
        Text("Hello World!")
            .visualEffect { initial, geometry in
                initial
                    .blur(radius: 8)
                    .opacity(0.9)
                    .scaleEffect(.init(width: 2, height: 2))
            }
    }
}

struct ContentViewWithAnimation: View {
    @State private var isScaled = false
    
    var body: some View {
        VStack {
            Button("Scale") {
                isScaled.toggle()
            }
            
            Text("Hello World!")
                .visualEffect { initial, geometry in
                    initial.scaleEffect(
                        CGSize(
                            width: isScaled ? 2 : 1,
                            height: isScaled ? 2 : 1
                        )
                    )
                }
                .animation(.smooth, value: isScaled)
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
        ContentViewWithEffects()
        ContentViewWithAnimation()
    }
}

将上述代码放入 Swift 文件中,然后在 Xcode 中打开并运行,选择合适的模拟器。请注意,由于视觉效果和动画效果,最好在模拟器上查看效果。

总结

本文章介绍了在 SwiftUI 中引入的新视图修饰符 visualEffect。该修饰符允许我们通过访问特定视图的布局信息来附加一组可动画的视觉效果。给出了一些使用 visualEffect 的简单示例,包括如何使用效果闭包以及如何应用一些常见的视觉效果(例如模糊、透明度、缩放)。

此外,还提到了 GeometryProxy 类型的使用,以及 visualEffect 对可动画值的支持,使得可以根据视图的帧和边界来动态调整视觉外观。

最后,指出了 visualEffect 修饰符在向后兼容性方面的注意事项,并建议在不需要布局信息的情况下继续使用传统的视图修饰符

标签:visualEffect,initial,修饰符,视图,视觉效果,SwiftUI,View
From: https://blog.csdn.net/qq_36478920/article/details/140277190

相关文章

  • 在 SwiftUI 中的作用域动画
    文章目录前言简单示例动画视图修饰符使用多个可动画属性使用ViewBuilder总结前言从一开始,动画就是SwiftUI最强大的功能之一。你可以在SwiftUI中快速构建流畅的动画。唯一的缺点是每当我们需要运行多步动画或将动画范围限定到视图层次结构的特定部分时,我们如......
  • swiftUI
    SwiftUI是苹果推出的一种现代化方式,用于创建跨所有Apple平台的用户界面。它通过声明性语法简化了UI的开发流程。下面是一个基本的SwiftUI示例,展示了如何使用SwiftUI构建一个简单的"HelloWorld"应用。示例步骤1.创建一个新的SwiftUI项目打开Xcode,选择"新建项目......
  • Java 修饰符
    Java中的修饰符用于修饰类、方法、变量等元素,它们控制了这些元素的访问性、继承性和其他特性。主要的修饰符包括:1.**访问控制修饰符**:  -**public**:可以被任何其他类访问。  -**protected**:可以被同一包内的类及其子类访问。  -**default(nomodifier)*......
  • swiftui中TabView使用,以及Tab使用注意
    TabView官方文档:TabView|AppleDeveloperDocumentationTab官网文档:Tab|AppleDeveloperDocumentation使用交互式用户界面元素在多个子视图之间切换的视图。也就是手机底部的几个导航菜单一样,但是注意官方给的例子里面有使用Tab组件的,但是这个Tab组件注意:暂时只支持bet......
  • 【JAVA】权限修饰符
    一,认识权限修饰符(public,protected,“空”,private)public(公共的)1.public对所有类可见。使用对象:类、接口、变量、方法·被声明为public的类、方法、构造方法和接口能够被任何其他类访问。·如果这些类分布在不同的包中,那么我们可以通过导包(import关键字)进行导包就能操作......
  • 什么是修饰符?如何使用?
    ​一、修饰符是什么在程序世界里,修饰符是用于限定类型以及类型成员的声明的一种符号在Vue中,修饰符处理了许多DOM事件的细节,让我们不再需要花大量的时间去处理这些烦恼的事情,而能有更多的精力专注于程序的逻辑处理vue中修饰符分为以下五种:表单修饰符事件修饰符鼠标按键......
  • v-bind 与 v-model 的不同之处及 v-model 修饰符详述
          目录v-bind​​​​​​​v-model和v-bind区别​​​​​​​v-model修饰符​​​​​​​v-bind          在Vue中,v-bind主要承担着动态绑定元素属性这一关键作用。其中,“v-bind:href”能够简洁地写为“:href”。在v-bind中还能够书写合......
  • Java——访问修饰符
    一、访问修饰符是什么Java中的访问修饰符用于控制类、接口、构造函数、方法和数据成员(字段)的可见性和访问级别。Java提供了四种访问修饰符:访问修饰符同一类内同一包内不同包的子类不同包的非子类适用对象public可见可见可见可见类、接口、变量、方法protected可见可见可见......
  • 探索 v-on 之奥秘一:事件及各类修饰符的深度剖析与案例展示
    目录v-on介绍v-on事件修饰符e.stopPropagation()、.stop、.self​​​​​​​capture​​​​​​​e.preventDefault()、.prevent​​​​​​​.once​​​​​​​.passivev-on介绍        在Vue中,v-on乃是其所提供的用于事件绑定的一种机制,比如要......
  • JAVA修饰符以及运算符
    修饰符+访问修饰符+default-什么都不写。同一包内可见+private-同一类可见,修饰变量+public-所有类都可见+protected-受保护的-同包内的所有子类可见+非访问修饰符+static变量、方法+final变量-变量一但被赋值不可被修改运算符+算术运算符+加......