UIBezierPath不会绘制圆角底部

问题描述:

我想为我的视图制作圆角并屏蔽奇怪的问题。UIBezierPath不会绘制圆角底部

我用下面的代码,以使圆角对我的看法

bezierPath = [UIBezierPath bezierPathWithRoundedRect:btnView.bounds 
             byRoundingCorners:UIRectCornerAllCorners 
              cornerRadii:radius]; 
CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init]; 
    maskLayer.frame = btnView.bounds; 
    maskLayer.path = bezierPath.CGPath; 
    btnView.layer.mask = maskLayer; 

的问题是,它不工作的底角。如果我使用UIRectCornerBottomLeft什么也没有发生,如果我使用UIRectCornerAllCorners只有顶角四舍五入。

编辑:我不使用layer.cornerRadius,因为我只是想圆底角。

原来我没有问题,如果我从我的视图中删除UIViewAutoresizingFlexibleHeight自动调整掩码。但我想使用自动调整掩码。如果是的话,可以吗?

我已经尝试在设置图层蒙版之前和之后设置autoresizingMask。没有运气!

+1

为什么不使用layer.cornerradius? – 2013-04-23 09:09:38

+0

right @ LithuT.V我发表了那个答案,然后再发表评论:) – 2013-04-23 09:11:04

+0

@ LithuT.V我已更新我的问题。 – Mert 2013-04-23 09:17:42

,直到我得到的另一个答案,如果是可以使用autoresizingMask与UIBezierPath,我说NO并标记为正确答案。

我不会删除我的问题,因为任何人都可以在不知道原因的情况下屏蔽相同的问题。

+0

只是尽量在 dispatch_async代码(dispatch_get_main_queue()^ {// 使圆角 }); – do01 2016-11-14 14:18:32

的则不是为圆角的是使用娄代码...

btnView.layer.cornerRadius = 8.0; 

只是在你的.m像波纹管导入QuartzCore/QuartzCore.h ...

#import <QuartzCore/QuartzCore.h> 

UPDATE:

为此,您可以使用不同的RoundingCornersUIBezierPath属性llow ....

对于防爆:UIRectCornerBottomLeftUIRectCornerBottomRightUIRectCornerTopLeftUIRectCornerTopRightUIRectCornerAllCorners

UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect: btnView.bounds 
               byRoundingCorners:UIRectCornerBottomLeft 
                cornerRadii:CGSizeMake(10.0, 10.0)]; 

CAShapeLayer *maskLayer = [CAShapeLayer layer]; 
maskLayer.frame = btnView.bounds; 
maskLayer.path = maskPath.CGPath; 
btnView.layer.mask = maskLayer; 
[btnView setNeedsDisplay]; 
+0

我已更新我的问题。 – Mert 2013-04-23 09:18:51

+0

@Mert也看到这个链接与许多答案.. http://*.com/questions/2264083/rounded-uiview-using-calayers-only-some-corners-how – 2013-04-23 09:28:31

+0

@Mert add [btnView setNeedsDisplay];最后... – 2013-04-23 09:37:14

你可以用户view.layer.cornerRadius设置圆角。

编辑:使用以下

layer.mask = MTDContextCreateRoundedMask(layer.bounds, topleftRadius, topRightRadius, bottomLeftRadius,bottomRightRadius); 

这是支持的方法。

static inline UIImage* MTDContextCreateRoundedMask(CGRect rect, CGFloat radius_tl, CGFloat radius_tr, CGFloat radius_bl, CGFloat radius_br) 
{ 
    CGContextRef context; 
    CGColorSpaceRef colorSpace; 

    colorSpace = CGColorSpaceCreateDeviceRGB(); 

    context = CGBitmapContextCreate(NULL, rect.size.width, rect.size.height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast); 

    CGColorSpaceRelease(colorSpace); 

    if (context == NULL) { 
     return NULL; 
    } 


    CGFloat minx = CGRectGetMinX(rect), midx = CGRectGetMidX(rect), maxx = CGRectGetMaxX(rect); 
    CGFloat miny = CGRectGetMinY(rect), midy = CGRectGetMidY(rect), maxy = CGRectGetMaxY(rect); 

    CGContextBeginPath(context); 
    CGContextSetGrayFillColor(context, 1.0, 0.0); 
    CGContextAddRect(context, rect); 
    CGContextClosePath(context); 
    CGContextDrawPath(context, kCGPathFill); 

    CGContextSetGrayFillColor(context, 1.0, 1.0); 
    CGContextBeginPath(context); 
    CGContextMoveToPoint(context, minx, midy); 
    CGContextAddArcToPoint(context, minx, miny, midx, miny, radius_bl); 
    CGContextAddArcToPoint(context, maxx, miny, maxx, midy, radius_br); 
    CGContextAddArcToPoint(context, maxx, maxy, midx, maxy, radius_tr); 
    CGContextAddArcToPoint(context, minx, maxy, minx, midy, radius_tl); 
    CGContextClosePath(context); 
    CGContextDrawPath(context, kCGPathFill); 

    CGImageRef bitmapContext = CGBitmapContextCreateImage(context); 
    CGContextRelease(context); 

    UIImage *theImage = [UIImage imageWithCGImage:bitmapContext]; 
    CGImageRelease(bitmapContext); 

    return theImage.layer.mask; 
} 
+0

我已经更新了我的问题。 – Mert 2013-04-23 09:19:13

+0

我得到“函数的隐式声明MTDContextCreateRoundedMask无效”。我找不到任何关于该功能的文档是否是一个私有API? – Mert 2013-04-23 09:47:33

+0

我得到警告“不兼容的指针类型从的UIImage *分配给CALayer的*”如果我运行它崩溃坏访问 – Mert 2013-04-23 10:06:15

我刚刚有一个类似的问题需要数小时解决 - 答案很简单:将我的代码从viewDidLoad移动到viewDidLayoutSubviews:这是自动布局完成后调用的第一个方法....所以我怀疑我做了有4个圆角,但不知何故他们离开了屏幕边缘。

+0

旋转viewDidLayoutSubviews不会调用,不适合自动布局。 – Vahid 2016-11-08 08:50:24

解决方案:

-(void)roundCorners:(UIRectCorner)corner radius:(float)radius 
{ 
    _cornerRadius = radius; 
    _corner = corner; 
    [self setNeedsDisplay]; 
} 

- (void)drawRect:(CGRect)rect { 
    // Drawing code 
    [super drawRect:rect]; 

    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds byRoundingCorners:_corner cornerRadii:CGSizeMake(_cornerRadius, _cornerRadius)]; 

    CAShapeLayer *maskLayer = [CAShapeLayer layer]; 
    maskLayer.frame = self.bounds; 
    maskLayer.path = maskPath.CGPath; 

    self.layer.mask = maskLayer; 
} 

