You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI中使用Paths绘制边缘平滑圆弧的问题求助

你当前实现出现生硬拐点的核心原因是圆弧绘制方向和二次曲线切线方向不匹配,两段路径衔接处斜率突变。你设置的clockwise: true会让圆弧向下凸,和两端二次曲线的衔接切线方向刚好相反,同时建议用GeometryReader替代UIScreen的全局尺寸,适配不同布局场景。

修正后可直接运行的代码:

struct SmoothArcExample: View {
    var body: some View {
        GeometryReader { proxy in
            Path { path in
                let midX = proxy.size.width / 2
                // 底部基准线参数
                let baseLeft = CGPoint(x: midX - 10, y: .zero)
                let baseRight = CGPoint(x: midX + 30, y: .zero)
                // 二次贝塞尔控制点
                let ctrlLeft = CGPoint(x: midX, y: .zero)
                let ctrlRight = CGPoint(x: midX + 20, y: .zero)
                // 圆弧两端端点
                let arcLeft = CGPoint(x: midX, y: 10)
                let arcRight = CGPoint(x: midX + 20, y: 10)
                // 圆弧中心点
                let arcCenter = CGPoint(x: midX + 10, y: 10)
                
                path.move(to: .zero)
                path.addLine(to: baseLeft)
                path.addQuadCurve(to: arcLeft, control: ctrlLeft)
                // *将clockwise修改为false,绘制上凸半圆,匹配两侧曲线的切线方向*
                path.addArc(center: arcCenter, radius: 10, startAngle: .degrees(180), endAngle: .degrees(0), clockwise: false)
                path.addQuadCurve(to: baseRight, control: ctrlRight)
                path.addLine(to: CGPoint(x: proxy.size.width, y: .zero))
            }
            .stroke(lineWidth: 2)
        }
        .frame(height: 20)
    }
}

调整说明:

如果需要修改圆弧的凸起高度、宽度,只要调整对应的半径、base点偏移量即可,保持二次曲线控制点的x坐标和圆弧端点x坐标一致、y坐标和底边线y坐标一致,就能保证衔接处完全平滑无拐点。


内容的提问来源于stack exchange,提问作者DrinkaZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 16:27:03