表视图未正确调整到键盘

时间:2012-12-16 19:27:39

标签: ios uitableview user-interface uikeyboard uiedgeinsets

我有一个自定义的继承UIView类,其中包含UITableView作为唯一的子视图。当键盘显示时,我试图模仿UITableViewController的正常功能,将表视图的contentInsetscrollIndicatorInsets调整到键盘的高度。这是我在自定义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;
}

这在一定程度上起作用,但由于某种原因,键盘在桌面视图上仍有一些重叠,可能是十个像素。

Keyboard Overlap

我认为它与未考虑其他屏幕几何图形有关,但我不知道它是怎么回事。键盘的高度应该是我需要的,因为tableView一直延伸到屏幕的底部。有什么想法吗?

2 个答案:

答案 0 :(得分: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;
}

我已经使用这段代码来实现类似的功能。因此,如果它仍然不起作用,那么还有其他问题。

答案 1 :(得分: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访问能够带来改变。