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。没有运气!
,直到我得到的另一个答案,如果是可以使用autoresizingMask与UIBezierPath
,我说NO并标记为正确答案。
我不会删除我的问题,因为任何人都可以在不知道原因的情况下屏蔽相同的问题。
只是尽量在 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:
为此,您可以使用不同的RoundingCorners
UIBezierPath
属性llow ....
对于防爆:UIRectCornerBottomLeft
,UIRectCornerBottomRight
,UIRectCornerTopLeft
,UIRectCornerTopRight
和UIRectCornerAllCorners
。
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];
我已更新我的问题。 – Mert 2013-04-23 09:18:51
@Mert也看到这个链接与许多答案.. http://*.com/questions/2264083/rounded-uiview-using-calayers-only-some-corners-how – 2013-04-23 09:28:31
@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;
}
我刚刚有一个类似的问题需要数小时解决 - 答案很简单:将我的代码从viewDidLoad移动到viewDidLayoutSubviews:这是自动布局完成后调用的第一个方法....所以我怀疑我做了有4个圆角,但不知何故他们离开了屏幕边缘。
旋转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
为什么不使用layer.cornerradius? – 2013-04-23 09:09:38
right @ LithuT.V我发表了那个答案,然后再发表评论:) – 2013-04-23 09:11:04
@ LithuT.V我已更新我的问题。 – Mert 2013-04-23 09:17:42