it-roy-ru.com

как установить cornerRadius только для нижнего левого, нижнего правого и верхнего левого угла UIView?

Есть ли способ установить cornerRadius только для нижнего левого, нижнего правого и верхнего левого угла UIView?

Я попробовал следующее, но в конечном итоге вид исчез. Что-то не так с кодом ниже?

    UIBezierPath *maskPath;
    maskPath = [UIBezierPath bezierPathWithRoundedRect:view.bounds byRoundingCorners:(UIRectCornerBottomLeft | UIRectCornerBottomRight) cornerRadii:CGSizeMake(20.0, 20.0)];
    CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
    maskLayer.path = maskPath.CGPath;
    view.layer.mask = maskLayer;
32
Siva

Вы можете сделать это так:

UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.viewOutlet.bounds byRoundingCorners:(UIRectCornerTopLeft | UIRectCornerBottomLeft | UIRectCornerBottomRight) cornerRadii:CGSizeMake(10.0, 10.0)];

CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
maskLayer.frame = self.view.bounds;
maskLayer.path  = maskPath.CGPath;
self.viewOutlet.layer.mask = maskLayer;

enter image description here

Обновление:
Если вам нужна граница, просто создайте еще одну CAShapeLayer и добавьте ее в слой просмотра как подслой. Вот так (поместите этот код ниже верхнего кода):

CAShapeLayer *borderLayer = [[CAShapeLayer alloc] init];
borderLayer.frame = self.view.bounds;
borderLayer.path  = maskPath.CGPath;
borderLayer.lineWidth   = 4.0f;
borderLayer.strokeColor = [UIColor blackColor].CGColor;
borderLayer.fillColor   = [UIColor clearColor].CGColor;

[self.viewOutlet.layer addSublayer:borderLayer];

enter image description here

В Swift 3.0 вот так:

let maskPath = UIBezierPath.init(roundedRect: self.viewOutlet.bounds, byRoundingCorners:[.topLeft, .bottomLeft], cornerRadii: CGSize.init(width: 10.0, height: 10.0))
let maskLayer = CAShapeLayer()
maskLayer.frame = self.viewOutlet.bounds
maskLayer.path = maskPath.cgPath
self.viewOutlet.layer.mask = maskLayer
130
Justin Boo

Проверено в xcode 8 и Swift 3

extension UIView {
    func roundCorners(corners:UIRectCorner, radius: CGFloat) {
      let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
      let mask = CAShapeLayer()
      mask.path = path.cgPath
      self.layer.mask = mask
    }
}

И использовать как это 

YourView.roundCorners([.topLeft, .bottomLeft], radius: 10)
15
Museer Ahamad Ansari

Используйте пользовательскую UIView и реализуйте приведенный ниже код

#import "CustomUIView.h"

@implementation CustomView

- (void)drawRect:(CGRect)rect
{
    // Drawing code
    CAShapeLayer * maskLayer = [CAShapeLayer layer];
    maskLayer.path = [UIBezierPath bezierPathWithRoundedRect: self.bounds byRoundingCorners: UIRectCornerTopLeft | UIRectCornerBottomLeft | UIRectCornerBottomRight cornerRadii: (CGSize){20.0, 20.0}].CGPath;

    self.layer.mask = maskLayer;
}

@end

Результат:

enter image description here

Посмотрите на параметры UIBezierPath.h:

typedef NS_OPTIONS(NSUInteger, UIRectCorner) {
    UIRectCornerTopLeft     = 1 << 0,
    UIRectCornerTopRight    = 1 << 1,
    UIRectCornerBottomLeft  = 1 << 2,
    UIRectCornerBottomRight = 1 << 3,
    UIRectCornerAllCorners  = ~0UL
};
8
Shamsudheen TK

Установка углового радиуса для вида в Swift

Создание и маскирование слоев должны выполняться внутри необязательного блока drawRect(), унаследованного от UIView

    override func drawRect(rect: CGRect) {
        super.drawRect(rect)

        let maskPath = UIBezierPath(roundedRect: self.view.bounds, byRoundingCorners: [.TopLeft, .BottomLeft, .BottomRight], cornerRadii: CGSizeMake(10, 10))
        let maskLayer = CAShapeLayer()
        maskLayer.frame = self.view.bounds
        maskLayer.path  = maskPath.CGPath
        self.view.layer.mask = maskLayer
    }
6
metpb

