我有一个RoundedRectangle,我的目标是在它上面放置另一个RoundedRectangle,以便覆盖显示“完成百分比”。不过,我似乎找不到合适的咒语来做到这一点。
我认为理想情况下,覆盖层应该只显示其自身的一部分。调整自身大小以匹配百分比会扭曲覆盖层的形状。
import PlaygroundSupport
struct ContentView: View {
@State private var value: Double = 0
var body: some View {
GeometryReader { geom in
VStack {
Slider(value: self.$value, in: 0...1, step: 0.01)
ZStack {
ZStack(alignment: .leading) {
// The main rectangle
RoundedRectangle(cornerRadius: 10)
.fill(Color.blue)
.frame(width: geom.size.width,
height: 200)
// The progress indicator...
RoundedRectangle(cornerRadius: 10)
.fill(Color.red)
.opacity(0.5)
.frame(width: CGFloat(self.value) * geom.size.width,
height: 200)
}
Text("\(Int(self.value * 100)) %")
}
}
}
.padding()
}
}
PlaygroundPage.current.setLiveView(ContentView())
Run Code Online (Sandbox Code Playgroud)
在上面的操场中,如果您查看 1%、2% 甚至 3%,您可以看到红色叠加层超出了左上和左下的蓝色背景矩形边界。见下图。
我觉得这不是正确的解决方案,但我也找不到正确的组合(尝试scaleEffect,一堆offset和position数学)来真正解决它。
对我来说,就像我上面所说的那样,当值为 时,感觉叠加层应该能够说“仅使最左边的 40% 可见” 0.4。
说得太啰嗦了,对此我深表歉意。如果您已经阅读了本文,并且有任何建议可以提供,我将不胜感激。
谢谢!
这就是我的处理方式,这样我就不必管理多个cornerRadius.
VStack {
ZStack(alignment: .leading) {
// The main rectangle
Rectangle()
.fill(Color.blue)
.frame(width: geom.size.width,
height: 200)
// The progress indicator...
Rectangle()
.fill(Color.red)
.opacity(0.5)
.frame(width: CGFloat(self.value) * geom.size.width,
height: 200)
}
.cornerRadius(10)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1594 次 |
| 最近记录: |