2016-06-20 9 views
0

私は、入力フィールドでのautolayoutの使用方法に関する記事に基づいて、内部にUIViewを持つUIScrollViewを持っています。この資料では、詳細については、UIViewを同じ高さに設定し、通常のビューで設定する方法について説明します。https://www.natashatherobot.com/ios-autolayout-scrollview/キーボードによるUIScrollViewの高さ

私はコンテンツビュー内に複数のUITextFieldを持っています。私がUITextFieldを押すと、キーボードを表示してUITextFieldにスクロールするためのビューが必要になります。最初は複数のアプローチを試しましたが、問題は画面の一番下で、不要なビューの下から空白スペースがたくさんあります。私が試したのアプローチは、次の行使用されています。これを変更するには

- (void)keyboardWillHide:(NSNotification *)notification { 
    [[self scrollView] setContentInset:UIEdgeInsetsMake([[self scrollView] contentInset].top, 0.0f, 0.0f, 0.0f)]; 
} 

- (void)keyboardWillShow:(NSNotification *)notification { 
    [[self scrollView] setContentInset:UIEdgeInsetsMake([[self scrollView] contentInset].top, 0.0f, [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size.height, 0.0f)]; 
} 

を、私はより適切な値に下を変更すると、トリックを行うだろうと思ったが、私はこれを行う際に、ビューはにスクロールしません。 UITextFieldをもう一度押してください。私は手動でフィールドをスクロールすることができます。私はこれを達成方法は、以下を使用している:

- (void)keyboardWillShow:(NSNotification *)notification { 
    float keyboard = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size.height; 
    float offset = [[[[self contentView] subviews] lastObject] frame].size.height + [[[[self contentView] subviews] lastObject] frame].origin.y + 30.0f; 

    if ([[self contentView] frame].size.height - [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size.height < offset) { 
     [[self scrollView] setContentInset:UIEdgeInsetsMake([[self scrollView] contentInset].top, 0.0f, offset - ([[self view] frame].size.height - keyboard), 0.0f)]; 
    } 
} 

誰もがスクロールしたとき、私はUITextFields下の空白を無視することができる方法を知っているが、scrollviewを選択するUITextFieldにスクロールすることができません。私はscrollRectToVisibleメソッドを使ってみましたが、これは何もしません。

+0

https://github.com/michaeltyson/TPKeyboardAvoiding library、super easyを使用してください。スクロール・ビューのカスタム・クラスとしてTPKeyboardAvoidingScrollViewを設定するだけで、キーボードが表示されたときに管理する必要があるすべてのものが処理されます。 –

+0

ライブラリをありがとう、しかし、ライブラリを含めることなくそれを行う方法はありますか?私は、コードを使用してみましたが、scrollviewは入力フィールドにスクロールしますが、スクロールビューはジャンプし、ライブラリから提供されたコードを使用すると上からスクロールします。 – Sietse

答えて

0

上記の回答は古くなっています。スクロールしても完璧ではありません。

ここはすばらしいバージョンです。

テキストフィールドのすぐ下にスクロールします。スペアスペースはありません。そして、それは最初の登場のように元に戻るでしょう。

//add observer 
override func viewDidLoad() { 
    super.viewDidLoad() 

    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ARVHttpPlayVC.keyboardDidShow(_:)), name: UIKeyboardDidShowNotification, object: nil) 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ARVHttpPlayVC.keyboardDidHide(_:)), name: UIKeyboardDidHideNotification, object: nil) 
} 

func keyboardDidShow(notification: NSNotification) { 
    let userInfo: NSDictionary = notification.userInfo! 
    let keyboardSize = userInfo.objectForKey(UIKeyboardFrameEndUserInfoKey)!.CGRectValue.size 

    //calculate the space it needs to show the firstResponder textField completely 
    var difference: CGFloat 
    if inputTextField1.isFirstResponder() == true { 
     difference = keyboardSize.height - (self.view.frame.height - inputTextField1.frame.origin.y - inputTextField1.frame.size.height) 
    } else if inputTextField2.isFirstResponder() == true { 
     difference = keyboardSize.height - (self.view.frame.height - inputTextField2.frame.origin.y - inputTextField2.frame.size.height) 
    } else { 
     difference = keyboardSize.height - (self.view.frame.height - inputTextField3.frame.origin.y - inputTextField3.frame.size.height) 
    } 
    //if the textField frame under the keyboard, so scroll up to show it 
    if difference > 0 { 
     var contentInset:UIEdgeInsets = self.scrollView.contentInset 
     contentInset.bottom = difference 
     self.scrollView.contentInset = contentInset 

     let scrollPoint = CGPointMake(0, difference) 
     self.scrollView.setContentOffset(scrollPoint, animated: true) 
    } 

} 

func keyboardDidHide(notification: NSNotification) { 
    let contentInset:UIEdgeInsets = UIEdgeInsetsZero 
    self.scrollView.contentInset = contentInset 
} 

//remove observer 
deinit { 
    NSNotificationCenter.defaultCenter().removeObserver(self) 
} 
関連する問題