2016-01-28 24 views
3

我使用UIBezierPath通过分数相加点装箱矩形绘制矩形,现在我要四舍五入这个矩形的角落,但似乎没有办法做到这一点。谁能帮我 ?如何圆润边角,当我使用UIBezierPath点

class RectangleLayer: CAShapeLayer { 

    let animationDuration: CFTimeInterval = 0.5 

    override init() { 
     super.init() 
     fillColor = Colors.clear.CGColor 
     lineWidth = 5.0 
     path = rectanglePathStart.CGPath 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
var rectanglePathStart: UIBezierPath { 
     let rectanglePath = UIBezierPath() 
     rectanglePath.moveToPoint(CGPoint(x: 0.0, y: 100.0)) 
     rectanglePath.addLineToPoint(CGPoint(x: 0.0, y: -lineWidth)) 
     rectanglePath.addLineToPoint(CGPoint(x: 100.0, y: -lineWidth)) 
     rectanglePath.addLineToPoint(CGPoint(x: 100.0, y: 100.0)) 
     rectanglePath.addLineToPoint(CGPoint(x: -lineWidth/2, y: 100.0)) 

     rectanglePath.closePath() 

//  fillColor = Colors.red.CGColor 
     return rectanglePath 
    } 
} 
+0

你可以使用'bezierPathWithArcCenter:radius:startAngle:endAng le:顺时针方向:'为你想要的每个角落。 – Larme

回答

9

如果你想要做的是创建一个圆角矩形,那么你可以简单地使用

let rectangle = CGRect(x: 0, y: 0, width: 100, height: 100) 
let path = UIBezierPath(roundedRect: rectangle, cornerRadius: 20) 

enter image description here

如果你想圆的一些角落,但不是别人,那么你可以使用

let rectangle = CGRect(x: 0, y: 0, width: 100, height: 100) 
let path = UIBezierPath(roundedRect: rectangle, byRoundingCorners: [.TopLeft, .BottomRight], cornerRadii: CGSize(width: 35, height: 35)) 

enter image description here

如果你想为每个角不同的角半径,那么你就必须添加的周分别单独圈。这归结为计算每个弧的中心和开始和结束角度。你会发现每个圆弧的中心位于矩形对应角落的圆角半径内。例如,左上角的中心点

CGPoint(x: rectangle.minX + upperLeftRadius, y: rectangle.minY + upperLeftRadius) 

每条弧线的起始角度和结束角度可以是直线左上角,上下角或右角。在UIBezierPath文档中可以看到与这些方向相对应的角度。

enter image description here

如果你需要创建很多矩形这样,你可以为它创建

extension UIBezierPath { 
    convenience init(roundedRect rect: CGRect, topLeftRadius r1: CGFloat, topRightRadius r2: CGFloat, bottomRightRadius r3: CGFloat, bottomLeftRadius r4: CGFloat) { 
     let left = CGFloat(M_PI) 
     let up = CGFloat(1.5*M_PI) 
     let down = CGFloat(M_PI_2) 
     let right = CGFloat(0.0) 
     self.init() 
     addArcWithCenter(CGPoint(x: rect.minX + r1, y: rect.minY + r1), radius: r1, startAngle: left, endAngle: up, clockwise: true) 
     addArcWithCenter(CGPoint(x: rect.maxX - r2, y: rect.minY + r2), radius: r2, startAngle: up, endAngle: right, clockwise: true) 
     addArcWithCenter(CGPoint(x: rect.maxX - r3, y: rect.maxY - r3), radius: r3, startAngle: right, endAngle: down, clockwise: true) 
     addArcWithCenter(CGPoint(x: rect.minX + r4, y: rect.maxY - r4), radius: r4, startAngle: down, endAngle: left, clockwise: true) 
     closePath() 
    } 
} 

便利初始化函数和使用这样的

let path = UIBezierPath(roundedRect: rectangle, topLeftRadius: 30, topRightRadius: 10, bottomRightRadius: 15, bottomLeftRadius: 5) 

enter image description here

相关问题