2012-06-25 6 views
1

В приложении, над которым я работаю, сейчас моя цель - прокручивать контент, когда отображается клавиатура, и позволять пользователям прокручивать их во время показа. Я пробовал несколько разных решений, и никто еще не смог этого достичь.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; 
} 

Я не удивлюсь, если это одна из тех простых ошибок, которые держит скользя мой разум, но это своего рода особенность доступности будет очень приятно иметь в приложении. Любая помощь будет высоко оценена, или даже другие возможные решения проблемы, которую я пытаюсь решить, тоже будут полезны.

+2

вы inlcude 'UIScrollViewDelegate' в интерфейсе? – ant

+0

Ничего себе. Конечно, это было бы что-то простое ... - Спасибо! Его приятно иметь второй набор глаз. –

+0

Новая проблема, хотя при повторном включении крана для закрытия кода клавиатуры прокрутка не работает из-за действия крана. Как мне получить приложение, чтобы сказать разницу? –

ответ

0

Похоже, вы используете распознаватель жестов в IB, чтобы обнаружить внешнее событие крана. Поскольку этот распознаватель находится в наивысшем виде в иерархии, он переопределяет детекторы scrollview. Возможно, вам придется немного изменить его в зависимости от того, какие области вы хотите использовать, чтобы закрыть клавиатуру.

Это UIResponder class reference. В нем перечислены все события UIResponder, которые автоматически наследует ваш контроллер вида. Что может решить вашу проблему, это подклассификация вашего UIScrollView и добавление к нему кода закрытия клавиатуры. Кроме того, убедитесь, что вы установите его для первого ответчика.

Окончательный код, который работал:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    mouseSwiped = NO; 
    UITouch *touch = [touches anyObject]; 
    if ([touch tapcount] == 1) 
     for(UIView *view in self.view.subviews){ 
      if([view isKindOfClass:[UITextField class]]){ 
       [view resignFirstResponder]; 
      } 
     } 
    } 
} 
+0

Я добавил ваш код с несколькими настройками, чтобы соответствовать тому, как настроено мое представление, но все равно никаких изменений. Touch touch по-прежнему закрывает клавиатуру вместо прокрутки представления. –

+0

В какой класс вы добавили код в/был исходный код? Кроме того, вы удалили распознаватель жестов? – Dustin

+0

Это был не распознающий жест, это была кнопка, которая сидела за всеми остальными элементами. в любом случае, да, я удалил это. Код находится в контроллере представления, который я использую. Можно ли заставить программу различать типы событий, подобных этому в одном и том же пространстве? –

Смежные вопросы