我有一个自定义的继承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一直延伸到屏幕的底部。有什么想法吗?
答案 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
访问能够带来改变。