2017-10-11 3 views
0

コンテキスト 私は2つのテキストフィールドをスタックビューで持っています。いずれかをタップすると、両方を同時に上に動かす必要があります。アニメーションの状態を追跡する方法

1つのテキストフィールドから次のテキストフィールドに切り替えると、両方のテキストフィールドを同じ場所に置いておきたいと思います。これは、キーボードが消されたときにのみ元に戻ります。

両方のテキストフィールドに独自のデリゲートがあるため、1つずつ次へクリックすると下向きのアニメーションがわずかにジャンプします。ジャンプは私が削除したいバグです。

私が試したこと: アニメーションが既に発生しているかどうかを確認するBoolを作成しました。しかし、自己付着した状態を変えるだけでなく、方法でそれを引き起こすことは機能していないようです。

func didAnimate() { 
    self.isAnimated = true 
    print("Didanimate result:" + String(isAnimated)) 
} 

func animateUp() { 
    // moves views up to avoid keyboard 
    UIView.animate(withDuration: 0.5, 
        delay: 0, 
        options: .curveEaseOut, 
        animations: { 
        self.textFieldsY.constant += 200 
        //print("~~~~~~~~~") 
        self.view.layoutIfNeeded() 
        self.didAnimate() 
        print(self.isAnimated) 
    }, completion: { (finished: Bool) in 
     self.isAnimated = true 
    }) 
} 

func animateDown() { 
    // moves views down after keyboard leaves 
    UIView.animate(withDuration: 1, 
        delay: 0, 
        options: .curveEaseOut, 
        animations: { 
        self.textFieldsY.constant -= 200 
        self.view.layoutIfNeeded() 
        self.isAnimated = false 
    }, completion: nil) 
} 

//MARK:- Text Field delegate 
func textFieldDidBeginEditing(_ textField: UITextField) { 
    if (keyBoardIsVisible) { 
     // no need to animate anything 
    } else { 
     self.animateUp() 
     self.keyBoardIsVisible = true 
    } 
    print("initial animate result:" + String((isAnimated))) 

} 
func textFieldDidEndEditing(_ textField: UITextField) { 
    if(keyBoardIsVisible) { 
    animateDown() 
     self.keyBoardIsVisible = false 
    } 
} 
+0

イメージとしてあなたのコードを投稿しないでください。実際のテキストをコピーしてあなたの質問に貼り付けてください。画像は読みにくく、検索できず、コードを参照またはコピーできません。 – rmaddy

+0

画像のスクリーンショットを投稿しないでください。 – user3287355

+0

フィードバックありがとう – codechef

答えて

0

は、キーボードのアニメーションを処理するためにtextFieldDidBeginEditingtextFieldDidEndEditingを使用しないでください。 2番目のテキストフィールドに切り替えるたびにtextFieldDidEndEditingが呼び出されるためです。

私はより良いアプローチは、スウィフト3に、これらの2つの通知を使用して、このシナリオを処理するためにローカル通知を使用するようになると思う。

override func viewDidLoad() { 
    super.viewDidLoad() 

    NotificationCenter.default.addObserver(self, selector: #selector(YourController.keyboardWillShow(sender:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil) 
    NotificationCenter.default.addObserver(self, selector: #selector(YourController.keyboardWillHide(sender:)),name: NSNotification.Name.UIKeyboardWillHide, object: nil) 
} 

func animateUp() { 
    // moves views up to avoid keyboard 
    UIView.animate(withDuration: 0.5, 
       delay: 0, 
       options: .curveEaseOut, 
       animations: { 
        self.textFieldsY.constant += 200 
        //print("~~~~~~~~~") 
        self.view.layoutIfNeeded() 
        print(self.isAnimated) 
    }, completion: { (finished: Bool) in 
    }) 
} 

func animateDown() { 
    // moves views down after keyboard leaves 
    UIView.animate(withDuration: 1, 
        delay: 0, 
        options: .curveEaseOut, 
        animations: { 
        self.textFieldsY.constant -= 200 
        self.view.layoutIfNeeded() 
    }, completion: nil) 
} 


func keyboardWillShow (notification: NSNotification) { 
    if (keyBoardIsVisible) { 
    return 
    } else { 
     self.animateUp() 
     self.keyBoardIsVisible = true 
    } 
    print("initial animate result:" + String((isAnimated))) 

} 

func keyboardWillHide (notification: NSNotification) { 
    if(keyBoardIsVisible) { 
    animateDown() 
    self.keyBoardIsVisible = false 
    } 
} 
+0

この場合、通知センターを使用する利点については理解していません。 – codechef

+0

トリガーとしてデリゲートを使用していない場合、どのようにこれらの通知を配置するのか分かりますか? – codechef

関連する問題