ios objective Как сделать UIView с дополнительными закругленными углами и границей?




uiview uiresponder (3)

Я применяю угловой радиус к UIView то есть UIRectCornerTopLeft и UIRectCornerTopRight . Когда я применяю это, граница исчезает по углам. Как этого избежать?

Вот как я применяю границу к 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]

И это категория, которую я использую для применения дополнительных закругленных углов:

   #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;
 }

Нашел этот кусок кода. На самом деле не пробовал, но похоже, что это то, что вам нужно.

- (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 .


Попробуйте выполнить код ниже.

Ваше мнение, которое вы хотите округлить TopLeft и TopRight

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

Установите Угол как ниже код

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;

ВЫХОД:


Если не существует определенного требования, о котором мы не знаем, путь без маски и маска не нужны, если все, что вы пытаетесь сделать, - это круглые углы и иметь границу. Обычно я просто делаю это: myView.layer.borderWidth = 2; myView.layer.cornerRadius = 5;

Это то, что вы хотите, чтобы верхние углы округлялись, что вам не нужно использовать округление слоя? Если да, почему бы не использовать это, а затем наложить тонкий вид, чтобы покрыть нижний бит? Немного нереально, но я нахожу, что чем больше вы можете полагаться на стандартные элементы управления, чтобы рисовать себя, а не вступать в основную графику, тем лучше.

Edit : ok, учитывая, что для этого нужно, чтобы нижние углы не закруглены, как насчет того, была ли у вас категория на UIView с 2 subviews: 1 с 4 закругленными углами, а другая - над верхней (self bringSubviewToFront), которая просто охватывает закругленный вид «нижний колонтитул» с некруглой полосой, то есть вид с равной шириной и крошечной высотой, равный округленному радиусу угла. Если у вас есть сплошной цвет фона, то просто сделать оба subviews одинаковым; если у вас есть фон текстуры или изображения, сделайте их прозрачными и поместите текстуру / изображение в супер-представление (родительское представление, использующее конкретный метод раскладки вашей категории). Затем, наконец, поместите границу на тот же супервизор. Должен работать, дайте мне знать, что вы думаете.







uiview