SwiftUI:禁止用户交互
SwiftUI具有先进的点击测试算法,该算法不仅用于视图的Frame,而且还应用于其内容。例如,如果您向文本视图添加轻击手势,则文本视图的所有部分都是可点击的——除了碰巧恰好点到了空白部分。另一方面,如果您将相同的手势附加到圆上,则SwiftUI将忽略圆的透明部分。
为了说明这一点,这是一个使用ZStack
与矩形重叠的圆,它们都带有onTapGesture()
修饰符:
ZStack {
Rectangle()
.fill(Color.blue)
.frame(width: 300, height: 300)
.onTapGesture {
print("Rectangle tapped!")
}
Circle()
.fill(Color.red)
.frame(width: 300, height: 300)
.onTapGesture {
print("Circle tapped!")
}
}
如果您尝试一下,您会发现在圆内轻按会打印“Circle tapped!”,但是在圆圈后面的矩形上会打印“Rectangle tapped!” ——即使该圆实际上与矩形具有相同的 Frame。
SwiftUI使我们可以通过两种有用的方式来控制用户交互,第一种是allowHitTesting()
修饰符。如果将参数设置为 false,并其附加到视图,则该视图甚至都不被视为可点击的。但是,这并不意味着它是没有处理点击的,只是它不会捕获任何点击——而是会轻按视图后面的内容。
尝试将其添加到我们的圆中,如下所示:
Circle()
.fill(Color.red)
.frame(width: 300, height: 300)
.onTapGesture {
print("Circle tapped!")
}
.allowsHitTesting(false)
现在,轻按圆将始终打印“Rectangle tapped!”,因为该圆将拒绝响应轻敲。
控制用户交互性的另一种有用方法是使用contentShape()
修饰符,它使我们可以为某些东西指定可点击的形状。默认情况下,圆的可点击形状是相同大小的圆,但是您可以这样指定其他形状:
Circle()
.fill(Color.red)
.frame(width: 300, height: 300)
.contentShape(Rectangle())
.onTapGesture {
print("Circle tapped!")
}
当您点击带有分隔符(Spacer()
)的堆栈时,contentShape()
修饰符真正有用的地方是因为默认情况下,当点击堆栈分隔符时,SwiftUI不会触发动作。
您可以尝试以下示例:
VStack {
Text("Hello")
Spacer().frame(height: 100)
Text("World")
}
.onTapGesture {
print("VStack tapped!")
}
如果您运行该程序,将会找到“Hello”标签和“World”标签,但不能点击两者之间的空格。但是,如果我们在VStack
上使用contentShape(Rectangle())
,则堆栈的整个区域都可以被轻敲,包括间隔符:
VStack {
Text("Hello")
Spacer().frame(height: 100)
Text("World")
}
.contentShape(Rectangle())
.onTapGesture {
print("VStack tapped!")
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Node.js 如何处理 ES6 模块
- 关于Hive使用的一些实例
- 134. 加油站 Krains 2020-08-20 14:03:21 前缀和贪心
- 53. 最大子序和 Krains 2020-08-20 10:46:24 动态规划前缀和
- 如何用Unity导出H5与小游戏的3D场景
- 设计模式 之 模板模式
- java基础:注解的定义与使用
- 使用 vagrant 从搭建 gitlab server 开始体验整个 gitlab CI/CD 过程
- 纲手推荐程序笔记1-p5.js创意游戏编程
- 由浅入深彻底了解 Python 闭包和装饰器
- leetcode1078 Occurrences After Bigram
- 负二进制加法实现
- 如何在O(1)时间复杂度下实现LRU
- 字符串拼接的N种方式
- MySQL 解决查询NULL的问题