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

如何在SwiftUI中创建带顶部内凹曲线的桥形复合形状?

SwiftUI实现顶部内凹的桥形图案(带背景图)

核心思路

要实现顶部内凹的矩形,需要从矩形路径中减去圆形的一部分,而非使用union合并路径。通过自定义Shape完成路径组合,再将图片填充到该形状中,或用形状作为图片的遮罩,即可达成需求。

自定义桥形Shape

创建遵循Shape协议的结构体,在path(in:)方法中完成路径相减操作:

struct BridgeShape: Shape {
    func path(in rect: CGRect) -> Path {
        // 1. 创建基础矩形路径
        let rectPath = Path(rect)
        
        // 2. 创建圆形路径:让圆形下半部分覆盖矩形顶部,参数可调整内凹深度与范围
        let circleRect = CGRect(
            x: rect.midX - rect.width,   // 圆形左右超出矩形,保证内凹覆盖整个顶部宽度
            y: rect.minY - rect.height,  // 圆形上移,使下半部分落在矩形顶部区域
            width: rect.width * 2,
            height: rect.height * 2
        )
        let circlePath = Path(ellipseIn: circleRect)
        
        // 3. 从矩形路径中减去圆形路径,得到顶部内凹的最终形状
        return rectPath.subtracting(circlePath)
    }
}

使用自定义Shape展示背景图

两种常用实现方式:

方式1:用图片填充Shape

直接将图片作为自定义形状的填充内容:

ZStack {
    // 可选:添加底层背景色
    Color.gray.opacity(0.2)
        .ignoresSafeArea()
    
    BridgeShape()
        .fill(ImagePaint(image: Image("BGImage"), scale: 0.5)) // scale参数调整图片缩放比例
        .frame(height: 250)
}

方式2:用Shape作为图片的遮罩

让图片通过自定义形状裁剪,实现相同效果:

Image("BGImage")
    .resizable()
    .scaledToFill()
    .frame(height: 250)
    .clipShape(BridgeShape())
    .ignoresSafeArea()

参数调整说明

  • 修改圆形路径的y值:值越小(圆形越往上移),内凹深度越大
  • 修改圆形的width/height:缩小宽度可让内凹仅出现在矩形中间区域,调整高度可改变内凹弧度

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 20:12:47