избегать просмотра при открытии клавиатуры из UITextView внутри UITableView с пользовательской ячейкой - PullRequest
1 голос
/ 21 ноября 2011

У меня есть UIViewController, который содержит UITableView с пользовательскими ячейками, внутри ячейки находятся UILabels, пара не редактируемых UITextView и одна редактируемая UITextView.Теперь, когда я нажимаю на одну из UITextView, которая находится рядом с нижней или нижней частью стола, клавиатура покрывает UITextView.Я пробовал http://cocoawithlove.com/2008/10/sliding-uitextfields-around-to-avoid.html, который отлично работает для текстового поля / textview, но не работает на таблице с пользовательской ячейкой.Любая помощь или предложения, как это сделать?

Ответы [ 5 ]

1 голос
/ 17 августа 2015
I fixed the issue. Please see my solution below:

1. First declare a global varibale called "activeFileld"
@property(nonatomic,strong)id activeFiled;

2. Create a method called "registerForKeyboardNotifications"
- (void)registerForKeyboardNotifications 
{
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(keyboardWillShow:)
                                                     name:UIKeyboardWillShowNotification object:nil]; //Posted immediately prior to the display of the keyboard

        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(keyboardWillHide:)
                                                     name:UIKeyboardWillHideNotification object:nil]; //Posted immediately prior to the dismissal of the keyboard.
}

3. Called the above method in viewWillAppear:

-(void)viewWillAppear:(BOOL)animated{

  [super viewWillAppear:animated];
  //Register kryboard Notification
   [self registerForKeyboardNotifications];
}
4. Call the Delegate method for UitextFieldd Or UitextView

- (void)textFieldDidBeginEditing:(UITextField *)sender {

        self.activeField = sender;
}
- (void)textFieldDidEndEditing:(UITextField *)sender{
        self.activeField = nil;
}

- (void)textViewDidBeginEditing:(UITextView *)textView
{
    // save the text view that is being edited
    _notes = textView.text;

}
- (void)textViewDidEndEditing:(UITextView *)textView
{
    // release the selected text view as we don't need it anymore
    _activeField = nil;
}

5.

- (void)keyboardWillShow:(NSNotification *)notification
{

    if([_activeField isKindOfClass:[UITextField class]]) {

        NSDictionary* info = [notification userInfo];
        NSLog(@"Dictionary %@",info);
        CGRect kbRect = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue];
        kbRect = [self.view convertRect:kbRect fromView:nil];

        UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbRect.size.height, 0.0);
        self.tableView.contentInset = contentInsets;
        self.tableView.scrollIndicatorInsets = contentInsets;

        CGRect aRect = self.view.frame;
        aRect.size.height -= kbRect.size.height;

        UITextField *textField = (UITextField*)_activeField;
        if (!CGRectContainsPoint(aRect, textField.frame.origin) ) {
            [self.tableView scrollRectToVisible:textField.frame animated:YES];
        }
    }else if([_activeField isKindOfClass:[UITextView class]]) {

        NSDictionary* info = [notification userInfo];
        NSLog(@"Dictionary %@",info);
        CGRect kbRect = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue];
        kbRect = [self.view convertRect:kbRect fromView:nil];

        UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbRect.size.height, 0.0);
        self.tableView.contentInset = contentInsets;
        self.tableView.scrollIndicatorInsets = contentInsets;

        CGRect aRect = self.view.frame;
        aRect.size.height += kbRect.size.height;

        UITextView *activeTextView = (UITextView*)_activeField;
        if (!CGRectContainsPoint(aRect, textField.superview.superview.frame.origin) ) {
            [self.tableView scrollRectToVisible:activeTextView.superview.superview.frame animated:YES];

       }


   }





}

// Called when the UIKeyboardWillHideNotification is received
- (void)keyboardWillHide:(NSNotification *)aNotification
{
    UIEdgeInsets contentInsets = UIEdgeInsetsZero;
    self.tableView.contentInset = contentInsets;
    self.tableView.scrollIndicatorInsets = contentInsets;
}
0 голосов
/ 05 декабря 2012

