2017-03-04 7 views
1

iOSアプリケーションでは、superviewにバインドされた上下、下、上、下の制約を持つautolayoutを使用してストーリーボードにUIScrollviewを設定しています。スクロールビューの中で私は垂直に積み重ねられた複数のUITextviewsとstackviewを持っています。 scrollviewのcontentsizeはうまく設定されており、上下にスクロールすることもできます。UITextview UIScrollViewに埋め込まれている場合のキーボード処理

ここで私の問題は、キーボードの操作で発生します。私はAppleのドキュメントで推奨キーボードと同じように扱うています:Apple's Keyboard handling documentation

質問にちょうど参考のために、以下に示すが、それはかなりAppleの例の単なるコピー&ペーストだされた特定のコード:

func keyboardDidShow(notification: NSNotification){ 
    var info = notification.userInfo! 
    let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size 
    let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize!.height, 0.0) 

    self.scrollView.contentInset = contentInsets 
    self.scrollView.scrollIndicatorInsets = contentInsets 

    var aRect : CGRect = self.view.frame 
    aRect.size.height -= keyboardSize!.height 
    if self.activeTextView != nil { 
     if (!aRect.contains(self.activeTextView!.bounds)){ 
      self.scrollView.scrollRectToVisible(self.activeTextView!.frame, animated: true) 
     } 
    } 
} 

マイキーボード処理コードはUITextFieldsで正常に動作しますが、UITextFieldsでは機能しません。 self.scrollView.scrollRectToVisible(self.activeTextView!.frame, animated: true)が呼び出されますが、スクロールは発生しません。

私は少しを調査し、AppleはUIScrollViewの内側にUITextViewを埋め込むことをお勧めしていないことが分かった:Placing a text view inside of a scroll view

は、スクロールビューの内側のテキストビューを配置します。テキストビューは、独自のスクロールを処理します。スクロールビューにテキストビューオブジェクトを埋め込むべきではありません。そうすると、2つのオブジェクトのタッチイベントが混在して誤って処理される可能性があるため、予期しない動作が発生する可能性があります。

しかし、私は実際には、UITextFieldsと同じように非表示のtextviewをスクロールする必要があります。助言がありますか??

PS:autolayoutを使用してcontentsizeに合わせてUITextViewsを既に自動調整しているので、UITextViewsのスクロールを無効にしても構いません。

答えて

1

UIScrollViewにUITextViewを埋め込むことは推奨されていませんが、スクロールビューが特定のフレームにスクロールしないようにする必要があります。スクロールしようとしているフレーム(self.activeTextView.frame)が「正しい」かどうかを確認できますか?予想外のUITextView-inside-scrollviewビヘイビアの一部は、textviewのフレームが予期しないものである可能性があります。申し訳ありませんが、私は道路上にあり、私はあなたの問題を再現してより具体的なソリューションを提供しようとすることはできませんが、フレームをチェックし、あなたが期待するものではない場合(ウインドウ内のUITextViewの所在地)あなたのメインビューの親ビューから親ビューのものまで - それが問題なら、UITextViewをUIViewに埋め込み、キーボードが現れたらUIViewのフレームにスクロールして回避することができます。

テスト済みです)...

self.scrollView.scrollRectToVisible(self.activeTextView!.superview!.frame, animated: true) 
0

キーボードを自動的に処理するには、次のスクロールビューを使用することをお勧めします。

https://github.com/michaeltyson/TPKeyboardAvoiding

+0

それは私のユースケースのためにやり過ぎだろうが、良いライブラリのように思えます。おそらく大きなプロジェクトのために。しかし私のユースケースでは、KevinMの答えは素晴らしいものでした。 –

関連する問題