В приложении, над которым я работаю, сейчас моя цель - прокручивать контент, когда отображается клавиатура, и позволять пользователям прокручивать их во время показа. Я пробовал несколько разных решений, и никто еще не смог этого достичь.UIScrollView не получает действие прокрутки
Я использую раскадровки в приложение и здесь иерархия элементов в контроллере представления:
View Controller UIScrollView UIView Кнопки/текстовые поля/этикетки/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;
}
Я не удивлюсь, если это одна из тех простых ошибок, которые держит скользя мой разум, но это своего рода особенность доступности будет очень приятно иметь в приложении. Любая помощь будет высоко оценена, или даже другие возможные решения проблемы, которую я пытаюсь решить, тоже будут полезны.
вы inlcude 'UIScrollViewDelegate' в интерфейсе? – ant
Ничего себе. Конечно, это было бы что-то простое ... - Спасибо! Его приятно иметь второй набор глаз. –
Новая проблема, хотя при повторном включении крана для закрытия кода клавиатуры прокрутка не работает из-за действия крана. Как мне получить приложение, чтобы сказать разницу? –