Ich möchte die Grenze im unteren Teil nur in behalten UITextField
. Aber ich weiß nicht, wie wir es auf der Unterseite halten können.
Können Sie mich bitte beraten?
Ich erstelle benutzerdefinierte textField
, um es wiederverwendbare Komponente für SwiftUI zu machen
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)
}
}
}
Verwendung:
@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
Ich verwende hier Visual Formatting Language (VFL). Dies ermöglicht das Hinzufügen einer Zeile zu einer beliebigen UIControl
.
Sie können eine UIView
Erweiterungsklasse wie erstellenUIView+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
}
}
}
Verwendung:
textField.addLine(position: .LINE_POSITION_BOTTOM, color: .darkGray, width: 0.5)
Ziel c:
Sie können diese Hilfsmethode zu Ihrer globalen Hilfsklasse (ich habe die globale Klassenmethode verwendet) oder im selben Ansichtscontroller (unter Verwendung einer Instanzmethode) hinzufügen.
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;
}
}
Verwendung:
[self addLine:self.textField atPosition:LINE_POSITION_TOP withColor:[UIColor darkGrayColor] lineWitdh:0.5];
Xamarin-Code:
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;
Wenn Sie ohne vorherige Kenntnis von Frames , ohne Unterklassen und ohne Autolayout auskommen möchten :
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
}
}
Rufen Sie an als yourTextField.setBottomBorder()
von überall an, ohne sicherzustellen, dass die Rahmen richtig sind.
Das Ergebnis sieht folgendermaßen aus:
Schnelle Benutzeroberfläche
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()
?Sie können eine Unterklasse
UITextField
wie folgt erstellen :quelle
tintColor
indidBeginEditing
unddidEndEditing
Keine dieser Lösungen hat meine Erwartungen wirklich erfüllt. Ich wollte das TextField in Unterklassen unterteilen, da ich den Rahmen nicht immer manuell festlegen möchte. Ich wollte auch die Rahmenfarbe ändern, zB für einen Fehler. Hier ist meine Lösung mit
Anchors
:---- Optional ----
Um die Farbe zu ändern, fügen Sie Folgendes hinzu
CustomTextField Class
:Um den Fehler auszulösen, rufen Sie dies auf, nachdem Sie eine Instanz von CustomTextField erstellt haben
Hoffe es hilft jemandem;)
quelle
und dann mach einfach das:
quelle
viewDidLoad()
, wäre der Rahmen falsch. Wir haben also zwei Möglichkeiten:viewDidLayoutSubviews()
oderviewDidAppear()
. AberviewDidLayoutSubviews()
mehrmals angerufen und angerufen vonviewDidAppear()
wäre keine gute Erfahrung.viewDidLayoutSubviews()
funktioniert auch nicht, wenn das Textfeld darin verschachtelt istmultiple View
. Sie erhalten mehrere Broder.Sie können diese Erweiterung außerhalb der Klasse erstellen und die Breite durch die gewünschte borderWidth ersetzen.
Swift 4
Original
Fügen Sie dies dann zu viewDidLoad hinzu und ersetzen Sie yourTextField durch Ihre UITextField-Variable und durch eine beliebige Farbe im Rahmen
Dadurch wird im Grunde eine Ansicht mit dieser Farbe am unteren Rand des Textfelds hinzugefügt.
quelle
Ziel c
Schnell
quelle
Ich habe eine Erweiterung für UITextField erstellt und eine bearbeitbare Designer-Eigenschaft hinzugefügt. Wenn Sie diese Eigenschaft auf eine beliebige Farbe setzen, wird der Rand (unten) in diese Farbe geändert (andere Ränder werden auf keine gesetzt).
Da dazu auch die Textfarbe des Platzhalters geändert werden muss, habe ich diese auch zur Erweiterung hinzugefügt.
quelle
In Swift 3. Sie können eine Erweiterung erstellen und nach Ihrer Ansichtsklasse hinzufügen.
quelle
Bitte schauen Sie sich das folgende Codebeispiel an.
Swift 4:
quelle
Hier ist swift3-Code mit @IBInspectable
Erstellen Sie eine neue Datei Cocoa Touch Class Swift File
}}
und ersetzen Sie die Datei durch den folgenden Code, und Sie erhalten die Option im Storyboard-Attributinspektor wie folgt
Genießen :)
quelle
** Hier ist myTF Outlet für MT TEXT FIELD **
quelle
Sie können ein Bild für den unteren Rand erstellen und es auf den Hintergrund Ihres UITextField setzen:
oder setze borderStyle auf none und setze das Bild der Linie genau gleich lang wie das Textfeld!
quelle
Aktualisierter Code:
Swift 5.0
Rufen Sie diese Funktion nun in viewDidLayoutSubviews () auf.
HINWEIS: Diese Methode funktioniert nur in viewDidLayoutSubviews ()
quelle
Ich habe mir jede dieser Lösungen angesehen, die auch mit einem Problem zu funktionieren scheinen. Dunkler Modus und die Hintergrundeinstellung
Die Hintergrundeinstellung des UITextField muss mit dem Hintergrund der übergeordneten Ansicht übereinstimmen, da sonst keine Linie angezeigt wird
Dies funktioniert also im hellen Modus. Um im dunklen Modus zu arbeiten, ändern Sie die Hintergrundfarbe in Schwarz und es funktioniert. Schließen Sie die Hintergrundfarbe aus und die Linie wird nicht angezeigt
Dies war die beste Lösung für mich
quelle
Lernprogramm
quelle
SwiftUI
In SwiftUI gibt es einen
View
AufrufDivider
, der perfekt darauf abgestimmt ist. Sie können es unter jeder Ansicht hinzufügen, indem Sie sie in eine einfache Datei einbettenVStack
:quelle
Sie können diese verwenden ORGANISIERT und kann auch FERTIGEN diese Erweiterung weiter:
quelle
}}
Aufrufmethode für viewdidload
mobileNumberTextField.underlinedLogin()
passwordTextField.underlinedLogin()
// Ähnliches Textfeld auf dem Mainstoryboard auswählen
quelle
Für Ansicht: (Am meisten empfohlen) Funktioniert
für alle Arten von
UIView
Unterklassen (Ansicht, Textdatei, Beschriftung usw.) mitUIView extension
Es ist einfacher und bequemer. Die einzige Bedingung ist
view
jedoch, dass ein automatisches Layout enthalten sein muss.Wie benutzt man?
und
quelle