角半径图像Swift

我正在尝试制作这个角落半径图像……它与图像的形状不完全相同。这是一个简单的答案,而不是尝试宽度和高度的随机数? 非常感谢

在此处输入图像描述

let rectShape = CAShapeLayer() rectShape.bounds = self.mainImg.frame rectShape.position = self.mainImg.center rectShape.path = UIBezierPath(roundedRect: self.mainImg.bounds, byRoundingCorners: [.bottomLeft , .bottomRight ], cornerRadii: CGSize(width: 50, height: 4)).cgPath 

您可以使用QuadCurve来获得所需的设计。

这是一个Swift @IBDesignable类,它允许您在Storyboard / Interface Builder中指定舍入的图像和“高度”:

 @IBDesignable class RoundedBottomImageView: UIView { var imageView: UIImageView! @IBInspectable var image: UIImage? { didSet { self.imageView.image = image } } @IBInspectable var roundingValue: CGFloat = 0.0 { didSet { self.setNeedsLayout() } } override init(frame: CGRect) { super.init(frame: frame) doMyInit() } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) doMyInit() } func doMyInit() { imageView = UIImageView() imageView.backgroundColor = UIColor.red imageView.contentMode = UIViewContentMode.scaleAspectFill addSubview(imageView) } override func layoutSubviews() { super.layoutSubviews() imageView.frame = self.bounds let rect = self.bounds let y:CGFloat = rect.size.height - roundingValue let curveTo:CGFloat = rect.size.height let myBezier = UIBezierPath() myBezier.move(to: CGPoint(x: 0, y: y)) myBezier.addQuadCurve(to: CGPoint(x: rect.width, y: y), controlPoint: CGPoint(x: rect.width / 2, y: curveTo)) myBezier.addLine(to: CGPoint(x: rect.width, y: 0)) myBezier.addLine(to: CGPoint(x: 0, y: 0)) myBezier.close() let maskForPath = CAShapeLayer() maskForPath.path = myBezier.cgPath layer.mask = maskForPath } } 

结果为300 x 200图像视图,舍入设置为40

在此处输入图像描述

您可以尝试使用UIView扩展。 如

 extension UIView { func setBottomCurve(){ let offset = CGFloat(self.frame.size.height + self.frame.size.height/1.8) let bounds = self.bounds let rectBounds = CGRect(x: bounds.origin.x, y: bounds.origin.y , width: bounds.size.width, height: bounds.size.height / 2) let rectPath = UIBezierPath(rect: rectBounds) let ovalBounds = CGRect(x: bounds.origin.x - offset / 2, y: bounds.origin.y , width: bounds.size.width + offset, height: bounds.size.height) let ovalPath = UIBezierPath(ovalIn: ovalBounds) rectPath.append(ovalPath) let maskLayer = CAShapeLayer() maskLayer.frame = bounds maskLayer.path = rectPath.cgPath self.layer.mask = maskLayer } } 

并在viewWillAppear使用它,就像你可以获得UIImageView的实际帧的方法一样。

用法:

  override func viewWillAppear(_ animated: Bool) { //use it in viewWillAppear like methods where you can get actual frame of UIImageView myImageView.setBottomCurve() }