ios - 如何检索特定视图的高度?
问题描述
假设我有一个圆圈,我想在交互时更改其半径。我希望将半径定义为视图高度的百分比。我有以下内容:
struct ButtonView: View {
@State private var radius: CGFloat = 0.1 * geometry.size.height
var body: some View {
GeometryReader { geometry in
Button(action: {
withAnimation(.easeIn) { () -> Result in
self.radius = 0.1 * geometry.size.height
}
}) {
Circle().frame(width: self.radius, height: self.radius)
}
.onLongPressGesture(minimumDuration: 0, maximumDistance: 0, pressing: { (true) in
self.radius = 0.1 * geometry.size.height - 10
}) {}
}
}
}
我的问题是我不能在变量语句中引用“geometry.size.height”,因为它没有嵌套在 GeometryReader 中。我试过使用'UIScreen.main.bounds.width',但这给出了整个屏幕的高度。在我的情况下,我有兴趣获得标签栏上方的视图高度,因为 ButtonView 嵌套在一个中。
解决方案
State 变量的初始值不能基于特定的布局。创建结构时,它不知道布局是什么。但是您可以在布局期间自由使用 GeometryReader 的代理。例如,这会将圆圈缩放到视图高度的 10% 到 50% 之间。请注意maxHeight
框架中此处的使用。
struct ButtonView: View {
@State private var scale: CGFloat = 0.1
var body: some View {
GeometryReader { proxy in
Button(action: { self.scale = (self.scale == 0.1) ? 0.5 : 0.1 }) {
Circle()
}
.frame(maxHeight: proxy.size.height * self.scale)
}
}
}
如果您想在第一次出现时将信息捕获到 State 变量中,那么您可以在一个onAppear
块中执行此操作。
struct ButtonView: View {
@State private var radius: CGFloat = 0.0
var body: some View {
GeometryReader { proxy in
Button(action: { self.radius = 0.5 * proxy.size.height }) {
Circle()
}
.frame(maxHeight: self.radius)
.onAppear { self.radius = 0.1 * proxy.size.height}
}
}
推荐阅读
- java - QuickFIX/J:多个会话共享相同数据字典的问题
- .net - 在一对一聊天中向租户中的用户发送通知
- azure - 所有 Azure 资源的 RBAC 权限列表
- go - Golang / Google Cloud 错误报告不起作用
- regex - bigquery 中 regexp_replace 结果的条件规则
- c++ - 为什么 CLion 的集成 CMake 找不到已安装的包?
- ldap - 如何在 Junit5 中设置嵌入式 ApacheDS
- html - 无法使用网格 (CSS) 拆分网页文本和图像
- excel-formula - 如果日期介于日期范围之间,我如何查找价格?Excel 2016
- r - 数字矩阵到日期矩阵