SwiftUI 教程

SwiftUI 主页 SwiftUI 概览 SwiftUI 与 UIkit

SwiftUI 环境

SwiftUI 安装和环境配置 SwiftUI 基本组件 SwiftUI 构建第一个应用程序

SwiftUI 视图

SwiftUI 视图 SwiftUI 自定义文本视图 SwiftUI 自定义图像视图 SwiftUI 堆栈

SwiftUI 绘制形状

SwiftUI 形状 SwiftUI 绘制线条 SwiftUI 绘制矩形 SwiftUI 绘制圆角矩形 SwiftUI 绘制三角形 SwiftUI 绘制圆形 SwiftUI 绘制星形 SwiftUI 绘制多边形 SwiftUI 绘制饼图 SwiftUI 使用内置形状

SwiftUI 文本

SwiftUI 文本视图 SwiftUI 文本输入和输出

SwiftUI 颜色

SwiftUI 颜色 SwiftUI 颜色选择器 SwiftUI 渐变 SwiftUI 调整颜色

SwiftUI 效果

SwiftUI 效果 SwiftUI 混合效果 SwiftUI BLur 效果 SwiftUI 阴影效果 SwiftUI 悬停效果

SwiftUI 动画

SwiftUI 动画 SwiftUI 创建动画 SwiftUI 创建显式动画 SwiftUI 多个动画 SwiftUI 过渡 SwiftUI 不对称过渡 SwiftUI 自定义过渡

SwiftUI 图像

SwiftUI 图像 SwiftUI 图像作为背景 SwiftUI 旋转图像 SwiftUI 媒体

SwiftUI 视图布局

SwiftUI 视图布局 SwiftUI 视图大小 SwiftUI 视图间距 SwiftUI 视图填充

SwiftUI UI 控件

SwiftUI UI 控件 SwiftUI 按钮 SwiftUI 复选框 SwiftUI 菜单栏 SwiftUI 工具栏 SwiftUI 搜索栏 SwiftUI 文本字段 SwiftUI 滑块 SwiftUI 切换 SwiftUI 选择器 SwiftUI 菜单

SwiftUI 列表 &表格

SwiftUI 列表 SwiftUI 静态列表 SwiftUI 动态列表 SwiftUI 自定义列表 SwiftUI 表格

SwiftUI 表单

SwiftUI 表单 SwiftUI 在部分中拆分表单

SwiftUI 事件处理

SwiftUI 事件处理 SwiftUI 手势 SwiftUI 剪贴板 SwiftUI 拖放 SwiftUI 焦点 SwiftUI 警报

SwiftUI 杂项

SwiftUI 容器 SwiftUI 导航 SwiftUI 通知 SwiftUI 跨平台 UI SwiftUI 数据 SwiftUI 可访问性

SwiftUI 框架集成

SwiftUI 框架集成 SwiftUI 与 UIKit 交互 SwiftUI 创建 macOS 应用

SwiftUI 有用资源

SwiftUI 有用资源 SwiftUI 讨论


SwiftUI - 焦点

焦点是 SwiftUI 中的一个特殊功能,它标识哪个元素将接收下一个输入。或者我们可以说焦点用于控制和管理哪个 UI 组件将接收用户输入或注意。

它创造了无缝的用户体验,特别是在处理具有多个按钮或文本字段的表单时,键盘管理用于控制键盘何时出现或消失,可访问性以确保用户可以正确导航界面等。它最初是在 iOS 15 中引入的,旨在提供一种结构化的方式来管理应用中存在的不同 UI 组件的焦点状态。

要在应用中使用焦点,我们必须使用预定义的修饰符和属性包装器−

  • @FocusState 属性包装器

  • focused 修饰符

SwiftUI 中的 @FocusState 属性包装器

@FocusState 是一个功能强大的属性包装器,用于跟踪哪个视图正在接收焦点。它可以是布尔值来控制单个字段的跟踪,也可以是枚举来控制多个字段的跟踪。它通常与 focused() 修饰符结合使用,以描述获得当前焦点的视图的位置和外观。因此,每当视图获得焦点时,包装在 @FocusState 属性中的值将设置为 true 或给定的原型值,而当焦点离开视图时,它将被设置为 false。

