Вопрос по ios, objective-c, calayer – Скруглите некоторые углы UIView и тоже закройте границу слоя вида

15

Я пытаюсь закруглить нижние два угла UIView, и у меня есть слойГраница s также округляется. В настоящее время я делаю:

UIRectCorners corners = UIRectCornerBottomLeft | UIRectCornerBottomRight;
CGSize radii = CGSizeMake(kThisViewCornerRadius, kThisViewCornerRadius);
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:myView.bounds
                                           byRoundingCorners:corners
                                                 cornerRadii:radii];

CAShapeLayer *maskLayer = [CAShapeLayer layer];
[maskLayer setPath:path.CGPath];
myView.layer.mask = maskLayer;

Это нормально работает для нормального просмотра. Тем не мение, 'myViewСлой имеет свойborderColor а такжеborderWidth установить, и, как вы можете видеть на скриншоте, слойГраница не округляется:

Я также попытался создать подкласс UIView и вернуть[CAShapeLayer layer] от+[Class layerClass]и настройку видаслойкак слой формы, но граница оказалась ниже видас подвидом.

Можно ли округлить часть вида?s углы, вокруг зренияслой "s и обрежьте подпредставления под слоемГраница с?

Обратите внимание, что этоне о том, как скруглить некоторые углы, а не о других, а о том, как заставить штрих правильно себя вести.

Добавить слой формы, который обводится в иерархию слоев? David Rönnqvist
Хорошее предложение, но я проверил его и слой формыинсульт все еще обнаруживается позади видас подвидом. Zev Eisenberg
На самом деле, ваш комментарий заставил меня задуматься о правильном пути, и я все понял. Я'выложу как ответ. Спасибо! Zev Eisenberg

Ваш Ответ

3   ответа
10

Зев Айзенбергответ правильный.

Хотя я предпочитаю:

[self.layer addSublayer:strokeLayer];

вместо создания и добавления подпредставления:

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];
36

Я понял новый способ думать об этом, благодаряДэвид Роnnqvist»комментарий.

Я пытался сделать закругление угла и обводку в одном слое. Вместо этого я разбил его на два слоя: один для маскировки вида.s слой, чтобы закруглить углы, а другой - добавить штрих.

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];
+ 100 отличных вещей DogCoffee
Что вы подразумеваете под необязательными границами? Zev Eisenberg
очень хорошо! Но могу ли я установить дополнительные границы с этим? Vishnu
0

Вот маленький код. Alloc инициирует просмотр и отправляет этому методу, чтобы скруглить углы. Вы можете по желанию закруглить любой из углов, которые вы хотите. Также придайте цвет тени.

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

Вызовите метод следующим образом.

[self setMaskTo:ABCView byRoundingCorners:UIRectCornerAllCorners withColor:[UIColor greenColor]];
Это работает для кого-нибудь? Не работает для меня .. Alexandre G

Похожие вопросы