2017-03-29 11 views
1

テキストフィールドの幅の制約をアニメートするときに、私のUITextFieldのテキストが最終位置にジャンプする(アニメーション化しない)グリッジが発生しています。このGIFを見てみましょう:「成長」ボタンをタップすると幅の制約をアニメートすると、UITextFieldのテキストがジャンプする

enter image description here

を、テキストフィールドの幅が大きくなります。しかし、「こんにちは世界」は、そこを滑るのではなく、すぐに中央に飛びます。 「縮小」ボタンをタップすると、「hello world」が直ちに左に戻ります。

私のアニメーション機能は、次のようになります。

func animateGrowShrinkTextFields(grow: Bool) { 
    if grow { 
     UIView.animate(withDuration: 0.5, animations: { 
      self.widthConstraint.constant = 330 
      self.view.layoutIfNeeded() 
     }, completion: nil) 
    } else { 
     UIView.animate(withDuration: 0.5, animations: { 
      self.widthConstraint.constant = 100 
      self.view.layoutIfNeeded() 
     }, completion: nil) 
    } 
} 

私は次のリストの提案を試してみました。それらのどれも働かなかった。

  1. この回答で提案されているように私は、アニメーションブロックの前と内self.view.layoutIfNeeded()self.helloWorldTextField.layoutIfNeeded()と呼ばれる:https://stackoverflow.com/a/32996503/2179970
  2. この回答で提案されているように私はself.view.layoutSubviewsself.helloWorldTextField.layoutSubviewを試してみました:https://stackoverflow.com/a/30845306/2179970
  3. はまた、私はsetNeedsLayout()UITextField text jumps iOS 9
  4. を試してみましたここでも示唆しているようにフォントを変更しようとしました:https://stackoverflow.com/a/35681037/2179970
  5. 私は試しましたresignFirstResponderここで示唆したように(それはfirstResponderを伴うべきではありませんので、私は、私のテストでテキストフィールドをタップしたり、編集しないけれどもけれども):ここに見られるように、私はUITextFieldのサブクラス化しようとしたhttps://stackoverflow.com/a/33334567/2179970
  6. https://stackoverflow.com/a/40279630/2179970
  7. 私もUILabelを使用してみましたし、同じ跳ね上がりの結果を得ました。

次の質問にも鉱山と非常によく似ていますが、まだ答えを持っていません。ここでUITextfield text position not animating while width constraint is animated

はGithubの上の私のプロジェクトである:私は「https://github.com/starkindustries/ConstraintAnimationTest

+0

'self.view.layoutIfNeeded()'にコメントしましたか?通常、あなたはこれを必要としません... –

+0

@JimmyJamesはい私は持っています。 'self.view.layoutIfNeeded()'がなければ、textField全体がアニメーション化されず、すぐに拡大/縮小されます。 –

+0

Humm、ok。それから私の悪い^^。 Yourwidth制約は 'UITextField'の幅です。そして、この 'UITextField'は' text center 'propetryを持っていますか? –

答えて

0

ソリューションのデモ

実際の解決策を見つけました。ちょっとハッキリしているように感じますが、うまくいきます。ここに最終結果のGIFがあります。 helloWorldTextFieldには青色の境界線があり、その背後の2番目のテキストフィールド内にその位置が示されています。

enter image description here

手順

2つのテキストフィールドください:helloWorldTextField(質問から元)とborderTextField(新しいテキストフィールドを)。 helloWorldTextFieldsのボーダーと背景色を削除します。 borderTextFieldのボーダーと背景色を維持します。センターhelloWorldTextFieldborderTextFieldにあります。次に、borderTextFieldの幅をアニメーション化します。ここでhttps://github.com/starkindustries/ConstraintAnimationTest

がMyViewControllerクラス内のコードである:ここでは

GithubのリンクとコードはGithubの上のプロジェクトです。ストーリーボードには他のすべてがセットアップされており、上のリンクでGithubで見ることができます。この溶液に私を導いた何

class MyViewController: UIViewController { 

    // Hello World TextField Border var 
    @IBOutlet weak var borderTextFieldWidth: NSLayoutConstraint! 

    // Button Vars 
    @IBOutlet weak var myButton: UIButton! 
    var grow: Bool = false 

    func animateGrowShrinkTextFields(grow: Bool, duration: TimeInterval) { 
     if grow { 
      UIView.animate(withDuration: duration, animations: { 
       self.borderTextFieldWidth.constant = 330 
       self.view.layoutIfNeeded() 
      }, completion: { (finished: Bool) in 
       print("Grow animation complete!") 
      }) 
     } else { 
      UIView.animate(withDuration: duration, animations: { 
       self.borderTextFieldWidth.constant = 115 
       self.view.layoutIfNeeded() 
      }, completion: { (finished: Bool) in 
       print("Shrink animation complete!") 
      }) 
     } 
    } 

    @IBAction func toggle(){ 
     let duration: TimeInterval = 1.0 
     grow = !grow 
     let title = grow ? "Shrink" : "Grow" 
     myButton.setTitle(title, for: UIControlState.normal) 
     animateGrowShrinkTextFields(grow: grow, duration: duration) 
    } 
} 

ノートおよびリファレンス

JimmyJamesさんのコメント@だった:「あなただけのUITextField幅をアニメーション化されますが、内部のコンテンツがアニメーションされていません」

私は、フォントの変更をアニメーション化する方法を研究し、この質問に出くわした:@CSmithはhttps://stackoverflow.com/a/19251634/2179970

という点で受け入れ答え、「あなたがFRAME、ないtextAlignmentをアニメーション化することができます」と述べて、その質問にはIs there a way to animate changing a UILabel's textAlignment?

質問は、別のフレーム内でUILabelを使用することを示唆しています。 https://stackoverflow.com/a/19251735/2179970

これは、この問題に遭遇する他の人に役立ちます。誰かがこれを解決する別の方法を持っている場合は、コメントや別の回答を投稿してください。ありがとう!

+0

解決策が見つかりました:) –

+0

はい、ありがとうございます! :) –

関連する問題