语法

以下是语法−

@FocusState private var value: Bool

示例

以下 SwiftUI 程序用于将焦点设置在文本字段上。

import SwiftUI

struct ContentView: View {
   @State private var name: String = ""
   
   // 给定文本字段的焦点状态
   @FocusState private var isFocused: Bool

   var body: some View {
      VStack{
         TextField("Enter your name", text: $name)
            .padding()
            .background(.teal.opacity(0.4))
            .cornerRadius(8)
         
            // 将焦点附加到文本字段
            .focused($isFocused)
            .textFieldStyle(RoundedBorderTextFieldStyle())
            .padding()

         Button("Focus on Field") {
            isFocused = true
         }
         Button("Dismiss Focus") {
            isFocused = false
         }
      }.padding()
   }
}

#Preview {
   ContentView()
}

输出

Focus

SwiftUI 中的 Focused 修饰符

.focused() 修饰符用于将 UI 组件或任何其他元素的焦点状态与给定的状态值(即 @FocusState 属性)绑定在一起。它允许我们控制和管理给定元素之间的焦点。或者我们可以说,只要 @FocusState 属性的值设置为 true,此修饰符就会将焦点设置在指定元素上。

语法

以下是语法−

func focused(_ condition: FocusStateBinding)

参数

它只接受一个参数,即焦点绑定的状态。默认情况下,SwiftUI 会自动解除焦点。当焦点移动到视图时,绑定值设置为 true,而当焦点离开视图时,绑定值设置为 false。

示例

以下 SwiftUI 程序用于调整焦点。

import SwiftUI

struct ContentView: View {
   @State private var name: String = ""
   
   // 给定文本字段的焦点状态
   @FocusState private var isFocused: Bool

   var body: some View {
      VStack{
         TextField("Enter your name", text: $name)
            .padding()
            .background(.teal.opacity(0.4))
            .cornerRadius(8)
         
            // 将焦点附加到文本字段
            .focused($isFocused)
            .textFieldStyle(RoundedBorderTextFieldStyle())
            .padding()

         Button("Focus on Field") {
            isFocused = true
         }
         Button("Dismiss Focus") {
            isFocused = false
         }
      }
      .padding()
   }
}
#Preview {
   ContentView()
}

输出

Focus

SwiftUI 中的多个焦点元素

在 SwiftUI 中,我们可以借助枚举将焦点设置在多个输入字段或元素上。在这里,焦点会根据用户的操作进行调整。当我们使用登录页面、选择多个产品或任何需要多个输入字段的表单时,它很有用。

示例

以下 SwiftUI 程序用于调整给定表单中的多个焦点。

import SwiftUI

struct ContentView: View {
   @State private var name: String = ""
   @State private var city: String = ""
   @State private var branch: String = ""
   
   // 焦点状态来管理多个焦点
   @FocusState private var focused: myFields?

   enum myFields {
      case name
      case city
      case branch
   }

   var body: some View {
      VStack{
         TextField("Enter your name", text: $name)
            .focused($focused, equals: .name)
            .padding()
            .background(Color(.systemGray6))
            .cornerRadius(8)

         TextField("Enter you city", text: $city)
            .focused($focused, equals: .city)
            .padding()
            .background(Color(.systemGray6))
            .cornerRadius(8)
         
         TextField("Enter you branch", text: $branch)
            .focused($focused, equals: .branch)
            .padding()
            .background(Color(.systemGray6))
            .cornerRadius(8)

         HStack {
            Button("Move Focus to next") {
               // 将焦点移至下一个字段
               switch focused{
               case .name:
                  focused = .city
               case .city:
                  focused = .branch
               case .branch:
                  focused = nil
               default:
                  break
               }
            }.padding()
            .background(.blue)
            .foregroundStyle(.white)
            .cornerRadius(8)
            
            // Submitting form
            Button("Submit") {
               focused = nil
            }
            .padding()
            .background(.yellow)
            .foregroundStyle(.white)
            .cornerRadius(8)
         }
      }
   }
}
#Preview {
   ContentView()
}

输出

Focus