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

Swift中使用UIBezierPath和CAShapeLayer绘制内凹曲边三角形的代码修改问询

问题描述

背景

我现有一段简单代码,使用UIBezierPath和CAShapeLayer绘制了三条边均为直线的三角形,运行效果见示意图A。
我现在需要将该三角形的最长边修改为向内凹陷的曲线,预期效果见示意图B。

问题

需要对下方代码做出哪些修改才能实现三角形最长边内凹的效果?要如何为路径设置曲线属性?

现有代码

func drawShape() {
    
    let path1 = UIBezierPath()
    path1.move(to: CGPoint(x: 50, y: 600))
    path1.addLine(to: CGPoint(x: 300, y: 600))
    path1.addLine(to: CGPoint(x: 300, y: 50))
    path1.close()
    
    let shape1 = CAShapeLayer()
    shape1.path = path1.cgPath
    shape1.fillColor = UIColor(red: 0.5, green: 0.5, blue: 0.5, alpha: 1).cgColor
    
    view.layer.insertSublayer(shape1, at: 1)

}

效果示意图

效果示意图


解决方案

你只需将最长边的直线绘制逻辑替换为二次贝塞尔曲线绘制即可,具体修改如下:
原有代码中path1.addLine(to: CGPoint(x: 300, y: 600))是绘制底部最长边的直线段,把这行替换为addQuadCurve(to:controlPoint:)方法调用,控制点设置在两个端点中点偏上的位置即可实现向内凹陷的效果。

修改后的完整代码:

func drawShape() {
    
    let path1 = UIBezierPath()
    path1.move(to: CGPoint(x: 50, y: 600))
    // 替换原直线绘制,用二次贝塞尔曲线实现内凹效果
    path1.addQuadCurve(to: CGPoint(x: 300, y: 600), controlPoint: CGPoint(x: 175, y: 550))
    path1.addLine(to: CGPoint(x: 300, y: 50))
    path1.close()
    
    let shape1 = CAShapeLayer()
    shape1.path = path1.cgPath
    shape1.fillColor = UIColor(red: 0.5, green: 0.5, blue: 0.5, alpha: 1).cgColor
    
    view.layer.insertSublayer(shape1, at: 1)
}

参数说明

  • 上述代码中的controlPoint是控制曲线弧度的控制点,示例中取的是两个端点x坐标的中点((50+300)/2=175),y坐标设置为550,相比原直线的y值600更靠上,所以曲线会向内凹陷。
  • 你可以自行调整控制点的y值修改凹陷程度:y值越小,凹陷越深;y值越接近600,凹陷越浅。如果需要更复杂的曲线效果,也可以使用addCurve(to:controlPoint1:controlPoint2:)方法设置两个控制点自定义曲率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 17:15:04