在 tvos 中更改焦点时如何关闭 UISearchController 中的键盘?
Posted
技术标签:
【中文标题】在 tvos 中更改焦点时如何关闭 UISearchController 中的键盘?【英文标题】:How to dismiss keyboard in UISearchController when changing focus in tvos? 【发布时间】:2015-12-21 13:14:23 【问题描述】:我对 tvos 完全陌生,我正在尝试实现一个 UISearchController 视图,其中在我的 SearchResultsViewController 中,我有两个 UICollectionViews 一个显示在另一个之上:
问题是当用户向下滑动以选择 UICollectionView 中的一项时,键盘不会关闭。即使向上滑动以选择键盘也不会完全向上滚动,并且无法看到您正在输入的内容。结果视图是这样的:
理想情况下,我希望在用户向下滑动以专注于界面中的其他任何内容时关闭键盘。我查看了 Apple 的 tvos UIKit Catalog,他们的示例显示了一个 UISearchController,它在更改焦点时会关闭键盘,但我没有看到他们在做任何不同的事情。
这是我在用户单击按钮时用来设置 UISearchController 的代码:
@IBAction func onSearchButton(sender: AnyObject)
guard let resultsController = storyboard?.instantiateViewControllerWithIdentifier(SearchResultsViewController.storyboardID) as? SearchResultsViewController else fatalError("Unable to instantiate a SearchResultsViewController.")
// Create and configure a `UISearchController`.
let searchController = UISearchController(searchResultsController: resultsController)
searchController.searchResultsUpdater = resultsController
searchController.hidesNavigationBarDuringPresentation = false
let searchPlaceholderText = NSLocalizedString("Search for a Show or Movie", comment: "")
searchController.searchBar.placeholder = searchPlaceholderText
// Present the search controller from the root view controller.
guard let rootViewController = view.window?.rootViewController else fatalError("Unable to get root view controller.")
rootViewController.presentViewController(searchController, animated: true, completion: nil)
【问题讨论】:
【参考方案1】:经过相当多的反复试验,我终于找到了解决方案。
只要满足以下条件,键盘就会自动关闭: 1) 用户关注的项目在滚动视图内 2) scrollview 内容大小比屏幕高度至少大 1px (1081px)。
【讨论】:
我正在努力解决这个问题,改变滚动视图的内容高度并没有为我解决这个问题。您是如何构建视图控制器的? @AaronStephenson 我也面临同样的问题。你找到解决问题的办法了吗?【参考方案2】:经过相当多的尝试和错误,我终于想通了。 原因是您在 searchResultsController 中有嵌套的 ScrollViews。
“ScrollViews”当然包括 UICollectionView、UITableView 和 UIScrollView。
根据我的调查,UISearchController 的行为如下。
如果在 searchResultsController 中获得焦点的第一个视图是内部 scrollView 的子视图(在您的情况下是水平 UICollectionView),那么 您不会按预期隐藏键盘 .
有趣的是,如果在 searchResultsController 中获得焦点的第一个视图是外部 scrollView 的子视图,那么您将完全隐藏键盘,动画效果,正如预期的那样 (!)。
我认为这是一种 UIKit 的错误。
【讨论】:
【参考方案3】:我的布局完全相同,但目前无法实现。我相信您在 tableView(tableView: UITableView, canFocusRowAtIndexPath indexPath: NSIndexPath) -> Bool 中返回 false 以便集合视图中的每个单元格都可以以适当的焦点行为水平滚动。我认为这实际上是造成问题的原因。如果您使 tableview 中的第一个单元格成为焦点,问题就会消失,但当然不需要焦点行为。我今天才发现这一点,明天会尝试更多,看看我能做些什么。我感觉我需要一个新的设计,允许我使用单个 collectionview 或 tableview,它的单元格在 resultsController 中是可聚焦的。希望这在 tvOS 10 中很容易实现。
【讨论】:
【参考方案4】:解决方案:在 indexPath.row == 0 处添加一个高度为 1 像素的虚拟单元格并启用焦点。
【讨论】:
以上是关于在 tvos 中更改焦点时如何关闭 UISearchController 中的键盘?的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift (tvOS) 中,如何更改 UIButton 的突出显示和焦点颜色?