2016-05-26 9 views
1

こんにちはに変更キーボードアニメーションの再生時間、そこのUITextField

をタップしたとき、私はUITextFieldをタップするとき、キーボードのアニメーションの再生時間を増やす/減らすしようとしています。

  1. 私はtextFieldShouldBeginEditing(textField: UITextField) -> Bool内部のアニメーションの再生時間を設定しようとしましたが、私は再び呼び出すtextField.becomeFirstResponder()を呼び出そうとして、私は無限ループを得た: は、私は別のものを試してみましたが、私は自分の目標を達成するために管理することができませんでした私はこの方法でアニメーションを設定

  2. などfunc textFieldShouldBeginEditing(textField: UITextField) -> Boolは...手遅れのようなキーボードは(名前がUIKeyboardWillShowNotificationですNSNotificationへの対応)を示すために起こっているが、それは見えたときにトリガー

  3. 私は追加することを考えていたUITapGestureRecognizerへの私の私は、私が意味する、私は 『アニメーションをトリガー』と言うとき、それはネイティブUITextFieldのジェスチャー認識

と競合することaffraidだが、アニメーションをトリガーするUITextField

UIView.animateWithDuration(10.0, animations: { 
      textField.becomeFirstResponder() 
     }) 

私は今何をすべきか分かりませんが、このアニメーションの時間を変更するのはかなり難しいようです。

任意の提案は本当にいただければ幸いです:)

答えて

2

シンプルなソリューション、ちょうどいくつかのチェックを行うことを覚えて、becomeFirstResponderをオーバーライドします。

例。

class MyTextField: UITextField{ 

    override func becomeFirstResponder() -> Bool { 
     // guard clause 
     if(!self.canBecomeFirstResponder()) { return false } 

     UIView.animateWithDuration(1.0, animations: { 
      super.becomeFirstResponder() 
     }) 

     return true; 
    } 
} 

ただ、uは好きなものにアニメーションパラメータを変更し、これがmyTextFieldとあなたのTextFieldを交換してください。

+0

なぜスーパーコールを次のrunloopに延期していますか? 'becomeFirstResponder'はメインスレッド上でのみ呼び出されます。 –

+0

それはメインスレッドで実行する必要がありますが、奇妙な、私が試した最後の時間、それは他のスレッドで実行され、警告をスローしていた。 もう一度試してみます。メインスレッドで実行しています。 この場合、dispatch_async(dispatch_get_main_queue()) – Codebear

+0

コードを更新する必要はありません。テストしたときにテストされます 1.テキストフィールドのユーザタップ 2. textfield.becomeFirstResponder(アニメーションブロックの有無にかかわらず動作します)を呼び出します – Codebear

関連する問題