Ma question porte sur le titre.
Je ne sais pas comment ajouter une bordure dans un côté spécifique, en haut ou en bas, n'importe quel côté... layer.border
dessine la bordure de la vue entière...
Ma question porte sur le titre.
Je ne sais pas comment ajouter une bordure dans un côté spécifique, en haut ou en bas, n'importe quel côté... layer.border
dessine la bordure de la vue entière...
Code pour la réponse sélectionnée, au cas où quelqu'un le voudrait.
REMARQUE : Cela ne fonctionne pas avec la mise en page automatique (c'est-à-dire la rotation du dispositif en paysage, etc.).
Définissez d'abord une épaisseur :
NSInteger borderThickness = 1;
Il suffit ensuite de copier et d'utiliser l'un ou l'autre de ces éléments pour définir la bordure que vous souhaitez.
Bordure supérieure
UIView *topBorder = [UIView new];
topBorder.backgroundColor = [UIColor lightGrayColor];
topBorder.frame = CGRectMake(0, 0, myView.frame.size.width, borderThickness);
[myView addSubview:topBorder];
Bordure inférieure
UIView *bottomBorder = [UIView new];
bottomBorder.backgroundColor = [UIColor lightGrayColor];
bottomBorder.frame = CGRectMake(0, myView.frame.size.height - borderThickness, myView.frame.size.width, borderThickness);
[myView addSubview:bottomBorder];
Bordure gauche
UIView *leftBorder = [UIView new];
leftBorder.backgroundColor = [UIColor lightGrayColor];
leftBorder.frame = CGRectMake(0, 0, borderThickness, myView.frame.size.height);
[myView addSubview:leftBorder];
Bordure droite
UIView *rightBorder = [UIView new];
rightBorder.backgroundColor = [UIColor lightGrayColor];
rightBorder.frame = CGRectMake(myView.frame.size.width - borderThickness, 0, borderThickness, myView.frame.size.height);
[myView addSubview:rightBorder];
Vieille question, mais la solution autolayout avec les ajustements des bordures au moment de l'exécution manque toujours.
borders(for: [.left, .bottom], width: 2, color: .red)
L'extension UIView suivante ajoutera la bordure uniquement sur les bords donnés. Si vous modifiez les bords au moment de l'exécution, les bordures s'adapteront en conséquence.
extension UIView {
func borders(for edges:[UIRectEdge], width:CGFloat = 1, color: UIColor = .black) {
if edges.contains(.all) {
layer.borderWidth = width
layer.borderColor = color.cgColor
} else {
let allSpecificBorders:[UIRectEdge] = [.top, .bottom, .left, .right]
for edge in allSpecificBorders {
if let v = viewWithTag(Int(edge.rawValue)) {
v.removeFromSuperview()
}
if edges.contains(edge) {
let v = UIView()
v.tag = Int(edge.rawValue)
v.backgroundColor = color
v.translatesAutoresizingMaskIntoConstraints = false
addSubview(v)
var horizontalVisualFormat = "H:"
var verticalVisualFormat = "V:"
switch edge {
case UIRectEdge.bottom:
horizontalVisualFormat += "|-(0)-[v]-(0)-|"
verticalVisualFormat += "[v(\(width))]-(0)-|"
case UIRectEdge.top:
horizontalVisualFormat += "|-(0)-[v]-(0)-|"
verticalVisualFormat += "|-(0)-[v(\(width))]"
case UIRectEdge.left:
horizontalVisualFormat += "|-(0)-[v(\(width))]"
verticalVisualFormat += "|-(0)-[v]-(0)-|"
case UIRectEdge.right:
horizontalVisualFormat += "[v(\(width))]-(0)-|"
verticalVisualFormat += "|-(0)-[v]-(0)-|"
default:
break
}
self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: horizontalVisualFormat, options: .directionLeadingToTrailing, metrics: nil, views: ["v": v]))
self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: verticalVisualFormat, options: .directionLeadingToTrailing, metrics: nil, views: ["v": v]))
}
}
}
}
}
Version Swift :
var myView = UIView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
myView.backgroundColor = UIColor.yellowColor()
var border = CALayer()
border.backgroundColor = UIColor.lightGrayColor()
border.frame = CGRect(x: 0, y: 0, width: myView.frame.width, height: 0.5)
myView.layer.addSublayer(border)
Edit : Pour les versions mises à jour vérifiez mon repo ici : https://github.com/goktugyil/EZSwiftExtensions/blob/master/Sources/UIViewExtensions.swift
Regardez les parties addBorder
Swift 4.2 et AutoLayout
J'ai passé en revue les solutions proposées. Beaucoup sont basées sur des cadres Voici une extension simple qui fonctionne avec AutoLayout - utiliser View au lieu de Layer pour s'assurer que nous pouvons utiliser AutoLayout - Une seule sous-vue avec 4 contraintes
Utilisez comme suit :
self.addBorder(.bottom, color: .lightGray, thickness: 0.5)
extension UIView {
func addBorder(_ edge: UIRectEdge, color: UIColor, thickness: CGFloat) {
let subview = UIView()
subview.translatesAutoresizingMaskIntoConstraints = false
subview.backgroundColor = color
self.addSubview(subview)
switch edge {
case .top, .bottom:
subview.leftAnchor.constraint(equalTo: self.leftAnchor, constant: 0).isActive = true
subview.rightAnchor.constraint(equalTo: self.rightAnchor, constant: 0).isActive = true
subview.heightAnchor.constraint(equalToConstant: thickness).isActive = true
if edge == .top {
subview.topAnchor.constraint(equalTo: self.topAnchor, constant: 0).isActive = true
} else {
subview.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: 0).isActive = true
}
case .left, .right:
subview.topAnchor.constraint(equalTo: self.topAnchor, constant: 0).isActive = true
subview.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: 0).isActive = true
subview.widthAnchor.constraint(equalToConstant: thickness).isActive = true
if edge == .left {
subview.leftAnchor.constraint(equalTo: self.leftAnchor, constant: 0).isActive = true
} else {
subview.rightAnchor.constraint(equalTo: self.rightAnchor, constant: 0).isActive = true
}
default:
break
}
}
}
import UIKit
extension UIView {
enum ViewSide {
case top
case left
case bottom
case right
}
func addBorders(to sides: [ViewSide], in color: UIColor, width: CGFloat) {
sides.forEach { addBorder(to: $0, in: color, width: width) }
}
func addBorder(to side: ViewSide, in color: UIColor, width: CGFloat) {
switch side {
case .top:
addTopBorder(in: color, width: width)
case .left:
addLeftBorder(in: color, width: width)
case .bottom:
addBottomBorder(in: color, width: width)
case .right:
addRightBorder(in: color, width: width)
}
}
func addTopBorder(in color: UIColor?, width borderWidth: CGFloat) {
let border = UIView()
border.backgroundColor = color
border.frame = CGRect(x: 0, y: 0, width: frame.size.width, height: borderWidth)
border.autoresizingMask = [.flexibleWidth, .flexibleBottomMargin]
addSubview(border)
}
func addBottomBorder(in color: UIColor?, width borderWidth: CGFloat) {
let border = UIView()
border.backgroundColor = color
border.frame = CGRect(x: 0, y: frame.size.height - borderWidth, width: frame.size.width, height: borderWidth)
border.autoresizingMask = [.flexibleWidth, .flexibleTopMargin]
addSubview(border)
}
func addLeftBorder(in color: UIColor?, width borderWidth: CGFloat) {
let border = UIView()
border.backgroundColor = color
border.frame = CGRect(x: 0, y: 0, width: borderWidth, height: frame.size.height)
border.autoresizingMask = [.flexibleHeight, .flexibleRightMargin]
addSubview(border)
}
func addRightBorder(in color: UIColor?, width borderWidth: CGFloat) {
let border = UIView()
border.backgroundColor = color
border.frame = CGRect(x: frame.size.width - borderWidth, y: 0, width: borderWidth, height: frame.size.height)
border.autoresizingMask = [.flexibleHeight, .flexibleLeftMargin]
addSubview(border)
}
}
Vous pouvez soit :
Exemple d'utilisation :
// Adding top border with 2 px in red
let myView = UIView()
myView.addBorder(to: .top, in: .red, width: 2)
(Vous pourriez peut-être lever une partie de l'ambiguïté qui découle de deux interfaces possibles et rendre les méthodes d'aide privées...). Je ne les supprimerais pas de là et ne déplacerais pas tous les cas vers la méthode principale car, de la façon dont je le vois, cela pourrait encombrer son corps).
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.