'Animation in UITextField before textFieldDidBeginEditing
I want to animate a placeholder, before the user begins editing the UITextField.
The placeholder is supposed to be a phone number, but instead of just putting the phone number in there as a placeholder, I want to animate the placeholder number by number. And once the user begins editing the textField, the animated placeholder disappears.
I have tried doing this with a DispatchQueue.main.asyncafter at first I thought it was working, because the number was animated the way I wanted it to. But the DispatchQueue did not stop once the user began editing. It just kept "firing" so that work around is not suitable for my situation.
This is, what I have tried:
func placeHolder(isEmpty: Bool) {
let workItem = DispatchWorkItem {
DispatchQueue.main.asyncAfter(deadline: .now()+0.5) {
self.phoneNumberTextField.textColor = .lightGray
self.phoneNumberTextField.text = "+"
}
DispatchQueue.main.asyncAfter(deadline: .now()+1) {
self.phoneNumberTextField.textColor = .lightGray
self.phoneNumberTextField.text = "+"
}
DispatchQueue.main.asyncAfter(deadline: .now()+1.5) {
self.phoneNumberTextField.textColor = .lightGray
self.phoneNumberTextField.text = "+1"
}
DispatchQueue.main.asyncAfter(deadline: .now()+2) {
self.phoneNumberTextField.textColor = .lightGray
self.phoneNumberTextField.text = "+15"
}
DispatchQueue.main.asyncAfter(deadline: .now()+2.5) {
self.phoneNumberTextField.textColor = .lightGray
self.phoneNumberTextField.text = "+155"
}
DispatchQueue.main.asyncAfter(deadline: .now()+3) {
self.phoneNumberTextField.textColor = .lightGray
self.phoneNumberTextField.text = "+1 555"
}
DispatchQueue.main.asyncAfter(deadline: .now()+3.5) {
self.phoneNumberTextField.textColor = .lightGray
self.phoneNumberTextField.text = "+1 5555"
}
DispatchQueue.main.asyncAfter(deadline: .now()+4) {
self.phoneNumberTextField.textColor = .lightGray
self.phoneNumberTextField.text = "+1 55555"
}
DispatchQueue.main.asyncAfter(deadline: .now()+4.5) {
self.phoneNumberTextField.textColor = .lightGray
self.phoneNumberTextField.text = "+1 555 555"
}
DispatchQueue.main.asyncAfter(deadline: .now()+5) {
self.phoneNumberTextField.textColor = .lightGray
self.phoneNumberTextField.text = "+1 555 5555"
}
DispatchQueue.main.asyncAfter(deadline: .now()+5.5) {
self.phoneNumberTextField.textColor = .lightGray
self.phoneNumberTextField.text = "+1 555 55555"
}
DispatchQueue.main.asyncAfter(deadline: .now()+6) {
self.phoneNumberTextField.textColor = .lightGray
self.phoneNumberTextField.text = "+1 555 555555"
}
DispatchQueue.main.asyncAfter(deadline: .now()+6.5) {
self.phoneNumberTextField.textColor = .lightGray
self.phoneNumberTextField.text = "+1 555 555 5555"
}
}
if isEmpty {
DispatchQueue.main.asyncAfter(deadline: .now(), execute: workItem)
}
if !isEmpty {
workItem.cancel()
}
}
I then called the function in my viewDidLoad() like so:
placeHolder(isEmpty: true)
And the textFieldDidBeginEditing:
func textFieldDidBeginEditing(_ textField: UITextField) {
if textField == phoneNumberTextField {
textField.text = nil
textField.textColor = .label
placeHolder(isEmpty: false)
}
}
I hoped setting is as false would then stop the DispatchQueue, but it did not. Any one have an idea how I will get, what I am aiming for?
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
