我正在开发一个自定义进度条.我有一个文本,我想在动画 timeshift 动一个进度.而是文本消失并重新出现在新的位置(见下面的gif).

代码:

private struct MyProgressBar: View {
    let progress: Double
    
    var body: some View {
        RoundedRectangle(cornerRadius: 5)
            .frame(height: 20)
            .foregroundColor(.gray)
            .overlay(alignment: .leading) {
                GeometryReader { geo in
                    let progressWidth = geo.size.width * progress
                    RoundedRectangle(cornerRadius: 5)
                        .foregroundColor(.yellow)
                        .frame(width: progressWidth)
                        .overlay(alignment: .topTrailing) {
                            bubble(progress)
                                .fixedSize()
                                .alignmentGuide(HorizontalAlignment.trailing) { d in
                                    d[HorizontalAlignment.center]
                                }
                                .alignmentGuide(VerticalAlignment.top) { d in
                                    d[.bottom]
                                }
                        }
                }
            }
        .padding()
    }
    
    @ViewBuilder
    private func bubble(_ progress: Double) -> some View {
        Text(progress.formatted(.percent))
            .monospacedDigit()
            .padding(5.0)
            .background {
                RoundedRectangle(cornerRadius: 2)
                    .foregroundColor(.green)
            }

    }
}

struct MyProgressBarExample: View {
    @State private var progress: Double = 0.3
    
    var body: some View {
        VStack {
            MyProgressBar(progress: progress)
            VStack {
                Button("change") {
                    withAnimation() {
                        progress = Double.random(in: 0.0...1.0)
                    }
                }
                Slider(
                    value: $progress.animation(),
                    in: 0.0...1.0,
                    step: 0.005
                )
                    .padding()
            }
        }
    }
}

使用动态值时,文本会消失并重新出现,但如果我将文本更改为某个常量字符串,如"Hello",则文本移动得很好.

situation moves fine with constant string

如何让绿色背景的文字移动,而不是出现和消失?

推荐答案

在你的泡沫中再加.drawingGroup.我也不认为它必须是ViewBuilder分:

    private func bubble(_ progress: Double) -> some View {
        Text(progress.formatted(.percent))
            .monospacedDigit()
            .padding(5.0)
            .background {
                RoundedRectangle(cornerRadius: 2)
                    .foregroundColor(.green)
            }
            .drawingGroup() // <-- HERE
    }

Ios相关问答推荐

如何正确测试后台URLSessionDownloadTask?

如何在本地iOS没有插件的情况下处理平台线程?

Swift在SceneKit中为scnnode添加自定义几何体(视图)

Xamarin Forms CustomPin iOS Render

XcodeCloud生成失败,返回";ci_pre_xcodeBuild.sh是可执行文件,但退出时返回2个退出代码.";

由于已存在同名项目,因此无法将Mapbox.xcframework-ios.sign复制到Signature中

Xcode 15中的版本控制发生了什么?

NumberFormatter 无法使用 Xcode 15.0 beta 正确识别 iOS 17 beta 中的 Locale 货币设置

NavigationLink 只能在文本部分点击

iOS 16 中的状态栏 colored颜色

如何根据条件快速将返回类型设为 LinearGradient 或 AngularGradient?

react 在 android 上运行的本机应用程序,但在 iOS 上出现问题,详细信息在描述中共享

来自 c++ 的runtime_error未在 iOS 中捕获

AVPlayer 退出全屏

如何缩小 UIImage 并使其同时变得清晰/锐利而不是模糊?

在 React Native 中保存敏感数据

iOS SDK - 以编程方式生成 PDF 文件

使用 Swift 在一个 ViewController 中强制横向模式

NSURL 到带有 XCTest 的测试包中的文件路径

AFNetworking 发布请求