如何使可选的圆angular和边框UIView?

我正在应用angular落半径UIViewUIRectCornerTopLeftUIRectCornerTopRight 。 当我申请这个,边界在angular落。 如何避免这一点?

这是我如何将边界应用于UIView

  [self.middleView addRoundedCorners:UIRectCornerTopLeft|UIRectCornerTopRight withRadii:CGSizeMake(4, 4)]; self.middleView.layer.borderWidth = 0.5f; self.middleView.layer.borderColor = [[UIColor colorWith8BitRed:0 green:0 blue:0 alpha:0.25] 

这是我用来应用可选圆angular的类别:

  #import "UIView+Roundify.h" @implementation UIView (Roundify) - (void)addRoundedCorners:(UIRectCorner)corners withRadii:(CGSize)radii { CALayer *tMaskLayer = [self maskForRoundedCorners:corners withRadii:radii]; self.layer.mask = tMaskLayer; } - (CALayer*)maskForRoundedCorners:(UIRectCorner)corners withRadii:(CGSize)radii { CAShapeLayer *maskLayer = [CAShapeLayer layer]; maskLayer.frame = self.bounds; UIBezierPath *roundedPath = [UIBezierPath bezierPathWithRoundedRect: maskLayer.bounds byRoundingCorners:corners cornerRadii:radii]; maskLayer.fillColor = [[UIColor whiteColor] CGColor]; maskLayer.backgroundColor = [[UIColor clearColor] CGColor]; maskLayer.path = [roundedPath CGPath]; return maskLayer; } 

尝试下面的代码工作

您想要舍入TopLeft和TopRight的视图

  UIView *view1 = [[UIView alloc]initWithFrame:CGRectMake(50, 100, 100, 100)]; [view1 setBackgroundColor:[UIColor grayColor]]; [self.view addSubview:view1]; 

设置angular落如下代码

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

产量是:

在这里输入图像说明

find这段代码。 实际上没有尝试过,但似乎是你所需要的。

 - (void)drawDashedBorderAroundView:(UIView *)v { //border definitions CGFloat cornerRadius = 10; CGFloat borderWidth = 2; NSInteger dashPattern1 = 8; NSInteger dashPattern2 = 8; UIColor *lineColor = [UIColor orangeColor]; //drawing CGRect frame = v.bounds; CAShapeLayer *_shapeLayer = [CAShapeLayer layer]; //creating a path CGMutablePathRef path = CGPathCreateMutable(); //drawing a border around a view CGPathMoveToPoint(path, NULL, 0, frame.size.height - cornerRadius); CGPathAddLineToPoint(path, NULL, 0, cornerRadius); CGPathAddArc(path, NULL, cornerRadius, cornerRadius, cornerRadius, M_PI, -M_PI_2, NO); CGPathAddLineToPoint(path, NULL, frame.size.width - cornerRadius, 0); CGPathAddArc(path, NULL, frame.size.width - cornerRadius, cornerRadius, cornerRadius, -M_PI_2, 0, NO); CGPathAddLineToPoint(path, NULL, frame.size.width, frame.size.height - cornerRadius); CGPathAddArc(path, NULL, frame.size.width - cornerRadius, frame.size.height - cornerRadius, cornerRadius, 0, M_PI_2, NO); CGPathAddLineToPoint(path, NULL, cornerRadius, frame.size.height); CGPathAddArc(path, NULL, cornerRadius, frame.size.height - cornerRadius, cornerRadius, M_PI_2, M_PI, NO); //path is set as the _shapeLayer object's path _shapeLayer.path = path; CGPathRelease(path); _shapeLayer.backgroundColor = [[UIColor clearColor] CGColor]; _shapeLayer.frame = frame; _shapeLayer.masksToBounds = NO; [_shapeLayer setValue:[NSNumber numberWithBool:NO] forKey:@"isCircle"]; _shapeLayer.fillColor = [[UIColor clearColor] CGColor]; _shapeLayer.strokeColor = [lineColor CGColor]; _shapeLayer.lineWidth = borderWidth; _shapeLayer.lineDashPattern = [NSArray arrayWithObjects:[NSNumber numberWithInt:dashPattern1], [NSNumber numberWithInt:dashPattern2], nil]; _shapeLayer.lineCap = kCALineCapRound; //_shapeLayer is added as a sublayer of the view, the border is visible [v.layer addSublayer:_shapeLayer]; v.layer.cornerRadius = cornerRadius; } 

这段代码添加了一条虚线,但是可以通过_shapeLayer.lineDashPattern修改它。

除非有一些我们没有意识到的具体要求,否则如果你所要做的只是绕过angular落并且有一个边界,那么贝塞尔path和面具是不必要的。 我通常会这样做:myView.layer.borderWidth = 2; myView.layer.cornerRadius = 5;

难道你只是想要四舍五入的顶angular,你不需要使用四舍五入? 如果是这样,为什么不使用它,然后覆盖薄视图覆盖底部位? 有一点烦琐,但是我发现越是靠标准控件来绘制自己,而不是步入核心graphics就越好。

编辑 :好的,因为它需要有底angular未舍入,如果你有一个UIView类别与2个子视图:1 4个圆angular和另一个覆盖顶部(自bringSubviewToFront),只是覆盖圆angular视图的带有非圆angular条的“footer”,即等宽,高度与圆angular半径相等的视图。 如果你有一个纯色的背景,那么就让两个子视图一样。 如果你有一些纹理或图像的背景,使它们都是透明的,并将纹理/图像放在超级视图(使用类别的特定布局方法的父视图)上。 最后,把边界放在同一个超级视图上。 应该工作,让我知道你的想法。