键盘出现时如何在tabelview中滚动?

时间:2017-07-26 06:01:37

标签: objective-c uiscrollview tableview

我有一个ScrollView,其中有TableViews。我设置当键盘出现时,键盘上方的内容应该移动,因此键盘不会遮挡任何东西。如何只在键盘启动时滚动键盘上方的内容?

2 个答案:

答案 0 :(得分:0)

键盘上下时,您需要管理 UITableView 的高度。通知将有助于管理键盘的状态。根据州,我们可以用undpate UITableView的高度

 -(void) keyboardWillShow:(NSNotification *)note{
    // get keyboard size and loctaion
    CGRect keyboardBounds;
    [[note.userInfo valueForKey:UIKeyboardFrameEndUserInfoKey] getValue: &keyboardBounds];
    NSNumber *duration = [note.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey];
    NSNumber *curve = [note.userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey];
    // Need to translate the bounds to account for rotation.
    keyboardBounds = [self.view convertRect:keyboardBounds toView:nil];
    // animations settings
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:[duration doubleValue]];
    [UIView setAnimationCurve:[curve intValue]];
    // set views with new info
    _containerBottom.constant = keyboardBounds.size.height;
    CGRect rectTable = _tblMessages.frame;
    rectTable.size.height -= keyboardBounds.size.height;
    _tblMessages.frame = rectTable;
    [self.view layoutIfNeeded];
    [self scrollToBottom];

    // commit animations
    [UIView commitAnimations];
}

-(void) keyboardWillHide:(NSNotification *)note{

    CGRect keyboardBounds;
    [[note.userInfo valueForKey:UIKeyboardFrameEndUserInfoKey] getValue: &keyboardBounds];
    keyboardBounds = [self.view convertRect:keyboardBounds toView:nil];

    NSNumber *duration = [note.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey];
    NSNumber *curve = [note.userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey];
    // animations settings
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:[duration doubleValue]];
    [UIView setAnimationCurve:[curve intValue]];


    CGRect rectTable = _tblMessages.frame;
    rectTable.size.height += keyboardBounds.size.height;
    _tblMessages.frame = rectTable;
    // commit animations
    [UIView commitAnimations];
}
    - (void)viewWillAppear:(BOOL)animated
    {
        [super viewWillAppear:animated];
        // register for keyboard notifications
            [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWillShow:)
                                             name:UIKeyboardWillShowNotification
                                           object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWillHide:)
                                             name:UIKeyboardWillHideNotification
                                           object:nil];

    }

    - (void)viewWillDisappear:(BOOL)animated
    {
        [super viewWillDisappear:animated];
        // unregister for keyboard notifications while not visible.
        [[NSNotificationCenter defaultCenter] removeObserver:self
                                                 name:UIKeyboardWillShowNotification
                                               object:nil];

        [[NSNotificationCenter defaultCenter] removeObserver:self
                                                 name:UIKeyboardWillHideNotification
                                               object:nil];
    }

答案 1 :(得分:0)

您可以添加添加观察者以检查键盘是否显示。

 NotificationCenter.default.addObserver(self,
    selector: #selector(viewController.keyboardWillShow(notification:)),
    name: NSNotification.Name.UIKeyboardWillShow, object: nil)

NotificationCenter.default.addObserver(self,
    selector: #selector(viewController.keyboardWillHide(notification:)),
    name: NSNotification.Name.UIKeyboardWillHide, object: nil)

func keyboardWillShow(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo? [UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
    print("Show") 
  }
}

 func keyboardWillHide(notification: NSNotification) {
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
    print("Hide")
  }
}

然后你需要对内容进行计算,以显示键盘出现的时间并设置scrollview的内容偏移量。