2016-05-26 14 views
1

私は動的な高さのテキストビューを持っています。ユーザーがテキストを追加または削除すると、テキストビューの高さが変化します。編集時にキーボードの上にテキストビューを表示するSwift

私の問題は、ユーザーがテキストを追加してテキストビューが大きくなるにつれて、キーボードの後ろに消えることです。キーボードが表示されたときにビューを移動して、テキストビューを最初から隠していましたが、高さの変更に合わせてキーボードの上に保持する方法がわからないようです。どんな助けでも大歓迎です!

機能キーボードが表示され、消えたときにビューを移動するには:

func keyboardWillShow(sender: NSNotification) { 
    let info: NSDictionary = sender.userInfo! 
    let value: NSValue = info.valueForKey(UIKeyboardFrameBeginUserInfoKey) as! NSValue 
    let keyboardSize: CGSize = value.CGRectValue().size 
    let contentInsets: UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize.height + 20, 0.0) 
    scrollView.contentInset = contentInsets 

    var aRect: CGRect = self.view.frame 
    aRect.size.height -= keyboardSize.height 
    let activeTextFieldRect: CGRect? = activeItemRect() 
    let activeTextFieldCentre: CGPoint? = CGPointMake(CGRectGetMidX(activeTextFieldRect!), CGRectGetMidY(activeTextFieldRect!)) 
    if (!CGRectContainsPoint(aRect, activeTextFieldCentre!)) { 
     scrollView.scrollRectToVisible(activeTextFieldRect!, animated:true) 
    } 
} 

func keyboardWillHide(sender: NSNotification) { 
    let contentInsets: UIEdgeInsets = UIEdgeInsetsZero 
    scrollView.contentInset = contentInsets 
} 
+0

あなたのtextViewは何に含まれていますか?テーブルビューの場合は、http://stackoverflow.com/questions/18368567/uitableviewcell-with-uitextview-height-in-ios-7 – sschale

+0

を参照してください。テーブルビューではありません。テキストフィールドはコンテンツビューのサブビューであり、コンテンツビューは元のビューの内側にあるスクロールビューのサブビューです。しかし、ありがとう! – m1234

答えて

1

だから何が起こる必要があり、それは外かどう含むscrollViewは、カーソルの変更のたび場所をスクロールするように指示する必要があるということです境界。私はリンクから、これを行うための関数を呼び出しました。 scrollViewは、自分の名前に置き換えてください。

internal func scrollToCursorForTextView(textView: UITextView) { 
    var cursorRect = textView.caretRectForPosition(textView.selectedTextRange!.start) 
    cursorRect = scrollView.convertRect(cursorRect, fromView: textView) 
    if !self.rectVisible(cursorRect) { 
     cursorRect.size.height += 8 
     scrollView.scrollRectToVisible(cursorRect, animated: true) 
    } 
} 

internal func rectVisible(rect: CGRect) -> Bool { 
    var visibleRect = CGRect() 
    visibleRect.origin = scrollView.contentOffset 
    visibleRect.origin.y += scrollView.contentInset.top 
    visibleRect.size = scrollView.bounds.size 
    visibleRect.size.height -= scrollView.contentInset.top + scrollView.contentInset.bottom 
    return CGRectContainsRect(visibleRect, rect) 
} 
+0

ありがとう、間違いなくこれを試してみてください!しかし、これらの関数はどのように呼び出されますか?私はそれらを聞くための通知を追加する必要がありますか? – m1234

+0

textViewの境界が変更されたときはいつでも呼び出すことができます。そこに適切なメソッドがない場合は、 'UITextFieldDelegate'メソッドを使用してください。 – sschale

+0

私はテキストビューの高さを変更するために使用したメソッドで試しましたが、何も起こらず、UITextViewDelegateメソッドで何も起こらず、何も起こりませんでした。 – m1234

関連する問題