Как мне закруглить только два верхних угла UILabel?

Я знаю, что в iOS 3.0+ я могу использовать

 label.layer.cornerRadius = xxx;

округлить все четыре угла UILabel (как подкласс UIView), но я хочу округлить только два верхних угла метки и оставить нижние углы прямоугольными.

Есть ли способ сделать это с помощью UILabel? Другие решения предполагают пользовательский UIView, а не UILabel.

Ответы на вопрос(3)

UILabel и его слоев, но не смог найти никакого способа сделать это с помощью средств, предоставленных iOS.

Вы могли бы сделать одну вещь, создатьUIView и применить закругленные углы к нему. Теперь добавьтеUILabel в качестве подпредставления к этому UIView и расположите его таким образом, чтобы нижние 2 закругленных угла были покрыты меткой. Таким образом, вы получите нужный эффект ...

 Srikar Appalaraju27 янв. 2012 г., 15:14
конечно, это дано. в противном случае рассказ легко виден ...
 chatur27 янв. 2012 г., 15:13
и убедитесь, что UIView и UILabel имеют одинаковый цвет.
Решение Вопроса

используя CALayers и маски

CAShapeLayer *maskLayer = [CAShapeLayer layer];
maskLayer.path = maskPath.CGPath;
label.layer.mask = maskLayer;

где maskPath - это UIBezierPath, настроенный с использованиемbezierPathWithRoundedRect:byRoundingCorners:cornerRadii

 Anand30 янв. 2012 г., 09:29
принял этот ответ, так как я не хотел использовать дополнительный вид здесь. Я использую два наложенных слоя с округленным нижним слоем, а верхний - только с двумя верхними углами. Чтобы дать этот эффектicons.iconarchive.com/icons/walrick/openphone/256/...
 wattson1228 янв. 2012 г., 13:24
@ И правильно, отредактировано
 Anand28 янв. 2012 г., 10:45
я думаю, что это должно быть label.layer.mask = maskLayer
 Srikar Appalaraju27 янв. 2012 г., 15:22
круто, узнал новый подход ...

что выложу полный код с включенным BezierPath.

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

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

label.layer.mask = maskLayer;

Для Swift 4.0:

let bounds: CGRect = label.bounds
let maskPath = UIBezierPath(roundedRect: bounds, byRoundingCorners: ([.topLeft, .topRight]), cornerRadii: CGSize(width: 5.0, height: 5.0))
let maskLayer = CAShapeLayer()
maskLayer.frame = bounds
maskLayer.path = maskPath.cgPath
label.layer.mask = maskLayer
 R. Mohan03 дек. 2018 г., 08:38
Спасибо, это работает нормально :)

Ваш ответ на вопрос