2016-08-09 78 views
1

Ich habe mehrere UITextFields auf der Ansicht, die gleich aussehen müssen. Ich habe herausgefunden, dass ich eine Extension erstellen kann, die meine Textfelder vordefiniert (die, die ich den gleichen Stil haben möchte).Erstellen UITextField Erweiterung in Swift mit benutzerdefinierten Styling

let passTextField: UITextField = { 
    let tf = UITextField() 
    //tf.backgroundColor = UIColor.blueColor() 
    tf.translatesAutoresizingMaskIntoConstraints = false 
    tf.layer.cornerRadius = 25 
    tf.layer.borderColor = UIColor(r: 34, g: 140, b: 204, a: 1).CGColor 
    tf.layer.borderWidth = 2.0 
    tf.layer.masksToBounds = true 
    /* Paddings */ 
    tf.leftView = UIView(frame: CGRectMake(0, 0, 25, 0)) 
    tf.leftViewMode = UITextFieldViewMode.Always 
    tf.rightView = UIView(frame: CGRectMake(0, 0, 25, 0)) 
    tf.rightViewMode = UITextFieldViewMode.Always 
    /* Place Holder Formating */ 
    let attributes = [ 
     NSForegroundColorAttributeName: UIColor(r: 34, g: 140, b: 204, a: 1), 
     NSFontAttributeName : UIFont(name: "HelveticaNeue-Thin", size: 16)! // Note the ! 
    ] 
    tf.attributedPlaceholder = NSAttributedString(string: "Email", attributes:attributes) 


    return tf 
}() 

so dass die meisten dieser Attribute sollten in die Erweiterung einbezogen werden, und ich möchte in der Lage sein, einige von ihnen, um es hinzuzufügen, wenn ich die Variable deklarieren.

können Sie mir helfen? Ich habe gesucht, wie man eine Erweiterung erstellt, aber nichts scheint für mich zu funktionieren.

Vielen Dank!

+0

Warum deklarieren Sie eine Methode anstelle einer Eigenschaft in Ihrer Erweiterung? Sie können Parameter übergeben. – Crazyrems

+0

@Crazyrems das klingt großartig, können Sie bitte ein Beispiel veröffentlichen? – mrGott

+0

Das ist im Grunde seine Antwort http://stackoverflow.com/a/38850484/1392046. Sie sollten dem Rahmen weitere Parameter hinzufügen, um Ihr Feld an Ihre Bedürfnisse anzupassen. – Crazyrems

Antwort

3

extension von UITextField wie diese

erstellen machen existieren
extension UITextField { 
    class func attributedTextField(frame: CGRect) -> UITextField { 
     let textField = UITextField(frame: frame) 
     textField.translatesAutoresizingMaskIntoConstraints = false 
     textField.layer.cornerRadius = 25 
     textField.layer.borderColor = UIColor(r: 34, g: 140, b: 204, a: 1).CGColor 
     textField.layer.borderWidth = 2.0 
     textField.layer.masksToBounds = true 
     /* Paddings */ 
     textField.leftView = UIView(frame: CGRectMake(0, 0, 25, 0)) 
     textField.leftViewMode = UITextFieldViewMode.Always 
     textField.rightView = UIView(frame: CGRectMake(0, 0, 25, 0)) 
     textField.rightViewMode = UITextFieldViewMode.Always 
     /* Place Holder Formating */ 
     textField attributes = [ 
          NSForegroundColorAttributeName: UIColor(r: 34, g: 140, b: 204, a: 1), 
          NSFontAttributeName : UIFont(name: "HelveticaNeue-Thin", size: 16)! // Note the ! 
          ] 
     textField.attributedPlaceholder = NSAttributedString(string: "Email", attributes:attributes) 
     return textField 
    } 
} 

rufen Sie diese Funktion wie folgt auf

let tf = UITextField.attributedTextField(frame: CGRect(x: 0, y: 0, width: 100, height: 100)) 
+0

Was ist der Rahmen: IhreFrame-Variable, die an attributierteTextField übergeben wird? – mrGott

+0

Der textField-Rahmen, Überprüfen Sie meine bearbeitete Antwort Sie erhalten Batter Idee. –

+0

Ist dies eine benutzerdefinierte Variable, die Sie vorschlagen zu übergeben? Ich dachte, es wäre erforderlich. – mrGott

3

Sie es mit extension Definition tun können, wenn die Methode ist neu Sie den Code unten verwenden können, wenn bereits ein override Methode

extension UITextField { 

    func underlined(){ 
     let border = CALayer() 
     let width = CGFloat(1.0) 
     border.borderColor = UIColor.lightGrayColor().CGColor 
     border.frame = CGRect(x: 0, y: self.frame.size.height - width, width: self.frame.size.width, height: self.frame.size.height) 
     border.borderWidth = width 
     self.layer.addSublayer(border) 
     self.layer.masksToBounds = true 
    } 
} 
+1

Das ist der Fehler, wenn ich es benutze: Verwendung von Instanz Mitglied 'unterstrichen' auf den Typ 'UITextField'; meinst du stattdessen einen Wert vom Typ 'UITextField'? – mrGott