CALayer: agregue un borde solo en un lado

Puedo agregar un borde a un CALayer de esta manera:

[webView.layer setBorderColor: [[UIColor colorWithRed:0.6 green:0.7 blue:0.2 alpha:1] CGColor]]; [webView.layer setBorderWidth: 2.75]; 

¿Pero es posible agregar un borde solo en un lado? Solo necesito un borde en la parte inferior. ¿O puedo llegar a esto con otras propiedades, por ejemplo, marco, límites, máscara, …?

enter image description here

¡Gracias por tu ayuda!


@ Control-V

  UIWebView *webView = [[UIWebView alloc] init]; CALayer *webViewLayer = webView.layer; // now you can do a lot of stuff like borders: [webViewLayer setBorderColor: [[UIColor greenColor] CGColor]]; [webViewLayer setBorderWidth: 2.75]; 

Eche un vistazo a la documentación de CALayer: https://developer.apple.com/documentation/quartzcore/calayer

Y mira aquí: http://iosdevelopertips.com/cocoa/add-rounded-corners-and-border-to-uiwebview.html

Hice un borde derecho usando esto:

 leftScrollView.clipsToBounds = YES; CALayer *rightBorder = [CALayer layer]; rightBorder.borderColor = [UIColor darkGrayColor].CGColor; rightBorder.borderWidth = 1; rightBorder.frame = CGRectMake(-1, -1, CGRectGetWidth(leftScrollView.frame), CGRectGetHeight(leftScrollView.frame)+2); [leftScrollView.layer addSublayer:rightBorder]; 

La forma más sencilla es agregar un subenvasador que dibuje los bordes selectivos, pero hay algunas cosas que se deben tener en cuenta al elegir esta solución, las más importantes son asegurarse de que el subportador de bordes esté siempre en la parte superior y que los bordes cambien cuando se cambie el marco de tu capa.

Implementé una caída en la solución de código abierto que se ocupa de esos problemas y le permite declarar fronteras selectivas como esta:

 myView.borderDirection = AUIFlexibleBordersDirectionRight | AUIFlexibleBordersDirectionTop; 

Puedes obtener el código y leer sobre él un poco más aquí

La propiedad de borde siempre agrega borde a 4 lados de su vista. Puede hacer su propio método de dibujo para dibujar el borde en la parte inferior de su vista.

Pero, ¿por qué no agregas una vista encima de tu UIWebView para que parezca un borde?

Aquí está el equivalente rápido

 leftScrollView.clipsToBounds = true let rightBorder: CALayer = CALayer() rightBorder.borderColor = UIColor.darkGrayColor().CGColor rightBorder.borderWidth = 1 rightBorder.frame = CGRectMake(-1, -1, CGRectGetWidth(leftScrollView.frame), CGRectGetHeight(leftScrollView.frame)+2) leftScrollView.layer.addSublayer(rightBorder) 

Mi solución Swift. Incluye cuatro funciones diferentes, todas las extensiones de UIView. Cada función agrega un borde diferente.

 extension UIView { @discardableResult func addRightBorder(color: UIColor, width: CGFloat) -> UIView { let layer = CALayer() layer.borderColor = color.cgColor layer.borderWidth = width layer.frame = CGRect(x: self.frame.size.width-width, y: 0, width: width, height: self.frame.size.height) self.layer.addSublayer(layer) return self } @discardableResult func addLeftBorder(color: UIColor, width: CGFloat) -> UIView { let layer = CALayer() layer.borderColor = color.cgColor layer.borderWidth = width layer.frame = CGRect(x: 0, y: 0, width: width, height: self.frame.size.height) self.layer.addSublayer(layer) return self } @discardableResult func addTopBorder(color: UIColor, width: CGFloat) -> UIView { let layer = CALayer() layer.borderColor = color.cgColor layer.borderWidth = width layer.frame = CGRect(x: 0, y: 0, width: self.frame.size.width, height: width) self.layer.addSublayer(layer) return self } @discardableResult func addBottomBorder(color: UIColor, width: CGFloat) -> UIView { let layer = CALayer() layer.borderColor = color.cgColor layer.borderWidth = width layer.frame = CGRect(x: 0, y: self.frame.size.height-width, width: self.frame.size.width, height: width) self.layer.addSublayer(layer) return self } } 

Hay otra forma de hacer esto. El CAShapeLayer tiene propiedades llamadas ” strokeStart ” y ” strokeEnd “. Teniendo en cuenta que la caricia comienza desde 0 y termina en 1 cuando llega al origen, completando así la ruta, puede establecer valores para comenzar y finalizar para dibujar el borde en un lado.

La ubicación relativa en la que comenzar a acariciar el camino. Animable. El valor de esta propiedad debe estar en el rango de 0.0 a 1.0. El valor predeterminado de esta propiedad es 0.0. Combinado con la propiedad strokeEnd, esta propiedad define la subregión de la ruta al trazo. El valor en esta propiedad indica el punto relativo a lo largo de la ruta en el que comenzar a acariciar, mientras que la propiedad strokeEnd define el punto final. Un valor de 0.0 representa el comienzo de la ruta, mientras que un valor de 1.0 representa el final de la ruta. Los valores intermedios se interpretan linealmente a lo largo de la ruta.

Ejemplo:

 let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius)) let mask = CAShapeLayer() mask.path = path.CGPath mask.strokeColor = UIColor.redColor().CGColor mask.strokeStart = 0.45 mask.strokeEnd = 0.92 self.layer.mask = mask