Round some corners of UIView and round the view’s layer’s border too

前端 未结 3 1259
鱼传尺愫
鱼传尺愫 2020-12-25 15:09

I am trying to round the bottom two corners of a UIView, and have the layer’s border show up rounded as well. I am currently doing:

UIRectCorners corners = U         


        
相关标签:
3条回答
  • 2020-12-25 15:52

    Zev Eisenberg's answer is the right one.

    Although I prefer:

    [self.layer addSublayer:strokeLayer];
    

    instead of creating and adding a subview:

    CGSize radii = CGSizeMake(radius, radius);
    
    UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:self.bounds
                                               byRoundingCorners:corners
                                                     cornerRadii:radii];
    
    // Mask the container view’s layer to round the corners.
    CAShapeLayer *cornerMaskLayer = [CAShapeLayer layer];
    [cornerMaskLayer setPath:path.CGPath];
    self.layer.mask = cornerMaskLayer;
    
    // Make a transparent, stroked layer which will dispay the stroke.
    CAShapeLayer *strokeLayer = [CAShapeLayer layer];
    strokeLayer.path = path.CGPath;
    strokeLayer.fillColor = [UIColor clearColor].CGColor;
    strokeLayer.strokeColor = color.CGColor;
    strokeLayer.lineWidth = 2; // the stroke splits the width evenly inside and outside,
    // but the outside part will be clipped by the containerView’s mask.
    
    [self.layer addSublayer:strokeLayer];
    
    0 讨论(0)
  • 2020-12-25 16:02

    I figured out a new way of thinking about it, thanks to David Rönnqvist’s comment.

    I was trying to do the corner rounding and the stroke all in one layer. Instead, I broke it up into two layers: one to mask the view’s layer to round the corners, and the other in a view to add the stroke.

    UIView *containerView = [[UIView alloc] initWithFrame:someFrame];
    
    UIRectCorners corners = UIRectCornerBottomLeft | UIRectCornerBottomRight;
    CGSize radii = CGSizeMake(kThisViewCornerRadius, kThisViewCornerRadius);
    
    UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:myView.bounds
                                               byRoundingCorners:corners
                                                     cornerRadii:radii];
    
    // Mask the container view’s layer to round the corners.
    CAShapeLayer *cornerMaskLayer = [CAShapeLayer layer];
    [cornerMaskLayer setPath:path.CGPath];
    containerView.layer.mask = cornerMaskLayer;
    
    // Make a transparent, stroked layer which will dispay the stroke.
    CAShapeLayer *strokeLayer = [CAShapeLayer layer];
    strokeLayer.path = path.CGPath;
    strokeLayer.fillColor = [UIColor clearColor].CGColor;
    strokeLayer.strokeColor = [UIColor redColor].CGColor;
    strokeLayer.lineWidth = 2; // the stroke splits the width evenly inside and outside,
                               // but the outside part will be clipped by the containerView’s mask.
    
    // Transparent view that will contain the stroke layer
    UIView *strokeView = [[UIView alloc] initWithFrame:containerView.bounds];
    strokeView.userInteractionEnabled = NO; // in case your container view contains controls
    [strokeView.layer addSublayer:strokeLayer];
    
    // configure and add any subviews to the container view
    
    // stroke view goes in last, above all the subviews
    [containerView addSubview:strokeView];
    
    0 讨论(0)
  • 2020-12-25 16:08

    Here is the small code. Alloc init a view and send to this method to get corners rounded. You can optionally round any of the corners u want. Also give shadow stroke color.

     -(void) setMaskTo:(UIView*)view byRoundingCorners:(UIRectCorner)corners withColor:  (UIColor*) color
    {
     UIBezierPath* rounded = [UIBezierPath bezierPathWithRoundedRect:view.bounds  byRoundingCorners:corners cornerRadii:CGSizeMake(9.0, 9.0)];
    
    CAShapeLayer* shape = [[[CAShapeLayer alloc] init] autorelease];
    [shape setPath:rounded.CGPath];
    shape.strokeColor = [[UIColor grayColor] CGColor];
    
    view.backgroundColor=color;
    view.layer.mask = shape;
    }
    

    Call the method like this.

    [self setMaskTo:ABCView byRoundingCorners:UIRectCornerAllCorners withColor:[UIColor greenColor]];
    
    0 讨论(0)
提交回复
热议问题