À a UIScrollView *toScrollView
(qui est la largeur de l'écran), je souhaite ajouter une bordure inférieure grise (exactement comme celle du champ to de la vue de composition de l'application Messages native de l'iPhone).
Pour y parvenir, j'ai suivi Cocoa Touch: Comment changer la couleur et l'épaisseur de la bordure d'UIView? et vient de couvrir la bordure supérieure avec la coutume UINavigationBar
et fait la toScrollView
coordonnée x -1 et largeur 322 de la sorte que les bordures gauche et droite soient juste hors de l'écran.
Cela a l'air bien, mais c'est une sorte de hack, et je me demandais s'il y avait une meilleure façon de le faire.
- (void)viewDidLoad {
[super viewDidLoad];
// Add UINavigationBar *navigationBar at top.
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemCancel
target:self action:@selector(cancelAction)];
UINavigationBar *navigationBar = [[UINavigationBar alloc]
initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 44.0f)];
navigationBar.items = [NSArray arrayWithObject:self.navigationItem];
// Add UIScrollView *toScrollView below navigationBar.
UIScrollView *toScrollView = [[UIScrollView alloc]
initWithFrame:CGRectMake(-1.0f, 43.0f, 322.0f, 45.0f)];
toScrollView.backgroundColor = [UIColor whiteColor];
toScrollView.layer.borderColor = [UIColor colorWithWhite:0.8f alpha:1.0f].CGColor;
toScrollView.layer.borderWidth = 1.0f;
[self.view addSubview:toScrollView];
[self.view addSubview:navigationBar]; // covers top of toScrollView
}
Réponses:
Au lieu d'utiliser a
UIView
, comme le suggère @ ImreKelényi, vous pouvez utiliser aCALayer
:la source
QuartzCore framework
à votre projet si vous ne l'avez pas car vous pouvez obtenir des erreurs de compilation.QuartzCore.framework
.43.0f
pourtoScrollView.frame.size.height
vous assurer qu'il est en basVoici une extension Swift plus généralisée pour créer une bordure pour n'importe quelle
UIView
sous-classe:Swift 3
la source
border.frame = CGRect(x: 0, y: 0, width: self.frame.size.width, height: width)
etc.Mis en œuvre dans une catégorie comme ci-dessous:
UIButton + Border.h:
UIButton + Border.m:
la source
Swift 4
Si vous avez besoin d'une solution vraiment adaptative (pour toutes les tailles d'écran), alors la voici:
la source
Vous pouvez ajouter un autre
UIView
avec une hauteur de 1 point et une couleur d'arrière-plan grisself.view
et le positionner juste en dessoustoScrollView
.la source
Solution pour Swift 4
BackgroundColor lightGray. Changez de couleur si vous en avez besoin.
la source
Il existe également un code amélioré avec la fonctionnalité de suppression de bordure. Basé sur la réponse confile .
Mise à jour: Swift 3
la source
func remove(border: ViewBorder) { layer.sublayers? .compactMap { $0 } .filter { $0.name == border.rawValue } .forEach { $0.removeFromSuperlayer() } }
Le problème avec ces méthodes d'extension est que lorsque l'UIView / UIButton ajuste plus tard sa taille, vous n'avez aucune chance de modifier la taille de CALayer pour qu'elle corresponde à la nouvelle taille. Ce qui vous laissera avec une bordure mal placée. J'ai trouvé qu'il valait mieux sous-classer mon UIButton, vous pouvez bien sûr sous-classer d'autres UIViews également. Voici un code:
la source
Ou, le moyen le plus convivial est de surcharger drawRect, simplement comme ça:
la source
drawRect:
n'est pas nécessairement favorable aux performances. Je suis presque sûr que l'utilisation d'une couche a de bien meilleures performances.setFrame:
,setBounds:
oulayoutSubviews
.layoutSublayersOfLayer:
placesetFrame:
ou à l'un des autresVersion Swift 3 de la réponse de Confile:
Utilisation lors de l'utilisation de la mise en page automatique:
la source
Si vous utilisez des contraintes (et que vous n'avez donc pas les tailles de cadre), vous pouvez ajouter une vue de bordure avec les contraintes requises
Ensuite, réglez-le quelque chose comme ci-dessous
(inspiré par cette réponse )
la source
Rapide
Créer une extension UIView
Objectif c
Créer une classe de catégorie de UIView
UIView + Border.h
UIView + Border.m
Utilisation: - Sélectionnez n'importe quel contrôle du storyboard, puis affichez l'inspecteur d'attributs (côté droit) Vous verrez l'image ci-dessous Exemple. (Remarque: la bordure n'apparaît qu'au moment de l'exécution.)
Vous pouvez maintenant définir n'importe quel côté de la couleur et de la largeur de la bordure.
la source
J'ai écrit une méthode générale qui ajoutera une bordure sur les côtés que vous souhaitez
UIView
. Vous pouvez définir l'épaisseur, la couleur, les marges etzOrder
pour chaque côté.la source
Vous n'avez pas besoin d'ajouter un calque pour chaque bordure, utilisez simplement un chemin de Bézier pour les dessiner une fois.
la source
Swift 4/3
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
Swift 4
Basé sur: https://stackoverflow.com/a/32821607/9980800
UIView + Bordure
}
Usage:-
la source
Swift 4
Basé sur https://stackoverflow.com/a/32513578/5391914
la source
La réponse la plus complète. https://github.com/oney/UIView-Border
la source
Extension Swift 4 avec largeur de bordure et couleur. Fonctionne très bien!
}
la source
Swift 5.1. À utiliser avec deux extensions, la méthode return CALayer, de sorte que vous la réutilisez pour mettre à jour les cadres.
la source
extension UIView {
func addBottomLine (couleur: UIColor, hauteur: CGFloat) {
}
}
la source