SearchBar / UITableView的iOS7键盘行为:辅助视图外观上的偏移

时间:2014-04-26 19:24:43

标签: ios7 keyboard uisearchbar uisearchdisplaycontroller uiresponder

问题

我对iOS7键盘外观有一个相当大的问题。我在UIViewController上有一个带有TableView委托/数据源设置的搜索栏(我也使用了self.searchDisplayController委托)。我将这个场景转换为原型tableview以显示结果。

问题在于:

首次加载时,我可以看到当我点击UISearchBar的文本字段时显示的键盘。我可以输入并执行搜索,结果显示在下一个场景中。

我添加了NSNotifications以查看本地方法keyboardWillShow和keyboardWasShown中的键盘属性。我可以看到第一个场景外观(在视图完全加载后):

Keyboard Shown

此时我转到结果表视图,当我向后导航并触摸文本字段时,我的键盘全部或部分显示在屏幕外:

Partial Keyboard

当我看到keyboardWillShow通知时,我可以看到我的键盘值不正确:

Second round through

我研究并尝试过许多可能性,包括:

在我的主视图控制器中添加了以下内容:

-(BOOL)canResignFirstResponder
{
    return YES;
}
-(BOOL)canBecomeFirstResponder
{
    return YES;
}

在我的视图中配置了以下功能

self.searchDisplayController.searchBar.spellCheckingType = UITextSpellCheckingTypeNo;
    self.searchDisplayController.searchBar.autocapitalizationType=  UITextAutocapitalizationTypeNone;
    self.searchDisplayController.searchBar.autocorrectionType = UITextAutocorrectionTypeNo;
    self.searchDisplayController.searchBar.keyboardType = UIKeyboardTypeDefault;

为标准存根添加:

-(void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView
-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar

我注意到如果我选择Partial Curl作为我的segue模式,当我回滚到主视图控制器时键盘仍可访问(但在那种情况下它从未完全脱离屏幕)。但是,如果我从结果表视图移动到细节场景然后导航回主视图控制器,键盘将再次出现在屏幕外。

问题

是否有一种方法可以用来拦截放错位置的键盘,使其显示在默认位置?

注意:沿着这些方向,我创建了一个NSDictionary属性来保存具有正确键盘位置的初始userInfo值。我不确定如何重新分配这些值以使键盘返回其原始位置。

BTW - 由于IB中的一个错误,这似乎是一个修复键盘的黑客攻击,还有其他一些方法我可以尝试纠正这种情况吗?

提前感谢您的任何反馈!

1 个答案:

答案 0 :(得分:0)

<强>解决方案

这是一个晦涩难懂的问题,我正在分享解决方案,以便为下一个人付出一些努力。像大多数编程问题一样,事实证明这个问题是自我造成的。在我这个项目的原始迭代中,我已经关闭了旋转支持,因为我正在学习自动布局,并且我希望能够轻松实现从Springs和Struts的过渡。不知何故,在项目开始和代码发布之间,我在主场景的视图控制器中找到了这段代码。

//BAD
- (NSUInteger) supportedInterfaceOrientations  
{
    return !UIInterfaceOrientationPortraitUpsideDown;
}

而不是返回有效的枚举,如...

//OK
- (NSUInteger) supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAll;
}