top rounded radius only corners corner ios objective-c iphone xcode ipad

ios - rounded - corner radius only top swift



¿cómo configurar cornerRadius solo para la esquina inferior izquierda, inferior derecha e esquina superior izquierda de una UIView? (11)

¿Hay alguna manera de establecer cornerRadius solo en la esquina inferior izquierda, inferior derecha y esquina superior izquierda de UIView?

Intenté lo siguiente, pero terminó haciendo desaparecer la vista. ¿Hay algo mal con el código a continuación?

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;


En iOS 11, lo que solo necesitas son los enmascaradores.

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 }


Espero que esto te ayudará

su código anterior funciona perfectamente en mi máquina, puede ser que establezca CAShapeLayer marco igual a su marco de visión debido a que su vista desaparecerá pero no veo esta línea en su código, así que compruebe su propiedad de vista y aplique el código siguiente

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;


Puedes hacerlo así:

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;

Actualizar:
Si necesita borde, simplemente cree otro CAShapeLayer y agréguelo a la capa de la vista como subcapa. De esta manera (coloque este código debajo del código superior):

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

En swift 3.0 como este:

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


Sé que es muy tarde, pero solo creo un método donde puedes pasar solo uno o varios 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; }


Se le ha olvidado agregar UIRectCornerTopLeft. Por favor prueba este código:

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

Puede ser útil ...


Use una UIView personalizada e implemente el siguiente código

#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

Salida:

Mire las opciones de UIBezierPath.h :

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


use este radio de esquina de código de vista solo dos lados.después de mucho tiempo recibí sugerencia ios. aquí viewFilter es la salida de visualización que queremos redondear.

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


Configuración de radio de esquina para una vista en Swift

La creación y el enmascaramiento de capas deben ejecutarse dentro del bloque opcional drawRect() heredado de 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 }


Probado en xcode 8 y 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 } }

Y usa así

YourView.roundCorners([.topLeft, .bottomLeft], radius: 10)


Prueba este código

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

llamar usando

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

Opciones Disponibles:

UIRectCornerTopLeft, UIRectCornerTopRight,UIRectCornerBottomLeft,UIRectCornerBottomRight,UIRectCornerAllCorners


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;