Если ваше табличное представление содержит поля ввода данных, такие как UITextField или UITextView, а табличное представление достаточно длинное, чтобы покрыть экран, у вас будет проблема с доступом к полям ввода данных, которые скрыты клавиатурой.
Чтобы решить эту проблему, есть два решения:

  1. Самый простой и рекомендуемый способ - использовать UITableViewController вместо UIViewController, что автоматически гарантирует, что клавиатура не будет скрытаредактируемое поле ( Если возможно, используйте этот подход, чтобы избежать неудобств при настройке пользовательского интерфейса )

  2. Если вы используете UIViewController и UITableView в качестве его подпредставления.Вы можете прокрутить кадр вашего пользовательского интерфейса, наблюдая за UIKeyboardWillShowNotification и UIKeyboardWillHideNotification

    - (void)registerForKeyboardNotifications 
    {
            [[NSNotificationCenter defaultCenter] addObserver:self
                                                     selector:@selector(keyboardWillShow:)
                                                         name:UIKeyboardWillShowNotification object:nil]; //Posted immediately prior to the display of the keyboard
    
            [[NSNotificationCenter defaultCenter] addObserver:self
                                                     selector:@selector(keyboardWillHide:)
                                                         name:UIKeyboardWillHideNotification object:nil]; //Posted immediately prior to the dismissal of the keyboard.
    }
    
    
    - (void)keyboardWillShow:(NSNotification *)aNotification 
    {  
        CGRect keyboardBounds = [[[aNotification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue];
    
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationBeginsFromCurrentState:YES];
    
        self.tableView.contentInset = UIEdgeInsetsMake(0, 0, keyboardBounds.size.height, 0); //when keyboard is up, that time just bring your text filed above the keyboard
        self.tableView.scrollIndicatorInsets = UIEdgeInsetsMake(0, 0, keyboardBounds.size.height, 0);
    
        [self.tableView scrollToRowAtIndexPath:[self findIndexPathToScroll]
                              atScrollPosition:UITableViewScrollPositionTop
                                      animated:YES]; //findIndexPathToScroll implementation not shown
        [UIView commitAnimations];
    }
    
    - (void)keyboardWillHide:(NSNotification *)aNotification 
    {
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationBeginsFromCurrentState:YES];
        self.tableView.contentInset = UIEdgeInsetsZero; //Once keyboard is hidden then bring back your table into your original position.
        self.tableView.scrollIndicatorInsets = UIEdgeInsetsZero;
        [UIView commitAnimations];
    }
    
    • registerForKeyboardNotifications - вызовите этот метод при загрузке UITableView, то есть: viewDidLoad

    • findIndexPathToScroll - (Реализация не показана) Это ваша бизнес-логика для подготовки IndexPath, где табличное представление должно прокручиваться

    • removeObserver 'UIKeyboardWillShowNotification' и 'UIKeyboardWillHideNotification' обав dealloc и viewDidUnload
0 голосов
/ 21 ноября 2011

Простое решение. Реализуйте метод heightForFooter и дайте ему вернуть значение (скажем) 100, и когда вы выделите ячейку в UITableView, они просто сдвинутся на эту высоту, и клавиатура не закроет вид.

0 голосов
/ 21 ноября 2011

Я всегда использовал для этого двойное решение.

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

Для этого я регистрирую события показа / скрытия клавиатуры и действую соответствующим образом при их вызове.

- (void)keyboardWillShow:(NSNotification *)note {
    [self updateForKeyboardShowHide:note appearing:YES];
}
- (void)keyboardWillHide:(NSNotification *)note {
    [self updateForKeyboardShowHide:note appearing:NO];
}

- (void)updateForKeyboardShowHide:(NSNotification *)note appearing:(BOOL)isAppearing {
    // ignore notifications if our view isn't attached to the window
    if (self.view.window == nil)
        return;

    CGFloat directionalModifier = isAppearing?-1:1;
    CGRect keyboardBounds = [[note.userInfo valueForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue];
    CGFloat animationDuration = [[note.userInfo valueForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue];

    // figure out table re-size based on keyboard
    CGFloat keyboardHeight;
    UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
    if (UIInterfaceOrientationIsPortrait(orientation))
        keyboardHeight = keyboardBounds.size.height;
    else 
        keyboardHeight = keyboardBounds.size.width;

    [UIView animateWithDuration:animationDuration animations:^{
        // resize table
        CGRect newFrame = table.frame;
        newFrame.size.height += [self calculateKeyboardOffsetWithHeight:keyboardHeight] * directionalModifier;
        table.frame = newFrame;        
    }  completion:^(BOOL finished){
        // scroll to selected cell
        if (isAppearing) {
            NSIndexPath *indexPath = [NSIndexPath indexPathForRow:textFieldInEdit.tag inSection:0];
            [table scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
        }
    }];
}

- (CGFloat)calulateKeyboardOffsetWithHeight:(CGFloat)keyboardHeight {
    // This depends on the size and position of your table.
    //   If your table happen to go all the way to the bottom of
    // the screen, you'll needs to adjust it's size by the whole keyboard height.
    // You might as well ditch this method and inline the value.
    return keyboardHeight;

    //   My table did not go to the bottom of the screen and the position was
    // change dynamically so and there was long boring calculation I needed to
    // do to figure out how much my table needed to shrink/grow.
}
0 голосов
/ 21 ноября 2011

Два решения:

Предпочтительный : используйте UITableViewController вместо UIViewController, так как он автоматически гарантирует, что ваша клавиатура не будет скрывать редактируемое поле.

Хаки : Как заставить UITextField двигаться вверх при наличии клавиатуры?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...