how to set cornerRadius for only bottom-left,bottom-right and top-left corner of a UIView?

前端 未结 10 1168
Happy的楠姐
Happy的楠姐 2020-12-04 06:49

Is there a way to set cornerRadius for only bottom-left,bottom-right and top-left corner of a UIView?

I tried the following, but it ended up making the view disappea

相关标签:
10条回答
  • 2020-12-04 07:30

    You can do it like this:

    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.viewOutlet.bounds byRoundingCorners:(UIRectCornerTopLeft | UIRectCornerBottomLeft | UIRectCornerBottomRight) cornerRadii:CGSizeMake(10.0, 10.0)];
    
    CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
    maskLayer.frame = self.view.bounds;
    maskLayer.path  = maskPath.CGPath;
    self.viewOutlet.layer.mask = maskLayer;
    

    enter image description here

    Update:
    If You need border just create another CAShapeLayer and add it to view's layer as sublayer. Like this (place this code below upper code):

    CAShapeLayer *borderLayer = [[CAShapeLayer alloc] init];
    borderLayer.frame = self.view.bounds;
    borderLayer.path  = maskPath.CGPath;
    borderLayer.lineWidth   = 4.0f;
    borderLayer.strokeColor = [UIColor blackColor].CGColor;
    borderLayer.fillColor   = [UIColor clearColor].CGColor;
    
    [self.viewOutlet.layer addSublayer:borderLayer];
    

    enter image description here

    In swift 3.0 like this:

    let maskPath = UIBezierPath.init(roundedRect: self.viewOutlet.bounds, byRoundingCorners:[.topLeft, .bottomLeft], cornerRadii: CGSize.init(width: 10.0, height: 10.0))
    let maskLayer = CAShapeLayer()
    maskLayer.frame = self.viewOutlet.bounds
    maskLayer.path = maskPath.cgPath
    self.viewOutlet.layer.mask = maskLayer
    
    0 讨论(0)
  • 2020-12-04 07:32

    Tested in xcode 8 and swift 3

    extension UIView {
        func roundCorners(corners:UIRectCorner, radius: CGFloat) {
          let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
          let mask = CAShapeLayer()
          mask.path = path.cgPath
          self.layer.mask = mask
        }
    }
    

    And use like this

    YourView.roundCorners([.topLeft, .bottomLeft], radius: 10)
    
    0 讨论(0)
  • 2020-12-04 07:33

    On iOS 11, What you only need is the maskedCorners.

        let cornerRadius: CGFloat = 6.0
        if #available(iOS 11, *) {
            productImageView.layer.cornerRadius  = cornerRadius
            productImageView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]
    
        } else {
            let path        = UIBezierPath(roundedRect: bounds, byRoundingCorners: [.topLeft , .topRight], cornerRadii:CGSize(width: cornerRadius, height: cornerRadius))
            let maskLayer   = CAShapeLayer()
            maskLayer.frame = bounds
            maskLayer.path  = path.cgPath
            productImageView.mask                = maskLayer
            productImageView.layer.masksToBounds = true
        }
    
    0 讨论(0)
  • 2020-12-04 07:34

    use this code corner radius of view only two sides.after long time i got suggestion ios. here viewFilter is view outlet which we want rounded.

    -(void) viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    [self setMaskTo:viewFilter byRoundingCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight];
    }
    
    -(void)setMaskTo:(UIView*)view byRoundingCorners:(UIRectCorner)corners{
    
    UIBezierPath *rounded = [UIBezierPathbezierPathWithRoundedRect:view.bounds byRoundingCorners:corners cornerRadii:CGSizeMake(20.0, 20.0)];
    
    CAShapeLayer *shape = [[CAShapeLayer alloc] init];
    shape.frame = self.view.bounds;
    [shape setPath:rounded.CGPath];
    view.layer.mask = shape;
    }
    
    0 讨论(0)
提交回复
热议问题