我想水平堆叠重叠的元素,如下所示:
这是我尝试过的:
struct StackedElementsView: View {
let colors: [Color] = [.red, .blue, .purple]
var body: some View {
HStack {
ZStack {
ForEach(0..<colors.count) { i in
ZStack(alignment: .leading) {
colors[i]
.clipShape(Circle())
.frame(width: 44, height: 44)
}
.offset(x: CGFloat(i) * 25)
}
}
.padding(.leading, 24)
Color.purple
.frame(width: 100, height: 44)
Spacer()
}
.padding(.vertical, 8)
}
}
struct StackedElementsView_Previews: PreviewProvider {
static var previews: some View {
StackedElementsView()
}
}
Run Code Online (Sandbox Code Playgroud)
我对此有一个问题,紫色矩形与圆圈重叠,我不知道为什么。
感谢您的帮助
这将是一个更直观的解决方案。您可以改为使用负间距并且只有HStacks:
struct StackedElementsView: View {
let colors: [Color] = [.red, .blue, .purple]
var body: some View {
HStack {
HStack(spacing: -25) {
ForEach(0..<colors.count) { i in
colors[i]
.clipShape(Circle())
.frame(width: 44, height: 44)
}
}
Color.purple
.frame(width: 100, height: 44)
Spacer()
}
.padding(.leading, 24)
.padding(.vertical, 8)
}
}
Run Code Online (Sandbox Code Playgroud)
.offset仅更改视图绘制的位置,但不会更改框架,这就是矩形绘制得比您预期更靠左的原因。
解决此问题的一种方法是向矩形添加适当的前导填充:
Color.purple
.frame(width: 100, height: 44)
.padding(.leading, CGFloat(colors.count - 1) * 25)
Run Code Online (Sandbox Code Playgroud)
替代解决方案
不要使用.offset,而是使用Color.clearan 中的视图HStack来提供所需的间距:
ForEach(0..<colors.count) { i in
ZStack(alignment: .leading) {
HStack(spacing: 0) {
Color.clear
.frame(width: CGFloat(i) * 25, height: 44)
colors[i]
.clipShape(Circle())
.frame(width: 44, height: 44)
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3432 次 |
| 最近记录: |