2017-06-19 3 views
4

Ich möchte eine Animation für mein UItextfeld erstellen. Dazu habe ich eine Unterklasse von UITextField und ich meinen Code dort gespeichert:Swift Animate Textfield

import Foundation 
import UIKit 
class textfieldEdit: UITextField, UITextFieldDelegate { 

    let border = CALayer() 
    let width = CGFloat(2.0) 

    required init?(coder aDecoder: (NSCoder!)) { 
     super.init(coder: aDecoder) 
     self.delegate=self; 
     border.borderColor = UIColor(red: 216/255, green: 216/255, blue: 216/255, alpha: 100).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 
    } 

    override func draw(_ rect: CGRect) { 
     border.frame = CGRect(x: 0, y: self.frame.size.height - width, width: self.frame.size.width, height: self.frame.size.height) 
    } 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     border.frame = CGRect(x: 0, y: self.frame.size.height - width, width: self.frame.size.width, height: self.frame.size.height) 
    } 

} 

Wenn jedoch jemand in das Textfeld klickt, möchte ich die Grenze des Textfeld aktualisieren und grün machen. Gibt es einen effizienten Weg, dies zu tun? Ich habe versucht, eine Funktion zuzuweisen, wenn jemand in der Textbox in meinem Hauptansicht-Controller berührt, aber es scheint nicht zu funktionieren.

Antwort

2

Ich würde vorschlagen, diese Verhaltensweisen nicht zu kombinieren. Fügen Sie stattdessen eine UIView mit "Touches Enabled" hinzu, fügen Sie dann dieser Ansicht einen Touch-Listener hinzu, senden Sie eine Nachricht per Drag-and-Drop an eine Komfortmethode in Ihrem benutzerdefinierten Uitextfield, oder ändern Sie einfach die Darstellung direkt.

Dies funktioniert auch mit einem UIButton.

Für Layout-Zwecke müssen Sie für die Schaltfläche oder Ansicht die gleichen Randbedingungen wie für das Etikett sowie die X- und Y-Position in der Mitte festlegen.

Vergessen Sie nicht, das "setNeedsDisplay" für Ihr benutzerdefiniertes Textlabel aufzurufen, um es zum Neuzeichnen zu zwingen.

What is the most robust way to force a UIView to redraw?

Edit: Wenn Sie bei der Änderung der Rahmenfarbe nur daran interessiert sind, wenn der UITextField gerade bearbeitet wird, einen Delegaten, um es hinzuzufügen und das Aussehen entsprechend einmal zu ändern, wenn es Ersthelfer wird (bearbeitet wird) und einmal, wenn es tritt zurück Ersthelfer zu sein (nicht mehr bearbeitet wird):

How to know when UITextView became first responder

ändern Grenze hier:

optional func textViewDidBeginEditing(_ textView: UITextView) 

https://developer.apple.com/documentation/uikit/uitextviewdelegate/1618610-textviewdidbeginediting

und legen Sie es hier wieder normal:

optional func textViewDidEndEditing(_ textView: UITextView) 

https://developer.apple.com/documentation/uikit/uitextviewdelegate/1618628-textviewdidendediting

+0

Gibt es eine bessere Methode als Berührungen aktiviert? Ich würde lieber verwenden, während der Benutzer das Textfeld eingibt, weil ich nicht möchte, dass die Animation nach einer Berührung weggeht – codeislife

+0

Ah, ich sehe, was Sie jetzt tun möchten. Sie sollten sich den Responder "ansehen". Also, wenn dieses Feld "WIRD ERSTER ANTWORTER ERFORDERT", dann wollen Sie die neue Farbe einstellen. Dann, wenn es "RESIGNING SEIN FIRST RESPONDER" ist, kannst du es auf die alte Farbe zurücksetzen. Das ist, was Sie suchen, aber das hat nichts mit Berührungen zu tun. https://stackoverflow.com/questions/7022180/how-to-know-when-uitextview-became-first-responder – Pochi

+0

Implementieren Sie einfach den Delegaten mit den 2 Methoden, die ich am Ende meiner Beschreibung hinzugefügt. @ Codeslife – Pochi

Verwandte Themen