不得不改变视角。由于autoresizing而无法在viewDidLoad中使用底角。必须将代码移动到viewDidAppear。

-(void)viewDidAppear:(BOOL)animated{ 
[super viewDidAppear:animated]; 

CGRect bounds = self.view.bounds; 
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:bounds byRoundingCorners:(UIRectCornerTopLeft | UIRectCornerBottomLeft) cornerRadii:CGSizeMake(5.0, 5.0)]; 

CAShapeLayer *maskLayer = [CAShapeLayer layer]; 
maskLayer.frame = bounds; 
maskLayer.path = maskPath.CGPath; 
self.view.layer.mask = maskLayer; 

self.view.layer.masksToBounds = YES; 
[self.view setNeedsDisplay]; 
} 

最后我得到了成功,它真的有效。尝试一下。

CGRect frame = self.accountBackgroundImage2.frame; 
frame.size.height = self.view.bounds.size.height; 
UIBezierPath *path=[UIBezierPath bezierPathWithRoundedRect:self.accountBackgroundImage2.bounds byRoundingCorners:(UIRectCornerBottomLeft |UIRectCornerBottomRight) cornerRadii:CGSizeMake(12.5, 12.5)]; 

CAShapeLayer *shapeLayer = [[CAShapeLayer alloc] init]; 
shapeLayer.frame = self.accountBackgroundImage2.bounds; 
shapeLayer.path = path.CGPath; 
_accountBackgroundImage2.layer.mask = shapeLayer; 
self.accountBackgroundImage2.frame = frame; 

换种方式

在执行 “viewWillLayoutSubviews”

- (void)viewWillLayoutSubviews{ 
[self roundCornersOnView:self.buttonJoin onTopLeft:NO topRight:YES bottomLeft:YES bottomRight:NO radius:10.0]; 
} 

功能

-(UIButton *)roundCornersOnView:(UIButton *)button onTopLeft:(BOOL)tl topRight:(BOOL)tr bottomLeft:(BOOL)bl bottomRight:(BOOL)br radius:(float)radius { 

if (tl || tr || bl || br) { 
    UIRectCorner corner = 0; //holds the corner 
    //Determine which corner(s) should be changed 
    if (tl) { 
     corner = corner | UIRectCornerTopLeft; 
    } 
    if (tr) { 
     corner = corner | UIRectCornerTopRight; 
    } 
    if (bl) { 
     corner = corner | UIRectCornerBottomLeft; 
    } 
    if (br) { 
     corner = corner | UIRectCornerBottomRight; 
    } 

    UIButton *roundedView = button; 
    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:roundedView.bounds byRoundingCorners:corner cornerRadii:CGSizeMake(radius, radius)]; 
    CAShapeLayer *maskLayer = [CAShapeLayer layer]; 
    maskLayer.frame = roundedView.bounds; 
    maskLayer.path = maskPath.CGPath; 
    roundedView.layer.mask = maskLayer; 
    return roundedView; 
} else { 
    return button; 
} 

}

我认为你应该使用

bezierPath.lineCapStyle = CGLineCap.Round