【问题标题】:How to make a shape in swift如何快速制作形状
【发布时间】:2020-08-17 11:01:42
【问题描述】:

如何制作这样的形状

func createShape() {
        bezierPath = UIBezierPath()
        bezierPath.move(to: .zero)
        bezierPath.addLine(to: CGPoint(x:self.frame.width , y: self.frame.origin.y))
        bezierPath.addLine(to: CGPoint(x: self.frame.width, y: self.frame.height / 2))
        bezierPath.addCurve(to: CGPoint(x:self.frame.width/2 , y: self.frame.height), controlPoint1: CGPoint(x: self.frame.width, y: self.frame.height / 2), controlPoint2: CGPoint(x:self.frame.width/2  + 33 , y: self.frame.height))
        bezierPath.addCurve(to: CGPoint(x: 0, y: self.frame.height / 2), controlPoint1: CGPoint(x:  self.frame.width/2 - 33, y:self.frame.height), controlPoint2: CGPoint(x: 0, y: self.frame.height / 2))
        bezierPath.addLine(to: .zero)
        bezierPath.close()
    }

结果我得到了

你能帮帮我吗?

【问题讨论】:

  • 你快到了。你只需要1条曲线。使控制点停在视图的边缘。零 x 和宽度 x。
  • 如果可以的话请分享代码@Desdenova
  • 我不同意这个近距离投票。他知道自己想要什么,他尝试了他的代码并且几乎是正确的,他来到了一个完美的地方来修复它。

标签: ios swift swift5 uibezierpath


【解决方案1】:

了解曲线的工作原理here

let bezierPath = UIBezierPath()
        bezierPath.move(to: .zero)
        bezierPath.addLine(to: CGPoint(x: 0 , y: self.frame.height/2))
        bezierPath.addCurve(to:  CGPoint(x:self.frame.width , y: self.frame.height / 2), controlPoint1: CGPoint(x: 0, y: (self.frame.height+self.frame.width)/2), controlPoint2: CGPoint(x: self.frame.width, y: (self.frame.height+self.frame.width)/2))
        bezierPath.addLine(to: CGPoint(x: self.frame.width, y: 0))
        bezierPath.addLine(to: .zero)

【讨论】:

  • 似乎我对这个问题的评论有误。如果我们使用两条曲线,我们可以得到一个完美的半圆。尽管如此,这就是答案。
【解决方案2】:

这是您需要的绘图.. 它会用UIBezierpath addArc 方法为您提供完美的圆

import UIKit

@IBDesignable class CustomView: UIView {

 private lazy var shapeLayer = CAShapeLayer()
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
        
    }
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        commonInit()
    }
    
    private func commonInit() {
        
        shapeLayer.fillColor = UIColor.black.cgColor
        shapeLayer.strokeColor = UIColor.red.cgColor
        shapeLayer.borderWidth = 5
        shapeLayer.frame = bounds
        
        
        layer.addSublayer(shapeLayer)
        
    }
    
    override func layoutSubviews() {
        
        shapeLayer.path = drawShape()
    }
    
    
    private func drawShape() -> CGPath {
        
        let bezierPath = UIBezierPath()
        
        bezierPath.move(to: .zero)
        bezierPath.addLine(to: CGPoint(x: 0, y: bounds.midY/2))
        bezierPath.addArc(withCenter: CGPoint(x: bounds.midX, y:  bounds.midY), radius: bounds.midX, startAngle: .pi, endAngle: 0, clockwise: false)
        
        bezierPath.addLine(to: CGPoint(x: bounds.maxX, y: 0))
        bezierPath.close()
        
        return bezierPath.cgPath
        
        
    }
    
    
}

带背景色

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多