Me gustaría mantener el borde en la parte inferior solo adentro UITextField
. Pero no sé cómo podemos mantenerlo en el lado inferior.
¿Me puede aconsejar por favor?
Estoy creando un textField
componente personalizado para que sea un componente reutilizable para SwiftUI
SwiftUI
struct CustomTextField: View {
var placeHolder: String
@Binding var value: String
var lineColor: Color
var width: CGFloat
var body: some View {
VStack {
TextField(self.placeHolder, text: $value)
.padding()
.font(.title)
Rectangle().frame(height: self.width)
.padding(.horizontal, 20).foregroundColor(self.lineColor)
}
}
}
Uso:
@Binding var userName: String
@Binding var password: String
var body: some View {
VStack(alignment: .center) {
CustomTextField(placeHolder: "Username", value: $userName, lineColor: .white, width: 2)
CustomTextField(placeHolder: "Password", value: $password, lineColor: .white, width: 2)
}
}
Swift 5.0
Estoy usando Visual Formatting Language (VFL) aquí, esto permitirá agregar una línea a cualquiera UIControl
.
Puedes crear una UIView
clase de extensión comoUIView+Extention.swift
import UIKit
enum LINE_POSITION {
case LINE_POSITION_TOP
case LINE_POSITION_BOTTOM
}
extension UIView {
func addLine(position : LINE_POSITION, color: UIColor, width: Double) {
let lineView = UIView()
lineView.backgroundColor = color
lineView.translatesAutoresizingMaskIntoConstraints = false // This is important!
self.addSubview(lineView)
let metrics = ["width" : NSNumber(value: width)]
let views = ["lineView" : lineView]
self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[lineView]|", options:NSLayoutConstraint.FormatOptions(rawValue: 0), metrics:metrics, views:views))
switch position {
case .LINE_POSITION_TOP:
self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[lineView(width)]", options:NSLayoutConstraint.FormatOptions(rawValue: 0), metrics:metrics, views:views))
break
case .LINE_POSITION_BOTTOM:
self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:[lineView(width)]|", options:NSLayoutConstraint.FormatOptions(rawValue: 0), metrics:metrics, views:views))
break
}
}
}
Uso:
textField.addLine(position: .LINE_POSITION_BOTTOM, color: .darkGray, width: 0.5)
C objetivo:
Puede agregar este método de ayuda a su clase de ayuda global (usé el método de clase global) o en el mismo controlador de vista (usando un método de instancia).
typedef enum : NSUInteger {
LINE_POSITION_TOP,
LINE_POSITION_BOTTOM
} LINE_POSITION;
- (void) addLine:(UIView *)view atPosition:(LINE_POSITION)position withColor:(UIColor *)color lineWitdh:(CGFloat)width {
// Add line
UIView *lineView = [[UIView alloc] init];
[lineView setBackgroundColor:color];
[lineView setTranslatesAutoresizingMaskIntoConstraints:NO];
[view addSubview:lineView];
NSDictionary *metrics = @{@"width" : [NSNumber numberWithFloat:width]};
NSDictionary *views = @{@"lineView" : lineView};
[view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[lineView]|" options: 0 metrics:metrics views:views]];
switch (position) {
case LINE_POSITION_TOP:
[view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[lineView(width)]" options: 0 metrics:metrics views:views]];
break;
case LINE_POSITION_BOTTOM:
[view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[lineView(width)]|" options: 0 metrics:metrics views:views]];
break;
default: break;
}
}
Uso:
[self addLine:self.textField atPosition:LINE_POSITION_TOP withColor:[UIColor darkGrayColor] lineWitdh:0.5];
Código Xamarin:
var border = new CALayer();
nfloat width = 2;
border.BorderColor = UIColor.Black.CGColor;
border.Frame = new CoreGraphics.CGRect(0, textField.Frame.Size.Height - width, textField.Frame.Size.Width, textField.Frame.Size.Height);
border.BorderWidth = width;
textField.Layer.AddSublayer(border);
textField.Layer.MasksToBounds = true;
Si desea hacerlo sin conocer los cuadros de antemano, sin subclases y sin Autolayout :
Swift 5 / Swift 4.x / Swift 3.x
extension UITextField {
func setBottomBorder() {
self.borderStyle = .none
self.layer.backgroundColor = UIColor.white.cgColor
self.layer.masksToBounds = false
self.layer.shadowColor = UIColor.gray.cgColor
self.layer.shadowOffset = CGSize(width: 0.0, height: 1.0)
self.layer.shadowOpacity = 1.0
self.layer.shadowRadius = 0.0
}
}
Llame yourTextField.setBottomBorder()
desde cualquier lugar sin asegurarse de que los marcos sean correctos.
El resultado se ve así:
IU rápida
struct MyTextField: View {
var myPlaceHolder: String
@Binding var text: String
var underColor: Color
var height: CGFloat
var body: some View {
VStack {
TextField(self.myPlaceHolder, text: $text)
.padding()
.font(.title)
Rectangle().frame(height: self.height)
.padding(.horizontal, 24).foregroundColor(self.underColor)
}
}
}
viewDidLoad()
?Puede crear una subclase de
UITextField
como se muestra a continuación:fuente
tintColor
endidBeginEditing
edidEndEditing
Ninguna de estas soluciones realmente cumplió con mis expectativas. Quería subclasificar el TextField ya que no quiero establecer el borde manualmente todo el tiempo. También quería cambiar el color del borde, por ejemplo, por un error. Así que aquí está mi solución con
Anchors
:---- Opcional ----
Para cambiar el color, agregue algo como esto a
CustomTextField Class
:Y para activar el Error, llame a esto después de crear una instancia de CustomTextField
Espero que ayude a alguien;)
fuente
y luego solo haz esto:
fuente
viewDidLoad()
, el marco sería incorrecto. Entonces tenemos 2 opciones:viewDidLayoutSubviews()
oviewDidAppear()
. PeroviewDidLayoutSubviews()
llamar varias veces y llamar desdeviewDidAppear()
no sería una buena experiencia.viewDidLayoutSubviews()
tampoco funcionará si el campo de texto está anidado dentromultiple View
. Obtendrás múltiples broder.Puede crear esta extensión fuera de clase y reemplazar el ancho con el ancho de borde que desee.
Swift 4
Original
y luego agregue esto a su viewDidLoad reemplazando yourTextField con su variable UITextField y con cualquier color que desee en el borde
Básicamente, esto agrega una vista con ese color en la parte inferior del campo de texto.
fuente
C objetivo
Rápido
fuente
Lo que hice fue crear una extensión para UITextField y agregué una propiedad editable del Diseñador. Establecer esta propiedad en cualquier color cambiaría el borde (inferior) a ese color (establecer otros bordes en ninguno).
Como esto también requiere cambiar el color del texto del marcador de posición, también lo agregué a la extensión.
fuente
En Swift 3. Puede crear una extensión y agregarla después de su clase de vista.
fuente
Por favor, eche un vistazo a la muestra de código a continuación;
Swift 4:
fuente
Aquí está el código swift3 con @IBInspectable
crear un nuevo archivo Cocoa Touch Class Swift File
}
y reemplace el archivo con el siguiente código y obtendrá la opción en el inspector de atributos del guión gráfico como este
Disfruta :)
fuente
** Aquí myTF es salida para MT TEXT FIELD **
fuente
puede crear una imagen para el borde inferior y establecerla en el fondo de su UITextField:
¡o establezca borderStyle en none y coloque la imagen de la línea exactamente igual a la longitud del campo de texto!
fuente
Código actualizado:
Swift 5.0
Ahora llame a este func en viewDidLayoutSubviews ()
NOTA: Este método solo funcionará en viewDidLayoutSubviews ()
fuente
He analizado cada una de estas soluciones que también parecen funcionar con un problema. Modo oscuro y la configuración de fondo
La configuración de fondo del UITextField debe coincidir con el fondo de la vista principal o no aparece ninguna línea
Entonces, esto funcionará en modo claro. Para trabajar en modo oscuro, cambie el color de fondo a negro y funciona. Excluya el color de fondo y la línea no aparece.
Esto terminó siendo la mejor solución para mí.
fuente
Tutorial
fuente
SwiftUI
en SwiftUI, hay una
View
llamadaDivider
que se adapta perfectamente a esto. Puede agregarlo debajo de cualquier vista incrustándolos en un simpleVStack
:fuente
Puede usar esto ORGANIZADO y también puede PERSONALIZAR esta extensión aún más:
fuente
}
método de llamada en viewdidload
mobileNumberTextField.underlinedLogin()
passwordTextField.underlinedLogin()
// selecciona como campo de texto en mainstoryboard
fuente
Para ver: (más recomendado)
Funciona para todo tipo de
UIView
subclase (vista, archivo de texto, etiqueta, etc.) usandoUIView extension
Es más simple y conveniente. Pero la única condición es que
view
debe contener un diseño automático.¿Cómo utilizar?
y
fuente