Eu gostaria de manter a borda na parte inferior apenas em UITextField
. Mas não sei como podemos mantê-lo no lado inferior.
Você pode me aconselhar?
Estou criando personalizado textField
para torná-lo componente reutilizável 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
Estou usando a linguagem Visual Formatting (VFL) aqui, isso permitirá adicionar uma linha a qualquer UIControl
.
Você pode criar uma UIView
classe de extensão 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)
Objetivo C:
Você pode adicionar esse método auxiliar à sua classe auxiliar global (usei o método de classe global) ou no mesmo controlador de exibição (usando um método de instância).
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;
Se você deseja fazer sem conhecer os quadros de antemão, sem subclassificar e sem o 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
}
}
Ligue como yourTextField.setBottomBorder()
em qualquer lugar sem ter certeza de que os quadros estejam corretos.
O resultado fica assim:
UI 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()
?Você pode criar uma subclasse
UITextField
como mostrado abaixo:fonte
tintColor
indidBeginEditing
edidEndEditing
Nenhuma dessas soluções realmente atendeu às minhas expectativas. Eu queria subclassificar o TextField, já que não quero definir a borda manualmente o tempo todo. Eu também queria mudar a cor da borda, por exemplo, por um erro. Então, aqui está minha solução com
Anchors
:---- Opcional ----
Para alterar a cor, adicione sth como este ao
CustomTextField Class
:E para acionar o erro, chame isso depois de criar uma instância do CustomTextField
Espero que ajude alguém;)
fonte
e então faça o seguinte:
fonte
viewDidLoad()
, o quadro estará incorreto. Portanto, temos 2 opções:viewDidLayoutSubviews()
ouviewDidAppear()
. MasviewDidLayoutSubviews()
ligar várias vezes e telefonarviewDidAppear()
não seria uma boa experiência.viewDidLayoutSubviews()
também não funcionará se o campo de texto estiver aninhado dentromultiple View
. Você receberá vários broder.Você pode criar essa extensão fora da classe e substituir a largura por qualquer borderWidth desejado.
Swift 4
Original
e adicione isso ao seu viewDidLoad, substituindo yourTextField pela sua variável UITextField e por qualquer cor que você deseja na borda
Isso basicamente adiciona uma visualização com essa cor na parte inferior do campo de texto.
fonte
Objetivo C
Rápido
fonte
O que fiz foi criar uma extensão para UITextField e adicionar uma propriedade editável do Designer. Definir essa propriedade para qualquer cor alteraria a borda (inferior) para essa cor (definir outras bordas para nenhuma).
Como isso também requer a alteração da cor do texto do espaço reservado, eu também o adicionei à extensão.
fonte
No Swift 3. Você pode criar uma extensão e adicionar após a sua classe de exibição.
fonte
Por favor, dê uma olhada no exemplo de código abaixo;
Swift 4:
fonte
Aqui está o código swift3 com @IBInspectable
crie um novo arquivo Cocoa Touch Class Swift File
}
e substitua o arquivo pelo código abaixo e você terá a opção no inspetor de atributos do storyboard como este
Aproveitar :)
fonte
** Aqui myTF é uma saída para MT TEXT FIELD **
fonte
você pode criar uma imagem para a borda inferior e configurá-la para o fundo do seu UITextField:
ou defina borderStyle como none e coloque a imagem da linha exatamente igual ao campo de texto!
fonte
Código atualizado:
Swift 5.0
Agora chame isso de func em viewDidLayoutSubviews ()
NOTA: Este método funcionará apenas em viewDidLayoutSubviews ()
fonte
Analisei cada uma dessas soluções que também parecem funcionar com um problema. Modo escuro e a configuração de fundo
A configuração de plano de fundo do UITextField deve corresponder ao plano de fundo da exibição pai ou nenhuma linha aparece
Portanto, isso funcionará no modo claro. Para começar no modo escuro, altere a cor do plano de fundo para preto e funcione. Excluir cor traseira e a linha não aparece
Isso acabou sendo a melhor solução para mim
fonte
Tutorial
fonte
SwiftUI
no SwiftUI, existe um
View
chamadoDivider
que corresponde perfeitamente a isso. Você pode adicioná-lo abaixo de qualquer visualização, incorporando-os em um simplesVStack
:fonte
Você pode usar este ORGANIZED e também PERSONALIZAR esta extensão ainda mais:
fonte
}
método de chamada em viewdidload
mobileNumberTextField.underlinedLogin()
passwordTextField.underlinedLogin()
// seleciona o campo de texto semelhante no mainstoryboard
fonte
Para exibição: (Mais recomendado)
Funciona para todos os tipos de
UIView
subclasses (exibição, arquivo de texto, rótulo, etc ...) usandoUIView extension
É mais simples e conveniente. Mas a única condição é que
view
deve conter um layout automático.Como usar?
e
fonte