2017-07-20 14 views
2

アニメーションを使用して長いUITextViewの一番下にカーソルを設定する方法を見つけようとしています。それを設定することはそれほど難しくありませんでした。実際、この答えはとてもうまくカバーしています。 https://stackoverflow.com/a/34922332/563381アニメーションとスクロール位置でUITextView selectedTextRangeを設定するにはどうすればいいですか?

しかし、それをアニメーション化するのは簡単ではありません。私が見つけることができるsetSelectedTextRange(animated:)はありません。 UIView.animate...ブロック内に設定することは何もしないようです。私が思いつくことができる最高の方法は、手動でスクロールをアニメートし、完了時にselectedTextRangeを設定することです。しかし、これは壊れやすく、しばしば不安定になり、時には全く動作しないように見えます。

selectedTextRangeを設定すると、その場所にジャンプします。そのジャンプを回避する方法があった場合、アニメーションはよりスムーズになり、遅延を必要としないので少なくとも脆弱ではなく、selectedTextRangeを設定するのを待たずにsetContentOffset(animated)を使用することができます。

もう1つの方法は、selectedTextRangeジャンプをアニメーション化する方法を見つけることです。このフロントでは、前にスクロールを無効にして後で再度有効にするというトリックを試みましたが、それは私のためにはうまくいかないようでした。それはiOSの後のバージョンで変更されています。

答えて

1
あなたは:)アニメーションsetContentOffset(_、を使用してscrollViewDidEndScrollingAnimationとアニメーションの終了を検出し、そのようなカーソルを設定することができ

// The action to scroll down 
@IBAction func test(_ sender: Any) { 

    let offset = self.textView.contentSize.height - self.textView.frame.height 
    self.textView.setContentOffset(CGPoint(x: 0, y: offset), animated: true) 
} 

// Setting the cursor down 
func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) { 

    let offset = self.textView.contentSize.height - self.textView.frame.height 

    if scrollView.contentOffset == CGPoint(x: 0, y: offset) { 
     let newPosition = textView.endOfDocument 
     self.textView.selectedTextRange = self.textView.textRange(from: newPosition, to: newPosition) 
    } 
} 
あなたはあなたのビューコントローラにUITextViewDelegateを追加し、設定する必要があります

TextViewのデリゲート:私はアニメーションがどのように長い間心配する必要はありませんので、 `完了ブロックを待っているよりも少し良いです:` scrollViewDidEndScrollingAnimation(scrollView)を使用して

textView.delegate = self 
+0

。しかし、私はこれがアニメーション化している最中にカーソルを残さないクリーナーを愛しています。 –

+0

アニメーション中ではなく、アニメーションの後にカーソルが表示されることがどのように重要であるかわかりません。あなたは、アニメーションが私が思っている間にあなたのユーザーの入力をしたくないですか?アニメーションの進行中は実際にカーソルを無効にする必要があります。 @RyanPoolos –

+0

@RyanPoolosこれがあなたを助けたら答えを受け入れてください –

関連する問題