Я знаю, что уже очень поздно, но я просто создаю один метод, где вы можете передать только один или несколько UIRectCorners.

  [self setMaskTo:myView byRoundingCorners:(UIRectCornerTopLeft|UIRectCornerTopRight)];

- (void)setMaskTo:(UIView*)view byRoundingCorners:(UIRectCorner)corners
        {
            UIBezierPath *rounded = [UIBezierPath bezierPathWithRoundedRect:view.bounds
                                                          byRoundingCorners:corners
                                                                cornerRadii:CGSizeMake(8.0, 8.0)];
            CAShapeLayer *shape = [[CAShapeLayer alloc] init];
            [shape setPath:rounded.CGPath];
            view.layer.mask = shape;
    }
4
Siddhesh Mahadeshwar

надеюсь, что это поможет вам

ваш приведенный выше код отлично работает на моем компьютере, возможно, вы установили CAShapeLayer frame равным вашему фрейму просмотра, из-за которого ваш вид исчезнет, ​​но я не вижу эту строку в вашем коде, поэтому проверьте свойство вашего вида и примените приведенный ниже код 

  UIBezierPath *maskPath;
    maskPath = [UIBezierPath bezierPathWithRoundedRect:viewName.bounds
                                     byRoundingCorners:(UIRectCornerBottomLeft | UIRectCornerBottomRight |UIRectCornerTopLeft)
                                           cornerRadii:CGSizeMake(20.0, 20.0)];
    CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
    maskLayer.frame =viewName.bounds; 
    maskLayer.path = maskPath.CGPath;
   viewName.layer.mask = maskLayer;
3
Anurag Bhakuni

используйте этот код угловой радиус зрения только с двух сторон. после долгого времени я получил предложение IOS. здесь viewFilter - это представление, которое мы хотим округлить.

-(void) viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
[self setMaskTo:viewFilter byRoundingCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight];
}

-(void)setMaskTo:(UIView*)view byRoundingCorners:(UIRectCorner)corners{

UIBezierPath *rounded = [UIBezierPathbezierPathWithRoundedRect:view.bounds byRoundingCorners:corners cornerRadii:CGSizeMake(20.0, 20.0)];

CAShapeLayer *shape = [[CAShapeLayer alloc] init];
shape.frame = self.view.bounds;
[shape setPath:rounded.CGPath];
view.layer.mask = shape;
}
0
Maulik Patel

На iOS 11 вам нужны только маскированные углы.

    let cornerRadius: CGFloat = 6.0
    if #available(iOS 11, *) {
        productImageView.layer.cornerRadius  = cornerRadius
        productImageView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]

    } else {
        let path        = UIBezierPath(roundedRect: bounds, byRoundingCorners: [.topLeft , .topRight], cornerRadii:CGSize(width: cornerRadius, height: cornerRadius))
        let maskLayer   = CAShapeLayer()
        maskLayer.frame = bounds
        maskLayer.path  = path.cgPath
        productImageView.mask                = maskLayer
        productImageView.layer.masksToBounds = true
    }
0
Den
UIBezierPath *maskPath;
maskPath = [UIBezierPath bezierPathWithRoundedRect:someView.bounds 
                             byRoundingCorners:(UIRectCornerTopLeft|UIRectCornerTopRight|UIRectCornerBottomLeft|UIRectCornerBottomRight) 
                                   cornerRadii:CGSizeMake(10.0,10.0,5.0, 10.0)];


CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
maskLayer.frame = self.bounds;
maskLayer.path = maskPath.CGPath;
someView.layer.mask = maskLayer;
0
Vijay Rathod

Попробуйте этот код

-(void)setMaskTo:(UIView*)view byRoundingCorners:(UIRectCorner)corners {
    UIBezierPath* rounded = [UIBezierPath bezierPathWithRoundedRect:view.bounds byRoundingCorners:corners cornerRadii:CGSizeMake(10.0, 10.0)];
    CAShapeLayer* shape = [[CAShapeLayer alloc] init];
    [shape setPath:rounded.CGPath];
    view.layer.mask = shape;
}

звонить с помощью

[self setMaskTo:myView byRoundingCorners:UIRectCornerTopLeft|UIRectCornerTopRight];

Доступные Варианты:

UIRectCornerTopLeft, UIRectCornerTopRight,UIRectCornerBottomLeft,UIRectCornerBottomRight,UIRectCornerAllCorners
0
Hardik Thakkar