私が取り組んでいるアプリでは、現在の私の目標は、キーボードが表示されているときにコンテンツをスクロールし、ユーザーが表示中にスクロールできるようにすることです。私はいくつかの異なる解決策を試しましたが、まだこれを達成できたものはありません。
アプリでストーリーボードを使用しています。ViewController内の要素階層は次のとおりです。
ビューコントローラUIScrollViewUIViewボタン/テキストフィールド/ラベル/UIPickerView
最初に、UIScrollViewのコンテンツサイズを、すべてのフォーム要素を保持しているビューの内部にあるビューと同じサイズに設定しました。それがうまくいかなかったとき、私はコンテンツの高さを手動で320 x 2000に設定して過度に誇張してみました。これも、うまくいきませんでした。スクロールビューでも、ユーザーインタラクションを有効にしてYESに設定しています。これは私がこの時点でそこに持っているコードです。
CGSize contentSize = CGSizeMake(320, 2000);
[self.scrollView setContentSize:contentSize];
スクロールビュー内に、フォーム全体の後ろにあるボタンがあり、ユーザーがキーボードの外側に触れた場合にキーボードを閉じるアクションがあります。これを無効にして、スクロールを妨げるイベントの競合である可能性があるかどうかを確認しました。繰り返しますが、機能しませんでした。
-(IBAction)closeKeyboard:(id)sender
{
if(![self isFirstResponder]){
[self.view endEditing:YES];
}
}
キーボードが表示または非表示になりそうかどうかを確認するために、オブザーバーを設定することもできました。オブザーバーは、キーボードが現在置かれている場所に基づいて、コンテンツサイズではなく、スクロールビュー自体だけで、スクロールビューの高さを調整します。したがって、この時点では、スクロールビューのコンテンツは、スクロールビュー自体よりもはるかに高くなりますが、それでもスクロールは発生しません。
これが私のオブザーバーのコードです:
// adjust view based on keyboard
- (void)keyboardWillHide:(NSNotification *)n
{
NSDictionary* userInfo = [n userInfo];
// get the size of the keyboard
CGSize keyboardSize = [[userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
// resize the scrollview
CGRect viewFrame = self.view.frame;
// I'm also subtracting a constant kTabBarHeight because my UIScrollView was offset by the UITabBar so really only the portion of the keyboard that is leftover pass the UITabBar is obscuring my UIScrollView.
//viewFrame.size.height += keyboardSize.height;
CGRect scrollRect = CGRectMake(viewFrame.origin.x, viewFrame.origin.y, viewFrame.size.width, viewFrame.size.height + keyboardSize.height + 100);
[UIScrollView beginAnimations:nil context:NULL];
[UIScrollView setAnimationBeginsFromCurrentState:YES];
[UIScrollView setAnimationDuration:0.3];
[self.scrollView setFrame:scrollRect];
self.scrollView.userInteractionEnabled = YES;
[UIScrollView commitAnimations];
keyboardShowing = false;
}
- (void)keyboardWillShow:(NSNotification *)n
{
// This is an ivar I'm using to ensure that we do not do the frame size adjustment on the UIScrollView if the keyboard is already shown. This can happen if the user, after fixing editing a UITextField, scrolls the resized UIScrollView to another UITextField and attempts to edit the next UITextField. If we were to resize the UIScrollView again, it would be disastrous. NOTE: The keyboard notification will fire even when the keyboard is already shown.
if (keyboardShowing) {
return;
}
NSDictionary* userInfo = [n userInfo];
// get the size of the keyboard
CGSize keyboardSize = [[userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
// resize the noteView
CGRect viewFrame = self.view.frame;
// I'm also subtracting a constant kTabBarHeight because my UIScrollView was offset by the UITabBar so really only the portion of the keyboard that is leftover pass the UITabBar is obscuring my UIScrollView.
CGRect scrollRect = CGRectMake(viewFrame.origin.x, viewFrame.origin.y, viewFrame.size.width, viewFrame.size.height - keyboardSize.height - 100);
//scrollView.frame.size.height -= keyboardSize.height;
//viewFrame.size.height -= keyboardSize.height;
[UIScrollView beginAnimations:nil context:NULL];
[UIScrollView setAnimationBeginsFromCurrentState:YES];
[UIScrollView setAnimationDuration:0.3];
[self.scrollView setFrame:scrollRect];
self.scrollView.userInteractionEnabled = YES;
[UIScrollView commitAnimations];
keyboardShowing = YES;
}
これが私の心を滑らせ続ける単純な間違いの1つであるとしても驚かないでしょうが、この種のアクセシビリティ機能はアプリにあると本当に素晴らしいでしょう。どんな助けでも大歓迎です、あるいは私が解決しようとしている問題に対する他の可能な解決策も素晴らしいでしょう。