swift - 如何防止 Spacer 使 VStack 贪婪地增长到不必要的程度?
问题描述
我大致有:
var body: some View
{
HStack(alignment: .top) {
AvatarView()
MessageBubble()
if message.isDeleted != true
{
VStack {
Button(action: {
// ...
}) {
Image(systemName: "chevron.down")
}
Spacer() // THIS SPACER
Button(action: {
// ...
}) {
Text("")
}
}
}
}
}
根HStack~'s height is dictated by the size
MessageBubble which is always taller than its
AvatarView and
VStack` 同级。
问题是当我在Spacer
里面添加一个VStack
,然后整个HStack
令人难以置信的增长。是“Spacer
贪婪”地让一切无限制地增长。我确实希望在最顶部有一个按钮,在最底部有一个按钮,VStack
同时限制在MessageBubble
's 高度。
我怎样才能让它成长不超过MessageBubble
?
解决方案
如果我理解正确,您期望这样的事情(元素对齐)
这是演示代码(彩色矩形的框架在这里并不重要,大小仅用于演示,您将在此处放置视图):
struct TestAlignmentSize: View {
@State var height: CGFloat = 40
var body: some View {
HStack(alignment: .top, spacing: 20) {
Rectangle()
.fill(Color.blue)
.frame(width: 50, height: 50)
Rectangle()
.fill(Color.red)
.frame(width: 100, height: 200)
.alignmentGuide(.top, computeValue: { d in // [!!]
self.height = d.height
return d[.top]
})
VStack {
Button(action: {}) {
Image(systemName: "chevron.down")
}
Spacer()
Button(action: {}) {
Text("Button")
}
}.frame(height: self.height) // [!!]
}
}
}
推荐阅读
- android - url_launcher:对于简单的 URL 方案,canLaunch / launch 在 iOS 上不起作用?
- spring-boot - Spring Boot 应用程序,RestTemplate 没有选择在 Java 选项中配置的代理
- python - 奇怪的错误消息:“dict_keys”对象没有属性“pop”
- excel - 来自 TextBox 的 Excel SUM 值
- sql - SQL问题如何选择具有列条件值的行
- amazon-s3 - WaiterError:Waiter ObjectExists 失败:禁止
- sql - 如何根据不同多个表中每个用户的最大日期获取记录
- c - __thread 缓冲区有大小限制吗?
- javascript - 如何使用 node.js 中的 http 模块解析请求的正文?
- blazor - 未处理的异常呈现组件:在“窗口”中找不到“BlazorInputFile”