Подтвердить что ты не робот

Как нарисовать один округленный угол моего UIView.

Привет! Я хочу нарисовать округленный угол моего UIView. Только один, другие нельзя изменить.

4b9b3361

Ответ 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;
}