ios - 如何在 SwiftUI 中将渐变前景色文本移动到视图的中心?
问题描述
我在 SwiftUI 中使用Gradient
修饰符.mask(_:)
来实现Text
渐变前景色。但文本始终位于视图的顶部。我怎样才能把它放在视图的中心?
这是我的实现:
import SwiftUI
struct GradientText: View {
var body: some View {
LinearGradient(gradient: Gradient(colors: [.blue, .red, .orange]),
startPoint: .leading, endPoint: .trailing)
.mask(Text("Hello, world!")
.font(.system(size: 40, weight: .bold, design: .rounded)))
.padding()
}
}
它看起来如何:
解决方案
问题是它LinearGradient
正在填满它给出的所有空间。如果您删除mask
,您将看到它有多大。您希望它只是文本的大小。
我确信有更好的方法来处理这个问题,但这就是我想出的。通过从文本开始,我们可以使用与文本大小完全匹配的LinearGradient
as 。overlay
struct GradientText: View {
let text = Text("Hello World")
.font(.system(size: 40, weight: .bold, design: .rounded))
var body: some View {
text
.foregroundColor(.clear)
.overlay(
LinearGradient(gradient: Gradient(colors: [.blue, .red, .orange]),
startPoint: .leading, endPoint: .trailing)
.mask(text))
}
}
进一步扩展这个想法,您可以将GradientText
taketext
和gradient
作为输入,以便您可以轻松地重复执行此操作:
struct GradientText: View {
let text: Text
let gradient: LinearGradient
init(text: Text, gradient: LinearGradient? = nil) {
self.text = text
self.gradient = gradient ?? LinearGradient(gradient: Gradient(colors: [.blue, .red, .orange]), startPoint: .leading, endPoint: .trailing)
}
var body: some View {
text
.foregroundColor(.clear)
.overlay(
gradient
.mask(text))
}
}
struct ContentView: View {
var body: some View {
VStack {
GradientText(text: Text("Hello World")
.font(.system(size: 40, weight: .bold, design: .rounded)))
GradientText(text: Text("Goodnight World"), gradient: LinearGradient(gradient: Gradient(colors: [.green, .yellow, .orange]), startPoint: .leading, endPoint: .trailing))
}
}
}
推荐阅读
- javascript - React Native - React Hooks - useState 没有立即更新我的状态
- php - php对象数组到数组到对象值
- python - 运行仅在执行程序中构建一个大列表的非异步函数?
- google-bigquery - 有没有办法将 pyarrow 架构分配给 BigQuery 中的 RECORD 数据类型?
- sql - 如何为参数化查询中的多个可选搜索参数创建单个查询?
- python - 2020年如何在没有用户交互的情况下授权Google API?
- ios - InvalidSessionIdException:消息:在带有 Appium 库的 Robot Framework 中使用 Switch Application 关键字时,会话不存在错误
- swift - 从 iOS 上的 FirebaseUI 身份验证提示中删除“名字和姓氏”字段
- mysql - mysql RANK() 显示错误
- c - 了解 glibc malloc 分箱实现