1

我有一个自定义继承UIView类,其中一个UITableView作为其唯一的子视图。我试图模仿UITableViewController显示键盘时的正常功能,以将表格视图的contentInset和调整scrollIndicatorInsets到键盘的高度。这是我在自定义UIView类中显示键盘时调用的方法:

- (void)keyboardDidShow:(NSNotification*)notification
{
    NSDictionary* info = [notification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
    _tableView.contentInset = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);
    _tableView.scrollIndicatorInsets = _tableView.contentInset;
}

这在一定程度上有效,但由于某种原因,键盘与表格视图仍有一些重叠,可能有十个左右的像素。

键盘重叠

我认为这与不考虑其他一些屏幕几何形状有关,但我不明白这是怎么回事。键盘的高度应该正是我所需要的,因为 tableView 一直延伸到屏幕底部。有任何想法吗?

4

2 回答 2

1

更改 tableView.frame.size.height,以考虑键盘。

键盘显示时降低高度,不显示时增加高度。

如果您想考虑所有可能性的键盘高度,请参阅此http://www.idev101.com/code/User_Interface/sizes.html

不要乱用 contentInset 和 scrollIndicatorInsets。只需设置 frameSize 即可为您处理这些问题。

这就是你的方法应该是的

- (void)keyboardDidShow:(NSNotification*)notification
{
    NSDictionary* info = [notification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
    CGRect rect = _tableView.frame;
    rect.size.height = _tableView.frame.size.height - kbSize.height;
    _tableView.frame = rect;
}

- (void)keyboardWillHide:(NSNotification*)notification
{
    NSDictionary* info = [notification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
    CGRect rect = _tableView.frame;
    rect.size.height = _tableView.frame.size.height + kbSize.height;
    _tableView.frame = rect;
}

我已经将这段代码用于类似的功能。因此,如果它仍然无法正常工作,那么还有其他问题。

于 2012-12-16T21:46:19.647 回答
0

我很好奇为什么这对你不起作用,因为我基本上有同样的东西,它对我有用。我只能看到一个区别,即我不访问“_tableView”,而是确保我始终使用 getter 和 setter。

这就是我所做的,这是有效的。

- (void)keyboardDidShow:(NSNotification *)keyboardNotification
{
    NSDictionary *info = [keyboardNotification userInfo];
    CGSize keyboardSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;

    CGFloat newBottomInset = 0.0;

    UIEdgeInsets contentInsets;
    if (UIDeviceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation]) ) {
        newBottomInset = keyboardSize.height;
    } else {
        newBottomInset = keyboardSize.width;
    }

    contentInsets = UIEdgeInsetsMake(0.0, 0.0, newBottomInset, 0.0);
    self.tableView.contentInset = contentInsets;
    self.tableView.scrollIndicatorInsets = contentInsets;
}

请注意,我的应用程序允许设备旋转,当发生这种情况时,使用的值需要是键盘的宽度,因为这些值是相对于纵向的,这给我带来了数小时的困惑。

希望self.tableView访问会有所作为。

于 2013-06-18T14:29:08.250 回答