There's LOTS of questions on here about making a UIView
's corners rounded. Unfortunately I can't find anything for how to make angled corners. How can I make a UIView
with corners cut at a 45 degree angle instead?
You can even have a bonus (figurative) gold star if you can show me how to make any individual corner cut at an angle.
Edit: For reference, here's a link to a question that I suspect has a similar implementation to this solution. I just don't know what I'd have to change.
First you need a path with the angled corners:
- (CGPathRef) makeAnglePathWithRect: (CGRect)rect withSize:(float) s {
CGPoint one = CGPointMake( rect.origin.x +s, rect.origin.y);
CGPoint two = CGPointMake( rect.origin.x + rect.size.width - s, rect.origin.y);
CGPoint three = CGPointMake( rect.origin.x + rect.size.width, rect.origin.y +s);
CGPoint four = CGPointMake( rect.origin.x + rect.size.width, rect.origin.y + rect.size.height -s);
CGPoint five = CGPointMake( rect.origin.x + rect.size.width-s, rect.origin.y + rect.size.height);
CGPoint six = CGPointMake(rect.origin.x+s, rect.origin.y + rect.size.height);
CGPoint seven = CGPointMake(rect.origin.x, rect.origin.y + rect.size.height-s);
CGPoint eight = CGPointMake(rect.origin.x, rect.origin.y + s);
CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path,NULL,one.x, one.y);
CGPathAddLineToPoint(path,NULL,two.x, two.y);
CGPathAddLineToPoint(path,NULL,three.x, three.y);
CGPathAddLineToPoint(path,NULL,four.x, four.y);
CGPathAddLineToPoint(path,NULL,five.x, five.y);
CGPathAddLineToPoint(path,NULL,six.x, six.y);
CGPathAddLineToPoint(path,NULL,seven.x, seven.y);
CGPathAddLineToPoint(path,NULL,eight.x, eight.y);
CGPathAddLineToPoint(path,NULL,one.x, one.y);
return path;
}
Then you need to use the path to specify a mask:
CAShapeLayer *maskLayer = [CAShapeLayer layer];
CGRect bounds = CGRectMake(0.0f, 0.0f, 100, 100); //figure out your bounds
[maskLayer setFrame:bounds];
CGPathRef p = [self makeAnglePathWithRect:bounds withSize:20.0];
maskLayer.path = p;
_myview.layer.mask = maskLayer;
If you want to remove the angles from any corner, fiddle with points one-eight, removing the "s" value. You can change the size of the triangles cut out of the corners with the size parameter.
Taking inspiration from @nont and using extension, I write this snippet:
extension UIView {
public enum Corner: Int {
case TopRight
case TopLeft
case BottomRight
case BottomLeft
case All
}
public func blendCorner(corner corner: Corner, length: CGFloat = 20.0) {
let maskLayer = CAShapeLayer()
var path: CGPathRef?
switch corner {
case .All:
path = self.makeAnglePathWithRect(self.bounds, topLeftSize: length, topRightSize: length, bottomLeftSize: length, bottomRightSize: length)
case .TopRight:
path = self.makeAnglePathWithRect(self.bounds, topLeftSize: 0.0, topRightSize: length, bottomLeftSize: 0.0, bottomRightSize: 0.0)
case .TopLeft:
path = self.makeAnglePathWithRect(self.bounds, topLeftSize: length, topRightSize: 0.0, bottomLeftSize: 0.0, bottomRightSize: 0.0)
case .BottomRight:
path = self.makeAnglePathWithRect(self.bounds, topLeftSize: 0.0, topRightSize: 0.0, bottomLeftSize: 0.0, bottomRightSize: length)
case .BottomLeft:
path = self.makeAnglePathWithRect(self.bounds, topLeftSize: 0.0, topRightSize: 0.0, bottomLeftSize: length, bottomRightSize: 0.0)
}
maskLayer.path = path
self.layer.mask = maskLayer
}
private func makeAnglePathWithRect(rect: CGRect, topLeftSize tl: CGFloat, topRightSize tr: CGFloat, bottomLeftSize bl: CGFloat, bottomRightSize br: CGFloat) -> CGPathRef {
var points = [CGPoint]()
points.append(CGPointMake(rect.origin.x + tl, rect.origin.y))
points.append(CGPointMake(rect.origin.x + rect.size.width - tr, rect.origin.y))
points.append(CGPointMake(rect.origin.x + rect.size.width, rect.origin.y + tr))
points.append(CGPointMake(rect.origin.x + rect.size.width, rect.origin.y + rect.size.height - br))
points.append(CGPointMake(rect.origin.x + rect.size.width - br, rect.origin.y + rect.size.height))
points.append(CGPointMake(rect.origin.x + bl, rect.origin.y + rect.size.height))
points.append(CGPointMake(rect.origin.x, rect.origin.y + rect.size.height - bl))
points.append(CGPointMake(rect.origin.x, rect.origin.y + tl))
let path = CGPathCreateMutable()
CGPathMoveToPoint(path, nil, points.first!.x, points.first!.y)
for point in points {
if point != points.first {
CGPathAddLineToPoint(path, nil, point.x, point.y)
}
}
CGPathAddLineToPoint(path, nil, points.first!.x, points.first!.y)
return path
}
}
In this way you can easily blend your corner:
let view = UIView()
view.blendCorner(corner: .TopRight)
// or view.blendCorner(corner: .All)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With