Привет! Я хочу нарисовать округленный угол моего UIView
. Только один, другие нельзя изменить.
Как нарисовать один округленный угол моего UIView.
Ответ 1
Начиная с iOS 3.2, вы можете использовать функциональные возможности UIBezierPath
для создания прямоугольного прямоугольного прямоугольника (в котором только углы, которые вы указываете, закруглены). Затем вы можете использовать это как путь к CAShapeLayer
и использовать его как маску для своего слоя вида:
// Create the path (with only the top-left corner rounded)
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:imageView.bounds
byRoundingCorners:UIRectCornerTopLeft
cornerRadii:CGSizeMake(10.0, 10.0)];
// Create the shape layer and set its path
CAShapeLayer *maskLayer = [CAShapeLayer layer];
maskLayer.frame = imageView.bounds;
maskLayer.path = maskPath.CGPath;
// Set the newly created shape layer as the mask for the image view layer
imageView.layer.mask = maskLayer;
И что он - не вмешивается вручную, определяя фигуры в Core Graphics, не создавая маскирующие изображения в Photoshop. Слой даже не требует аннулирования. Применение округленного угла или переход в новый угол так же просто, как определение нового UIBezierPath
и использование его CGPath
в качестве пути слоя маски. Параметр corners
метода bezierPathWithRoundedRect:byRoundingCorners:cornerRadii:
является битовой маской, поэтому множество углов можно закруглять, объединяя их вместе.
ПРИМЕЧАНИЕ. Маски слоя не будут отображаться при использовании в сочетании с методом визуализации CALayer renderInContext. Если вам нужно использовать это, попробуйте округлить углы следующим образом: Только два закругленных угла?.
Ответ 2
Я сделал метод ответа StuDev:
+ (CAShapeLayer *) roundedCornerOnImage: (UIImageView *)imageView onCorner: (UIRectCorner)rectCorner
{
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:imageView.bounds
byRoundingCorners:rectCorner
cornerRadii:CGSizeMake(10.0, 10.0)];
CAShapeLayer *maskLayer = [CAShapeLayer layer];
maskLayer.frame = imageView.bounds;
maskLayer.path = maskPath.CGPath;
return maskLayer;
}
Пример использования в представлении изображения в UITableViewCell:
if (indexPath.row == 0)
cell.imageView.layer.mask = [Helper roundedCornerOnImage:cell.imageView onCorner:UIRectCornerTopLeft];
else if (indexPath.row == self.arrayPeople.count - 1)
cell.imageView.layer.mask = [Helper roundedCornerOnImage:cell.imageView onCorner:UIRectCornerBottomLeft];
Благодаря StuDev для отличного решения!
Ответ 3
+ (CAShapeLayer *) roundedCornerOnImage: (UIImageView *)imageView onCorner: (UIRectCorner)rectCorner
{
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:imageView.bounds
byRoundingCorners:rectCorner
cornerRadii:CGSizeMake(10.0, 10.0)];
CAShapeLayer *maskLayer = [CAShapeLayer layer];
maskLayer.frame = imageView.bounds;
maskLayer.path = maskPath.CGPath;
imageView.layer.mask=maskLayer
return maskLayer;
}
if (indexPath.row == 0)
[Helper roundedCornerOnImage:cell.imageView onCorner:UIRectCornerTopLeft];
else if (indexPath.row == self.arrayPeople.count - 1)
[Helper roundedCornerOnImage:cell.imageView onCorner:UIRectCornerBottomLeft];
Обновленный ответ выше, вам не нужно возвращать и управлять этим. Это можно сделать в этой функции.
Ответ 4
Я сделал функцию для создания радиуса пользовательского угла после выполнения небольшого R & D следующим образом:
+(void)setConerRadiusForTopLeft:(BOOL)isForTopLeft ForTopRight:(BOOL)isForTopRight ForBottomLeft:(BOOL)isForBottomLeft ForBottomRight:(BOOL)isForBottomRight withCornerRadius:(float)cornerRadius forView:(UIView *)view
{
UIRectCorner corners = (isForTopLeft ? UIRectCornerTopLeft : 0) |
(isForTopRight ? UIRectCornerTopRight : 0) |
(isForBottomLeft ? UIRectCornerBottomLeft : 0) |
(isForBottomRight ? UIRectCornerBottomRight : 0);
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:view.bounds
byRoundingCorners:corners
cornerRadii:CGSizeMake(cornerRadius, cornerRadius)];
CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
maskLayer.frame = view.bounds;
maskLayer.path = maskPath.CGPath;
view.layer.mask = maskLayer;
}