Comment ajouter une bordure juste en haut d'un UIView
144
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, de n'importe quel côté ...
layer.borderdessine la bordure pour toute la vue ...
Je considère ici un sous UIView-classement et une drawRectsurpuissance. Pourquoi ne pas ajouter une extension UIViewet ajouter des sous-vues de bordure?
@discardableResult
func addBorders(edges:UIRectEdge,
color:UIColor,
inset:CGFloat=0.0,
thickness:CGFloat=1.0)->[UIView]{
var borders =[UIView]()@discardableResult
func addBorder(formats:String...)->UIView{
let border =UIView(frame:.zero)
border.backgroundColor = color
border.translatesAutoresizingMaskIntoConstraints =false
addSubview(border)
addConstraints(formats.flatMap {NSLayoutConstraint.constraints(withVisualFormat: $0,
options:[],
metrics:["inset": inset,"thickness": thickness],
views:["border": border])})
borders.append(border)return border}if edges.contains(.top)|| edges.contains(.all){
addBorder(formats:"V:|-0-[border(==thickness)]","H:|-inset-[border]-inset-|")}if edges.contains(.bottom)|| edges.contains(.all){
addBorder(formats:"V:[border(==thickness)]-0-|","H:|-inset-[border]-inset-|")}if edges.contains(.left)|| edges.contains(.all){
addBorder(formats:"V:|-inset-[border]-inset-|","H:|-0-[border(==thickness)]")}if edges.contains(.right)|| edges.contains(.all){
addBorder(formats:"V:|-inset-[border]-inset-|","H:[border(==thickness)]-0-|")}return borders}// Usage:
view.addBorder(edges:[.all])// All with default arguments
view.addBorder(edges:[.top], color:.green)// Just Top, green, default thickness
view.addBorder(edges:[.left,.right,.bottom], color:.red, thickness:3)// All except Top, red, thickness 3
Avec ce code, vous n'êtes pas non plus lié à votre sous-classe, vous pouvez l'appliquer à tout ce qui hérite de UIView- réutilisable dans votre projet, et tout autre. Passez d'autres arguments à vos méthodes pour définir d'autres couleurs et largeurs. De nombreuses options.
Le seul inconvénient ici est qu'il ne peut pas être redimensionné.
Peter DeWeese
2
Pourrait utiliser un UIView et ajouter des contraintes de mise en page automatique. Même principe.
Adam Waite
1
@PeterDeWeese Ce n'est pas non plus un inconvénient - si vous voulez contrôler la taille de la bordure, tout ce que vous avez à faire est quelque chose comme: - (void) addUpperBorderWithSize: (CGFloat) size Et puis remplacez la constante par un paramètre dans la fonction . Il en va de même pour d'autres paramètres tels que les couleurs.
o.shnn
1
@AdamWaite, cette variante de mise en page automatique a l'air très bien. Je vous remercie !
manonthemoon
2
Merci pour le partage, je crée une version d'Objective-C avec contrainte de mise en page automatique ici .
Itachi
99
Ajout de la capacité des coins arrondis au message original d'Adam Waite et des multiples modifications
Important!: N'oubliez pas d'ajouter « label.layoutIfNeeded()» juste avant d'appeler «addborder» comme indiqué précédemment
Avez-vous de la chance pour l'implémenter dans Swift 3?
Marquavious Draggon
7
Pour que cela fonctionne, vous devez ajouter view.layoutIfNeeded()juste avant d'appeler view.layer.addBorder(...). Ensuite, cela fonctionne dans Swift 3
Adam Studenic
ça marche bien. ajouter la ligne dans cette méthodeoverride func viewDidLayoutSubviews()
Antony Raphel
60
Le meilleur moyen pour moi est une catégorie sur UIView, mais adding viewsau lieu de CALayers, nous pouvons donc nous take advantage of AutoresizingMasksassurer que les bordures sont redimensionnées avec le superview.
C'est de loin l'une des meilleures solutions à ce problème. La plupart des autres solutions proposées ne respectent PAS les changements de vue (et donc la rotation de l'appareil ou les vues fractionnées). Celui-ci le fait.
Womble
1
comment l'adapter pour supporter les coins arrondis?
Cela ne fonctionne pas lorsque la vue est redimensionnée, par exemple lors d'un changement d'orientation.
Nestor
Si vous utilisez une mise en page basée sur des cadres, vous devez implémenter layoutSubviews et recalculer tous les cadres de sous-vue (ou sous-couche) là
trappeur
22
Sous UIView- classe et implémentation drawRect:dans votre sous-classe, par exemple:
Cela trace une ligne rouge de 2 pixels comme bordure supérieure. Toutes les autres variantes que vous mentionnez sont laissées comme un exercice trivial pour le lecteur.
Est-ce le seul moyen pour cela ??? Donc, si j'ai besoin de faire une vue avec une bordure supérieure, et une autre vue avec une bordure inférieure, et une autre vue ... Je veux dire toujours une vue spécifique avec une bordure, ou deux, je devrai créer une sous-classe pour chaque cas spécifique ??? Je ne sais pas si c'est vraiment sympa de créer une classe juste pour ajouter des bordures ...
manonthemoon
1
Pensez-y. Votre UIViewsous-classe peut avoir une propriété qui détermine les bordures drawRect:dessinées. Cette propriété peut être définie avec NS_OPTIONSafin qu'elle définisse un masque de bits comme le UIViewAutoresizingmasque de bits. Si - pour une raison quelconque - vous vous UIViewopposez vraiment fortement au sous- classement, ajoutez simplement une petite sous-vue de 1 à 2 pixels de haut (ou de large) et donnez-lui les dimensions que vous souhaitez simuler une bordure.
Solution simple ... avec une surcharge UIView par rapport à CALayer nu
Soberman
après avoir lu toutes les autres solutions, je pensais que j'ajouterais simplement une petite vue. Tout cela fonctionne pour une frontière! Cette solution ne nécessite que quelques broches pour fonctionner également dans la mise en page automatique. Beaucoup plus facile de se faire la tête.
noobsmcgoobs
Merci, j'ai ajouté une note ci-dessus afin que les codeurs ne l'utilisent que si leur application ne tourne pas.
Travis M.
15
Ancienne question, mais la solution de mise en page automatique avec les ajustements de bordure d'exécution est toujours absente.
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 lors de l'exécution, les bordures s'ajusteront 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 {caseUIRectEdge.bottom:
horizontalVisualFormat +="|-(0)-[v]-(0)-|"
verticalVisualFormat +="[v(\(width))]-(0)-|"caseUIRectEdge.top:
horizontalVisualFormat +="|-(0)-[v]-(0)-|"
verticalVisualFormat +="|-(0)-[v(\(width))]"caseUIRectEdge.left:
horizontalVisualFormat +="|-(0)-[v(\(width))]"
verticalVisualFormat +="|-(0)-[v]-(0)-|"caseUIRectEdge.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]))}}}}}
J'ai parcouru les solutions proposées. Beaucoup sont basés sur des cadres Il s'agit d'une simple extension qui fonctionne avec AutoLayout - utilisez View au lieu de Layer pour vous assurer que nous pouvons utiliser AutoLayout - Sous-vue unique avec 4 contraintes
J'ai pris les réponses d'Adam Waite et de Paul et les ai combinées. J'ai également ajouté la possibilité de canaliser les arêtes sélectionnées ensemble, vous n'avez donc besoin d'appeler qu'une seule fonction comme ceci:
En m'appuyant sur la réponse de NSBum , j'ai adopté une approche similaire et créé cette sous-classe UIView simple afin qu'elle fonctionne dans Interface Builder et fonctionne avec des contraintes: lien github
En utilisant CGContextFillRect au lieu de CGContextStrokePath, j'ai pu de manière prévisible garder les lignes complètement solides et à l'intérieur les limites de la vue.
- En gros, déposez simplement un UIView dans Interface Builder et changez son type de classe en NAUIViewWithBorders.
- Ensuite, dans viewDidLoad de votre VC, faites quelque chose comme:
/* For a top border only ———————————————- */
self.myBorderView.borderColorTop =[UIColor redColor];
self.myBorderView..borderWidthsAll =1.0f;/* For borders with different colors and widths ————————— */
self.myBorderView.borderWidths =UIEdgeInsetsMake(2.0,4.0,6.0,8.0);
self.myBorderView.borderColorTop =[UIColor blueColor];
self.myBorderView.borderColorRight =[UIColor redColor];
self.myBorderView.borderColorBottom =[UIColor greenColor];
self.myBorderView.borderColorLeft =[UIColor darkGrayColor];
Voici un lien direct vers le fichier .m afin que vous puissiez voir l'implémentation. Il existe également un projet de démonstration. J'espère que cela aide quelqu'un :)
Voici une solution simple. Ajoutez une étiquette sur votre UIView, effacez le texte sur l'étiquette et définissez la couleur d'arrière-plan de l'étiquette pour qu'elle soit votre couleur de bordure. Définissez l'origine (x,y)de votre étiquette comme étant l'origine (x,y)de votre vue. et définissez la largeur de l'étiquette sur la largeur de votre UIView, définissez la hauteur sur 1 ou 2 (pour la hauteur de votre bordure en haut de votre UIView). Et cela devrait faire l'affaire.
Cela ne répond pas vraiment à la question d'ajouter uniquement la bordure supérieure d'un uiview. Il s'agit d'une solution rapide qui ne fonctionnerait probablement pas pour des problèmes plus complexes.
Appelera-t-il «addSublayer» chaque fois que la mise en page sera mise à jour?
parJeevan le
1
Publiez simplement ici pour aider quelqu'un qui cherche à ajouter des bordures J'ai apporté quelques modifications à la réponse acceptée ici, étiquette rapide seulement bordure gauche . Largeur modifiée en cas UIRectEdge.Topde CGRectGetHeight(self.frame)à CGRectGetWidth(self.frame)et en cas UIRectEdge.Bottomde UIScreen.mainScreen().bounds.widthàCGRectGetWidth(self.frame) pour obtenir les bordures correctement. Utilisation de Swift 2.
Inspiré par @Addison, j'ai réécrit l'extension sans utiliser de framework tiers, car il utilisait SnapKit et CocoaLumberjack.
Comme dans l'approche @Addisons, je supprime également les bordures précédemment ajoutées, cette implémentation devrait donc bien fonctionner avec des vues réutilisables en tant que cellules de tableau et cellules de collection.
fileprivate classBorderView:UIView{}// dummy class to help us differentiate among border views and other views// to enabling us to remove existing borders and place new ones
extension UIView{
func setBorders(toEdges edges:[UIRectEdge], withColor color:UIColor, inset:CGFloat=0, thickness:CGFloat){// Remove existing edgesfor view in subviews {if view is BorderView{
view.removeFromSuperview()}}// Add new edgesif edges.contains(.all){
addSidedBorder(toEdge:[.left,.right,.top,.bottom], withColor: color, inset: inset, thickness: thickness)}if edges.contains(.left){
addSidedBorder(toEdge:[.left], withColor: color, inset: inset, thickness: thickness)}if edges.contains(.right){
addSidedBorder(toEdge:[.right], withColor: color, inset: inset, thickness: thickness)}if edges.contains(.top){
addSidedBorder(toEdge:[.top], withColor: color, inset: inset, thickness: thickness)}if edges.contains(.bottom){
addSidedBorder(toEdge:[.bottom], withColor: color, inset: inset, thickness: thickness)}}private func addSidedBorder(toEdge edges:[RectangularEdges], withColor color:UIColor, inset:CGFloat=0, thickness:CGFloat){for edge in edges {
let border =BorderView(frame:.zero)
border.backgroundColor = color
addSubview(border)
border.translatesAutoresizingMaskIntoConstraints =falseswitch edge {case.left:NSLayoutConstraint.activate([
border.leftAnchor.constraint(equalTo: self.leftAnchor, constant: inset),
border.topAnchor.constraint(equalTo: self.topAnchor, constant: inset),
border.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant:-inset),NSLayoutConstraint(item: border, attribute:.width, relatedBy:.equal, toItem: nil, attribute:.width, multiplier:1, constant: thickness)])case.right:NSLayoutConstraint.activate([
border.rightAnchor.constraint(equalTo: self.rightAnchor, constant:-inset),
border.topAnchor.constraint(equalTo: self.topAnchor, constant: inset),
border.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant:-inset),NSLayoutConstraint(item: border, attribute:.width, relatedBy:.equal, toItem: nil, attribute:.width, multiplier:1, constant: thickness)])case.top:NSLayoutConstraint.activate([
border.leftAnchor.constraint(equalTo: self.leftAnchor, constant: inset),
border.rightAnchor.constraint(equalTo: self.rightAnchor, constant:-inset),
border.topAnchor.constraint(equalTo: self.topAnchor, constant: inset),NSLayoutConstraint(item: border, attribute:.height, relatedBy:.equal, toItem: nil, attribute:.height, multiplier:1, constant: thickness)])case.bottom:NSLayoutConstraint.activate([
border.leftAnchor.constraint(equalTo: self.leftAnchor, constant: inset),
border.rightAnchor.constraint(equalTo: self.rightAnchor, constant:-inset),
border.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant:-inset),NSLayoutConstraint(item: border, attribute:.height, relatedBy:.equal, toItem: nil, attribute:.height, multiplier:1, constant: thickness)])}}}privateenumRectangularEdges{case left
case right
case top
case bottom
}}
Si je construis à partir du storyboard, je préfère ajouter un UIViewderrière mon utile UIView... Si je veux créer une bordure sur le dessus de mon UIView, j'augmente simplement la hauteur de l'arrière-plan UIViewde ma largeur de bordure .. La même chose peut être fait pour tout autre côté :)
Personnellement, j'aime le sous-classement de la vue + drawRect, mais voici juste une autre façon de procéder (et cela fonctionne en quelque sorte dans le même sens que la réponse acceptée par @If Pollavith):
Votre nouveau calque de bordure peut être configuré pour avoir les dimensions que vous souhaitez. Ainsi, comme @Si la réponse de Pollavith, vous créez un calque aussi haut que vous le souhaitez et aussi large que la vue que vous souhaitez encadrer. Utilisez la définition de cadre du calque pour le placer où vous le souhaitez, puis ajoutez-le en tant que sous-calque à votre vue.
Pour référence, ma propre exigence était de mettre une bordure sur le côté GAUCHE de la vue (veuillez ne pas couper et coller ce code et dis-moi juste parce qu'il ne met pas de bordure en haut de la vue - modifier le code ci-dessous est assez simple):
En plus de n8tr peut ajouter qu'il existe une disponibilité pour les définir à partir du storyboard soit:
- ajouter deux propriétés comme borderColoret borderWidthdans le fichier .h;
- alors vous pouvez ajouter keyPathsdirectement dans le storyboard, voir le lien vers la capture d' écran
Remarque: la plupart des solutions ici ne sont pas adaptatives et ne seront pas redimensionnées. Les solutions qui seront redimensionnées auront un impact énorme sur votre temps de démarrage car elles utilisent beaucoup de CPU.
Vous pouvez utiliser cette solution ci-dessous. Il fonctionne sur UIBezierPaths qui sont plus légers que les couches, ce qui entraîne des temps de démarrage rapides. Il est facile à utiliser, voir les instructions ci-dessous.
Réponses:
Je considère ici un sous
UIView
-classement et unedrawRect
surpuissance. Pourquoi ne pas ajouter une extensionUIView
et ajouter des sous-vues de bordure?Avec ce code, vous n'êtes pas non plus lié à votre sous-classe, vous pouvez l'appliquer à tout ce qui hérite de
UIView
- réutilisable dans votre projet, et tout autre. Passez d'autres arguments à vos méthodes pour définir d'autres couleurs et largeurs. De nombreuses options.la source
Ajout de la capacité des coins arrondis au message original d'Adam Waite et des multiples modifications
Important!: N'oubliez pas d'ajouter «
label.layoutIfNeeded()
» juste avant d'appeler «addborder» comme indiqué précédemmentRemarque: je n'ai testé cela que sur
UILabels
.la source
view.layoutIfNeeded()
juste avant d'appelerview.layer.addBorder(...)
. Ensuite, cela fonctionne dans Swift 3override func viewDidLayoutSubviews()
Le meilleur moyen pour moi est une catégorie sur UIView, mais
adding views
au lieu de CALayers, nous pouvons donc noustake advantage of AutoresizingMasks
assurer que les bordures sont redimensionnées avec le superview.Objectif c
Swift 5
la source
Swift 3.0
Swift 4.1
la source
Sous
UIView
- classe et implémentationdrawRect:
dans votre sous-classe, par exemple:Objectif c
Swift 4
Cela trace une ligne rouge de 2 pixels comme bordure supérieure. Toutes les autres variantes que vous mentionnez sont laissées comme un exercice trivial pour le lecteur.
Le guide de programmation Quartz 2D est recommandé.
la source
UIView
sous-classe peut avoir une propriété qui détermine les borduresdrawRect:
dessinées. Cette propriété peut être définie avecNS_OPTIONS
afin qu'elle définisse un masque de bits comme leUIViewAutoresizing
masque de bits. Si - pour une raison quelconque - vous vousUIView
opposez vraiment fortement au sous- classement, ajoutez simplement une petite sous-vue de 1 à 2 pixels de haut (ou de large) et donnez-lui les dimensions que vous souhaitez simuler une bordure.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 (alias, rotation de l'appareil en paysage, etc.).
Définissez d'abord une épaisseur:
Ensuite, copiez simplement, utilisez tout ou partie de ces éléments pour définir la bordure que vous souhaitez définir.
Bordure supérieure
Bordure inférieure
Bordure gauche
Bordure droite
la source
Ancienne question, mais la solution de mise en page automatique avec les ajustements de bordure d'exécution est toujours absente.
L'extension UIView suivante ajoutera la bordure uniquement sur les bords donnés. Si vous modifiez les bords lors de l'exécution, les bordures s'ajusteront en conséquence.
la source
Version Swift:
Edit: Pour les versions mises à jour, vérifiez mon dépôt ici: https://github.com/goktugyil/EZSwiftExtensions/blob/master/Sources/UIViewExtensions.swift
Regardez les parties addBorder
la source
Swift 4.2 et AutoLayout
J'ai parcouru les solutions proposées. Beaucoup sont basés sur des cadres Il s'agit d'une simple extension qui fonctionne avec AutoLayout - utilisez View au lieu de Layer pour vous assurer que nous pouvons utiliser AutoLayout - Sous-vue unique avec 4 contraintes
Utilisez comme suit:
la source
J'ai pris les réponses d'Adam Waite et de Paul et les ai combinées. J'ai également ajouté la possibilité de canaliser les arêtes sélectionnées ensemble, vous n'avez donc besoin d'appeler qu'une seule fonction comme ceci:
ou alors:
Ce que vous devez implémenter est une catégorie sur UIView comme suggéré dans d'autres réponses avec l'implémentation suivante:
la source
// MARQUE: - Ajouter la bordure gauche pour la vue
// MARQUE: - Ajouter une bordure droite pour la vue
// MARK: - Ajouter une bordure inférieure pour la vue
la source
J'ai apporté quelques modifications à la réponse de Dan afin que je puisse ajouter des bordures à plusieurs bords avec une seule commande:
Voici le code complet:
la source
En m'appuyant sur la réponse de NSBum , j'ai adopté une approche similaire et créé cette sous-classe UIView simple afin qu'elle fonctionne dans Interface Builder et fonctionne avec des contraintes: lien github
En utilisant CGContextFillRect au lieu de CGContextStrokePath, j'ai pu de manière prévisible garder les lignes complètement solides et à l'intérieur les limites de la vue.
Voici mon article de blog à ce sujet: http://natrosoft.com/?p=55
- En gros, déposez simplement un UIView dans Interface Builder et changez son type de classe en NAUIViewWithBorders.
- Ensuite, dans viewDidLoad de votre VC, faites quelque chose comme:
Voici un lien direct vers le fichier .m afin que vous puissiez voir l'implémentation. Il existe également un projet de démonstration. J'espère que cela aide quelqu'un :)
la source
Ma réponse à une question similaire: https://stackoverflow.com/a/27141956/435766 Personnellement, je préfère descendre la route des catégories sur celle-là, car je veux pouvoir l'utiliser sur n'importe quelle sous-classe d'UIView.
la source
la source
Voici une solution simple. Ajoutez une étiquette sur votre
UIView
, effacez le texte sur l'étiquette et définissez la couleur d'arrière-plan de l'étiquette pour qu'elle soit votre couleur de bordure. Définissez l'origine(x,y)
de votre étiquette comme étant l'origine(x,y)
de votre vue. et définissez la largeur de l'étiquette sur la largeur de votreUIView
, définissez la hauteur sur 1 ou 2 (pour la hauteur de votre bordure en haut de votreUIView
). Et cela devrait faire l'affaire.la source
Version Swift 3
Afin de définir la bordure correspondante, vous devez remplacer la méthode viewDidLayoutSubviews () :
la source
Publiez simplement ici pour aider quelqu'un qui cherche à ajouter des bordures J'ai apporté quelques modifications à la réponse acceptée ici, étiquette rapide seulement bordure gauche . Largeur modifiée en cas
UIRectEdge.Top
deCGRectGetHeight(self.frame)
àCGRectGetWidth(self.frame)
et en casUIRectEdge.Bottom
deUIScreen.mainScreen().bounds.width
àCGRectGetWidth(self.frame)
pour obtenir les bordures correctement. Utilisation de Swift 2.Enfin l'extension est:
la source
Au cas où quelqu'un aurait besoin de la version Xamarin:
la source
Voici une version Swift 4 de la réponse de Pauls
la source
Inspiré par @Addison, j'ai réécrit l'extension sans utiliser de framework tiers, car il utilisait SnapKit et CocoaLumberjack.
Comme dans l'approche @Addisons, je supprime également les bordures précédemment ajoutées, cette implémentation devrait donc bien fonctionner avec des vues réutilisables en tant que cellules de tableau et cellules de collection.
la source
Si je construis à partir du storyboard, je préfère ajouter un
UIView
derrière mon utileUIView
... Si je veux créer une bordure sur le dessus de monUIView
, j'augmente simplement la hauteur de l'arrière-planUIView
de ma largeur de bordure .. La même chose peut être fait pour tout autre côté :)la source
Personnellement, j'aime le sous-classement de la vue + drawRect, mais voici juste une autre façon de procéder (et cela fonctionne en quelque sorte dans le même sens que la réponse acceptée par @If Pollavith):
Votre nouveau calque de bordure peut être configuré pour avoir les dimensions que vous souhaitez. Ainsi, comme @Si la réponse de Pollavith, vous créez un calque aussi haut que vous le souhaitez et aussi large que la vue que vous souhaitez encadrer. Utilisez la définition de cadre du calque pour le placer où vous le souhaitez, puis ajoutez-le en tant que sous-calque à votre vue.
Pour référence, ma propre exigence était de mettre une bordure sur le côté GAUCHE de la vue (veuillez ne pas couper et coller ce code et dis-moi juste parce qu'il ne met pas de bordure en haut de la vue - modifier le code ci-dessous est assez simple):
Je suppose que le seul avantage modéré par rapport à cela et à créer un petit UIView ou UILabel est que le CALayer est censé être `` plus léger '', et il y a beaucoup de points de vue intéressants (comme dans les opinions) sur la sur-équitation de drawRect par rapport à l'utilisation de CALayers (comme ici : iOS: Utilisation de 'drawRect:' d'UIView par rapport à la délagation de sa couche 'drawLayer: inContext:' ).
Animaux451
J'aime la couleur bleue.
la source
En plus de n8tr peut ajouter qu'il existe une disponibilité pour les définir à partir du storyboard soit:
- ajouter deux propriétés comme
borderColor
etborderWidth
dans le fichier .h;- alors vous pouvez ajouter
keyPaths
directement dans le storyboard, voir le lien vers la capture d' écranla source
Convertir la réponse DanShev en Swift 3
la source
Pour Xamarin en C #, je crée simplement la bordure en ligne lors de l'ajout de la sous-couche
Vous pouvez organiser cela (comme suggéré par d'autres) pour les bordures en bas, à gauche et à droite.
la source
Vous pouvez également consulter cette collection de catégories UIKit et Foundation: https://github.com/leszek-s/LSCategories
Il permet d'ajouter une bordure sur un côté de UIView avec une seule ligne de code:
et il gère correctement la rotation des vues alors que la plupart des réponses publiées ici ne le gèrent pas bien.
la source
Remarque: la plupart des solutions ici ne sont pas adaptatives et ne seront pas redimensionnées. Les solutions qui seront redimensionnées auront un impact énorme sur votre temps de démarrage car elles utilisent beaucoup de CPU.
Vous pouvez utiliser cette solution ci-dessous. Il fonctionne sur UIBezierPaths qui sont plus légers que les couches, ce qui entraîne des temps de démarrage rapides. Il est facile à utiliser, voir les instructions ci-dessous.
la source
Pour définir la bordure supérieure et la bordure inférieure d'un UIView dans Swift.
la source
Dans Swift 4 et 3
la source