A UIScrollView *toScrollView
(que es el ancho de la pantalla), quiero agregar un borde inferior gris (exactamente como el del campo de la vista de redacción de la aplicación de mensajes nativa del iPhone).
Para lograr esto, seguí Cocoa Touch: ¿Cómo cambiar el color y el grosor del borde de UIView? y solo cubrí el borde superior con el personalizado UINavigationBar
e hice la toScrollView
coordenada x de -1 y el ancho 322 para que los bordes izquierdo y derecho estén fuera de la pantalla.
Esto se ve bien, pero es una especie de truco, y me preguntaba si hay una mejor manera de hacerlo.
- (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
}
Respuestas:
En lugar de usar un
UIView
, como sugiere @ ImreKelényi, puede usar unCALayer
:fuente
QuartzCore framework
a su proyecto si no lo tiene, ya que puede obtener errores del compilador.QuartzCore.framework
más.43.0f
atoScrollView.frame.size.height
para asegurarse de que esté en la parte inferiorAquí hay una extensión Swift más generalizada para crear bordes para cualquier
UIView
subclase:Swift 3
fuente
border.frame = CGRect(x: 0, y: 0, width: self.frame.size.width, height: width)
etc.Implementado en una categoría de la siguiente manera:
UIButton + Border.h:
UIButton + Border.m:
fuente
Swift 4
Si necesita una solución realmente adaptativa (para todos los tamaños de pantalla), esta es:
fuente
Puede agregar un separador
UIView
con altura de 1 punto y color de fondo grisself.view
y colocarlo justo debajotoScrollView
.fuente
Solución para Swift 4
Fondo Luz de color Gris. Cambia de color si lo necesitas.
fuente
También hay código mejorado con la funcionalidad de eliminar bordes. Basado en la respuesta confile .
Actualización: Swift 3
fuente
func remove(border: ViewBorder) { layer.sublayers? .compactMap { $0 } .filter { $0.name == border.rawValue } .forEach { $0.removeFromSuperlayer() } }
El problema con estos métodos de extensión es que cuando UIView / UIButton luego ajusta su tamaño, no tiene la posibilidad de cambiar el tamaño de CALayer para que coincida con el nuevo tamaño. Lo que te dejará con un borde fuera de lugar. Descubrí que era mejor subclasificar mi UIButton, por supuesto, también podrías subclasificar otras UIViews. Aquí hay un código:
fuente
O, la forma más amigable con el rendimiento es sobrecargar drawRect, simplemente así:
fuente
drawRect:
no es necesariamente amigable con el rendimiento. Estoy bastante seguro de que usar una capa tiene un rendimiento mucho mejor.setFrame:
,setBounds:
olayoutSubviews
métodos.layoutSublayersOfLayer:
lugar desetFrame:
cualquiera de los otrosVersión Swift 3 de la respuesta de Confile:
Uso al usar el diseño automático:
fuente
Si usa restricciones (y no tiene los tamaños de marco), puede agregar una vista de borde con las restricciones requeridas
Luego configúrelo como el siguiente
(inspirado por esta respuesta )
fuente
Rápido
Crear extensión UIView
C objetivo
Crear clase de categoría de UIView
UIView + Border.h
UIView + Border.m
Uso: - Seleccione cualquier control del guión gráfico, luego muestre el inspector de atributos (lado derecho) Verá el siguiente ejemplo de imagen (Nota: el borde solo aparece en tiempo de ejecución).
Ahora puede establecer cualquier lado del color y ancho del borde.
fuente
Escribí un método general que agregará un borde en los lados que desee en cualquiera
UIView
. Puede definir grosor, color, márgenes yzOrder
para cada lado.fuente
No tiene que agregar una capa para cada borde, solo use una ruta más clara para dibujarlos una vez.
fuente
Swift 4/3
Puede usar esta solución a continuación. Funciona en UIBezierPaths, que son más ligeros que las capas, lo que provoca tiempos de inicio rápidos. Es fácil de usar, vea las instrucciones a continuación.
fuente
Swift 4
Basado en: https://stackoverflow.com/a/32821607/9980800
UIView + Border
}
Uso:-
fuente
Swift 4
Basado en https://stackoverflow.com/a/32513578/5391914
fuente
La respuesta más completa. https://github.com/oney/UIView-Border
fuente
Extensión Swift 4 con ancho de borde y color. ¡Funciona genial!
}
fuente
Swift 5.1. Úselo con dos extensiones, método return CALayer, por lo que lo reutilizaría para actualizar marcos.
fuente
extensión UIView {
func addBottomLine (color: UIColor, altura: CGFloat) {
}
}
fuente