Create a rectangle with just two rounded corners in swift?

后端 未结 15 3001
南笙
南笙 2020-11-28 03:14

I need to create a rectangle that have just two rounded corners in swift (Objective C code also ok).

At the moment my code is creating two rectangles with



        
15条回答
  •  借酒劲吻你
    2020-11-28 03:54

    Update: See this answer below for Swift 4 / iOS 11 which is much, much easier


    Here's a quick Swift 3 extension you can use to do rounding and optional borders.

    Note: if you're using autolayout, you may need to call this in one of the view lifecycle callbacks like viewDidLayoutSubviews or layoutSubviews after the view has been constrained.

    import UIKit
    
    extension UIView {
        
        /**
         Rounds the given set of corners to the specified radius
         
         - parameter corners: Corners to round
         - parameter radius:  Radius to round to
         */
        func round(corners: UIRectCorner, radius: CGFloat) {
            _ = _round(corners: corners, radius: radius)
        }
        
        /**
         Rounds the given set of corners to the specified radius with a border
         
         - parameter corners:     Corners to round
         - parameter radius:      Radius to round to
         - parameter borderColor: The border color
         - parameter borderWidth: The border width
         */
        func round(corners: UIRectCorner, radius: CGFloat, borderColor: UIColor, borderWidth: CGFloat) {
            let mask = _round(corners: corners, radius: radius)
            addBorder(mask: mask, borderColor: borderColor, borderWidth: borderWidth)
        }
        
        /**
         Fully rounds an autolayout view (e.g. one with no known frame) with the given diameter and border
         
         - parameter diameter:    The view's diameter
         - parameter borderColor: The border color
         - parameter borderWidth: The border width
         */
        func fullyRound(diameter: CGFloat, borderColor: UIColor, borderWidth: CGFloat) {
            layer.masksToBounds = true
            layer.cornerRadius = diameter / 2
            layer.borderWidth = borderWidth
            layer.borderColor = borderColor.cgColor;
        }
        
    }
    
    private extension UIView {
        
        @discardableResult func _round(corners: UIRectCorner, radius: CGFloat) -> CAShapeLayer {
            let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
            let mask = CAShapeLayer()
            mask.path = path.cgPath
            self.layer.mask = mask
            return mask
        }
        
        func addBorder(mask: CAShapeLayer, borderColor: UIColor, borderWidth: CGFloat) {
            let borderLayer = CAShapeLayer()
            borderLayer.path = mask.path
            borderLayer.fillColor = UIColor.clear.cgColor
            borderLayer.strokeColor = borderColor.cgColor
            borderLayer.lineWidth = borderWidth
            borderLayer.frame = bounds
            layer.addSublayer(borderLayer)
        }
        
    }
    

提交回复
热议问题