CALayer: ajoute une bordure uniquement d’un côté

Je peux append une bordure à un calayer de cette manière:

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

Mais est-il possible d’append une bordure seulement d’un côté? Je n’ai besoin que d’une bordure en bas. Ou puis-je y accéder avec d’autres propriétés, par exemple frame, bounds, mask, …?

entrer la description de l'image ici

Merci de votre aide!


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

Jetez un coup d’oeil à la documentation CALayer: https://developer.apple.com/documentation/quartzcore/calayer

Et regardez ici: http://iosdevelopertips.com/cocoa/add-rounded-corners-and-border-to-uiwebview.html

J’ai fait une bordure droite en utilisant ceci:

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

Le moyen le plus simple est d’append un sous-calque qui dessine les bordures sélectives, mais il y a certaines choses à prendre en compte lorsque vous choisissez cette solution, les plus importantes étant de s’assurer que le sous-calque des bordures est toujours visible. cadre de votre couche.

J’ai mis en œuvre une solution open source permettant de résoudre ces problèmes et de vous permettre de déclarer des limites sélectives comme celles-ci:

 myView.borderDirection = AUIFlexibleBordersDirectionRight | AUIFlexibleBordersDirectionTop; 

Vous pouvez obtenir le code et en savoir plus ici

La propriété border ajoute toujours une bordure à 4 côtés de votre vue. Vous pouvez créer votre propre méthode de dessin pour dessiner la bordure au bas de votre vue.

Mais pourquoi ne pas simplement append une vue au-dessus de votre UIWebView pour qu’elle ressemble à une bordure?

Voici l’équivalent rapide

 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) 

Ma solution rapide Il implique quatre fonctions différentes, toutes des extensions à UIView. Chaque fonction ajoute une bordure différente.

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

Il y a une autre façon de le faire. CAShapeLayer possède des propriétés appelées ” strokeStart ” et ” strokeEnd “. En considérant que le trait part de 0 et se termine à 1 lorsqu’il revient à l’origine, complétant ainsi le chemin, vous pouvez définir les valeurs pour commencer et terminer pour dessiner la bordure d’un côté.

L’emplacement relatif auquel commencer à caresser le chemin. Animable La valeur de cette propriété doit être comprise entre 0,0 et 1,0. La valeur par défaut de cette propriété est 0.0. Combinée à la propriété strokeEnd, cette propriété définit la sous-région du chemin d’access au trait. La valeur de cette propriété indique le point relatif le long du chemin sur lequel commencer le tracé, tandis que la propriété strokeEnd définit le sharepoint fin. Une valeur de 0.0 représente le début du chemin tandis qu’une valeur de 1.0 représente la fin du chemin. Les valeurs intermédiaires sont interprétées linéairement le long de la longueur du chemin.

Exemple:

 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