gpt4 book ai didi

swift - 水平堆叠内的中心项目

转载 作者:行者123 更新时间:2023-12-05 08:51:34 26 4
gpt4 key购买 nike

如果我在水平堆栈中有 3 个项目,我想我可以这样做:

HStack{

Text("test")

Spacer()

item2()

Spacer()

Text("test")
}

将 item2() 在两个 TextView 之间居中。然而,这个问题是 item2() 不一定总是居中,因为,假设 Text("test") 更改为 Text("a") 或其他东西。这会导致问题,并且第二个项目并不总是在屏幕上居中。

如何使 item2() 始终居中?

谢谢

最佳答案

我会建议以下起点(最简单的情况......阅读下面的原因)

Center horizontally one element

正如它所看到的那样,它确实提供了居中的 w/o 框架偏移和正确对齐的边元素,但是......有一个缺点 - 它只能在这种最简单的变体中工作 如果事先知道这三个文本元素在用户运行时永远不会重叠。如果是这种情况(真的有这种情况),那么这种方法就可以了。但是,如果左/右文本可能在运行时增长,则需要更多计算来通过 .frame(maxWidth:) 限制它们的宽度,具体取决于居中元素的宽度......该变体是比较复杂,但可行。

var body: some View {
ZStack {
HStack {
Text("Longer side")
Spacer()
Text("One")
}
item2()
}
}

private func item2() -> some View {
Text("CENTER")
.background(Color.yellow)
.border(Color.red)
}

更新:这是一种可能的方法,可以限制一侧不与居中的一侧重叠(包含异步更新,因此应在实时预览或模拟器中进行测试)

所以...如果左侧文本是动态的并且需要剪切尾随符号,那么它可能会这样......

enter image description here

它会自动适应设备方向的变化

enter image description here

struct TestHorizontalPinCenter: View {

@State var centerFrame: CGRect = .zero

private let kSpacing: CGFloat = 4.0
var body: some View {
ZStack {
HStack {
Text("Longer side very long text to fit")
.lineLimit(1)
.frame(maxWidth: (centerFrame == .zero ? .infinity : centerFrame.minX - kSpacing), alignment: .leading)

Spacer()

Text("One")
}
item2()
.background(rectReader($centerFrame))
}
}

private func item2() -> some View {
Text("CENTER")
.background(Color.yellow)
.border(Color.red)
}

func rectReader(_ binding: Binding<CGRect>) -> some View {
return GeometryReader { (geometry) -> AnyView in
let rect = geometry.frame(in: .global)
DispatchQueue.main.async {
binding.wrappedValue = rect
}
return AnyView(Rectangle().fill(Color.clear))
}
}
}

如果需要左侧换行,则需要.lineLimit(nil)和额外的layout,以及solution growth,但是思路是一样的。希望这对某人有帮助。

关于swift - 水平堆叠内的中心项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59517327/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com