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

Swift iOS开发:特定UI元素创建求助(UIBezierPath实现遇阻)

实现目标气泡UI的修正方案

问题分析

原代码的路径衔接逻辑有误,导致三角形与圆角矩形过渡不自然,路径走向混乱,最终绘制的形状不符合设计预期。

修正后的代码

class CustomBubbleView: UIView {
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        commonInit()
    }
    
    private func commonInit() {
        backgroundColor = .clear
    }
    
    override func draw(_ rect: CGRect) {
        let radius: CGFloat = 10
        let triangleWidth: CGFloat = 20
        let triangleHeight: CGFloat = 15
        // 三角形垂直居中位置
        let triangleMidY = rect.height / 2
        
        let path = UIBezierPath()
        
        // 绘制三角形部分
        path.move(to: CGPoint(x: triangleWidth, y: triangleMidY))
        path.addLine(to: CGPoint(x: 0, y: triangleMidY))
        path.addLine(to: CGPoint(x: triangleWidth, y: triangleMidY + triangleHeight))
        path.addLine(to: CGPoint(x: triangleWidth, y: triangleMidY))
        
        // 绘制圆角矩形右下部分
        path.addArc(withCenter: CGPoint(x: triangleWidth + radius, y: triangleMidY + triangleHeight + radius),
                    radius: radius,
                    startAngle: .pi,
                    endAngle: .pi / 2,
                    clockwise: true)
        path.addLine(to: CGPoint(x: rect.width - radius, y: rect.height - radius))
        
        // 右下角圆角
        path.addArc(withCenter: CGPoint(x: rect.width - radius, y: rect.height - radius),
                    radius: radius,
                    startAngle: .pi / 2,
                    endAngle: 0,
                    clockwise: true)
        path.addLine(to: CGPoint(x: rect.width - radius, y: radius))
        
        // 右上角圆角
        path.addArc(withCenter: CGPoint(x: rect.width - radius, y: radius),
                    radius: radius,
                    startAngle: 0,
                    endAngle: -.pi / 2,
                    clockwise: true)
        path.addLine(to: CGPoint(x: triangleWidth + radius, y: radius))
        
        // 左上角圆角
        path.addArc(withCenter: CGPoint(x: triangleWidth + radius, y: radius),
                    radius: radius,
                    startAngle: -.pi / 2,
                    endAngle: .pi,
                    clockwise: true)
        path.addLine(to: CGPoint(x: triangleWidth, y: triangleMidY))
        
        // 设置样式并绘制
        UIColor.gray.setStroke()
        UIColor.white.setFill()
        path.lineWidth = 1
        path.fill()
        path.stroke()
    }
}

关键修正点

  • 三角形路径重构:重新规划三个顶点位置,保证和圆角矩形的衔接更贴合设计图形态
  • 圆角方向调整:将原代码的clockwise: false改为true,确保圆角弧度方向正确
  • 路径顺序优化:按顺时针方向连贯绘制所有部分,避免路径断点或交叉
  • 尺寸适配:微调三角形高度,让整体比例更接近设计效果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 16:22:49