我正在使用 SwiftUI 创建类似警报弹出窗口的东西,我使用 UIHostingController 从 UIKit 代码中呈现。视图如下所示:
VStack(spacing: 0) {
// Some text ...
HStack(spacing:0) {
Button(action: self.onCancel) { Text("Cancel") }
.padding().inExpandingRectangle().fixedSize(horizontal: false, vertical: true)
// This divider is the problem
Divider() // .fixedSize()
Button(action: self.onDelete) { Text("Delete") }
.padding().inExpandingRectangle().fixedSize(horizontal: false, vertical: true)
}
}.frame(minHeight: 0)
Run Code Online (Sandbox Code Playgroud)
这inExpandingRectangle是我在另一个 stackoverflow 问题中发现的。它将 HStack 每一侧的文本居中。
extension View {
func inExpandingRectangle() -> some View {
ZStack {
Rectangle().fill(Color.clear)
self
}
}
}
Run Code Online (Sandbox Code Playgroud)
它看起来像这样。垃圾。
如果我把.fixedSize()放在分隔线上,它就会这样做。并不可怕,但分隔器看起来很愚蠢,并且不会扩展到按钮的大小。
Asp*_*eri 12
这是一个可能的简化替代的演示,没有那个人为的扩展。使用 Xcode 11.4 / iOS 13.4 测试。
Divider() // or Rectangle().fill(Color.gray).frame(height: 1)
HStack {
Button(action: {}) { Text("Cancel").fixedSize() }
.padding().frame(maxWidth: .infinity)
Divider() // or Rectangle().fill(Color.gray).frame(width: 1)
Button(action: {}) { Text("Delete").fixedSize() }
.padding().frame(maxWidth: .infinity)
}.fixedSize(horizontal: false, vertical: true)
Run Code Online (Sandbox Code Playgroud)
注意:还值得考虑自定义分隔线,例如
Rectangle().fill(Color.gray).frame(width: 1) // or any other color
Run Code Online (Sandbox Code Playgroud)
可能会给出很多合适的视觉反馈,比如
将fixedSize()修饰符放在HStack而不是Divider修复问题上。
var body : some View {
VStack(spacing: 0) {
// Some text ...
Text("gsfdsfkajflkasdjflkas,jdflaskjf")
HStack(spacing:0) {
Button(action: {print("hi")}) { Text("Cancel") }
.padding().inExpandingRectangle().fixedSize(horizontal: true, vertical: true)
// This divider is the problem
Divider()
Button(action: {print("hello")}) { Text("Delete") }
.padding().inExpandingRectangle().fixedSize(horizontal: true, vertical: true)
}.fixedSize() <------- Insert this
}.frame(minHeight: 0)
}
Run Code Online (Sandbox Code Playgroud)
结果:
| 归档时间: |
|
| 查看次数: |
2790 次 |
| 最近记录: |