基于键盘外观自动滚动tableview内容

时间:2018-03-27 08:34:39

标签: ios uitableview xcode9 uikeyboard caret

在我的主视图控制器中,我提供了一个弹出窗口,它是一个UITableviewcontroller类,并且有一个可调整大小的textview作为其中一个单元格。现在随着内容的增长和文本视图的扩展,键入内容超出了键盘,并且在屏幕上看不到。为了解决这个问题,我计算了光标位置和键盘位置,并根据调整了tableviews内容偏移量,以便在键入时开始偏移调整以显示键盘上方的输入内容。它似乎工作,但根据我的逻辑现在的问题是,当有一个大内容,如果光标在底部,如果你滚动回顶部并开始键入光标保持在底部,它不会#39 ; t刚刚滚动到那里,因为我刚刚调整了20pt空间到内容偏移量。我不确定如何根据光标点计算tableview的内容偏移量。以下是我的代码。任何帮助表示赞赏。

-(void)adjustTextScroll:(UITextView *)textView
{
    UITextRange *selectedTextRange = textView.selectedTextRange;
    CGRect windowRect = CGRectZero;
    if (selectedTextRange != nil)
    {
        CGRect caretRect = [textView caretRectForPosition:selectedTextRange.end];

        windowRect = [textView convertRect:caretRect toView:nil]; 

    }


    //Checks if current cursor position is behind keyboard position
    if (CGRectGetMinY(windowRect) > (keyboardYpos - 50)) // 50 added for space difference margin from keyboard
    {

        CGPoint contentOffset = self.tableView.contentOffset;
        contentOffset.y += 20 ;
        self.tableView.contentOffset = contentOffset;

    }

}


//Keyboard notification 
- (void)keyboardWasShown:(NSNotification *)notification
{

    // Get the size of the keyboard.
    CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    CGFloat height = MIN(keyboardSize.height,keyboardSize.width);
    CGFloat mainViewHeight = MAX([[UIScreen mainScreen]bounds].size.width,[[UIScreen mainScreen] bounds].size.height);

    keyboardYpos = mainViewHeight - height;

}

- (void)textViewDidChange:(UITextView *)textView{
    [self adjustTextScroll:textView]
}

1 个答案:

答案 0 :(得分:1)

使用TPKeyboardAvoiding并让它处理所有滚动问题。我自己已经开发了很多使用它的应用程序。像魅力一样。