UITextField的键盘是否必须占据整个屏幕?

时间:2016-04-22 14:52:41

标签: swift tvos uikeyboard

似乎键盘不必占用整个屏幕,请查看我帖子的问题部分中的更新。感谢。

描述

  

使用UITextField在屏幕上放置全屏键盘。

reference

我已经设置了UISplitViewController,我希望RootViewController(又名MasterViewController)拥有显示键盘的UITextField。然后我想在右边搜索结果(在" ResultViewController"(UIViewController)。

这个想法是当用户输入时,提出了结果。

我尝试过的事情:

我首先通过UITextField向我的RootViewController添加了storyboard,但是当我通过textField.becomeFirstResponder()激活键盘时,它占据了整个屏幕。

我想如果我使用UIAlertController我可以解决这个问题,但键盘仍会占据整个屏幕。

class RootViewController: UIViewController {

 override func viewDidLoad() {

    let alertController = UIAlertController(title: "Search", message: "Search for something!.", preferredStyle: UIAlertControllerStyle.Alert)

    alertController.addTextFieldWithConfigurationHandler({(textField: UITextField!) in
        textField.placeholder = "Search"
    })
    self.addChildViewController(alertController)
    alertController.view.frame = self.view.frame
    self.view.addSubview(alertController.view)
 }
}

问题:

使用UISplitViewController时如何让键盘只能停留在RootViewController而不占用整个屏幕?

更新:看来这已经在新苹果电视上的Netflix应用中实现了。键盘位于顶部,占据整个宽度。底部分为两部分。左侧是建议的单词结果,右侧是可能视频的视频封面的集合视图。一切都会在用户输入时更新。

如果这被认为是Apple TV的糟糕设计,那么请随时指出原因。

截屏:

这是我目前得到的。文本框打开一个占据整个屏幕的键盘。

enter image description here

3 个答案:

答案 0 :(得分:6)

使用内置SDK方法无法仅在屏幕的一部分上显示键盘。

应用程序窗口中显示UIKeyboard,而不是其任何子视图。要完成所需的行为,请使用反射来获取应用程序UIKeyboard上的UIWindow对象的引用(通过遍历窗口的子视图),并更改其框架以匹配{{1}的宽度}}

要开始使用,您可以查看私人UIKeyboard.h tvOS标题here。我应该注意到Apple可能有代码来禁用键盘的大小调整(例如在RootViewControllerwillMoveToWindow:中)。这是不明确的行为,如果它甚至可以起作用,你的milage会有所不同。

您已删除了我对Netflix应用程序的回答的评论,但正如shirefriendship在回答中所说,Netflix可能使用了TVML模板。你可以走这条路,建立一个混合的tvOS / TVML应用程序。此外,您还可以使用didMoveToWindow中的UICollectionView自行手动构建键盘。

答案 1 :(得分:4)

Netflix is using TVML Templates to implement their search instead of UIKit. You can accomplish the same aesthetic as Netflix using the searchTemplate. You can learn to mix TVML and UIKit here. Unfortunately the searchTemplate is not customizable enough to conform to your desired layout. There is currently no way to implement your specific layout for the Apple TV.

答案 2 :(得分:4)

简介:

我终于能够实现这一点而无需使用TVML templates。最终解决方案看起来像这样:

text keyboard and results on one view

一般的想法是使用UICollectionViewController创建UICollectionViewCell。然后以编程方式添加键盘并通过TabViewController将其添加到AppDelegate

如何使用结果实现此搜索视图:

第1步:故事板和控制器创建

打开您的故事板并创建UICollectionViewController(自定义类" SearchResultViewController")附加到您的{{1} }。

在其中创建一个TabViewController,其中包含您想要的UICollectionViewCelllabelsimages应该有一个名为" UICollectionViewCell"的自定义类。

你的SearchViewController里面什么都没有。

第2步:将VideoSearchCell添加到SearchViewController并通过TabViewController以编程方式实施键盘

AppDelegate

一旦您添加了SearchResultViewController的基本框架,您就可以在运行项目时在搜索视图的顶部看到键盘。

第3步:处理文字输入和更新结果

您会注意到在class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? override init() { } func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // Override point for customization after application launch. if let tabController = window?.rootViewController as? UITabBarController { tabController.viewControllers?.append(configueSearchController()) } return true } //... standard code in-between func configueSearchController() -> UIViewController { let storyboard = UIStoryboard(name: "Main", bundle: nil) guard let searchResultController = storyboard.instantiateViewControllerWithIdentifier(SearchResultViewController.storyboardIdentifier) as? SearchResultViewController else { fatalError("Unable to instatiate a SearchResultViewController from the storyboard.") } /* Create a UISearchController, passing the `searchResultsController` to use to display search results. */ let searchController = UISearchController(searchResultsController: searchResultsController) searchController.searchResultsUpdater = searchResultsController searchController.searchBar.placeholder = NSLocalizedString("Enter keyword (e.g. Gastric Bypass)", comment: "") // Contain the `UISearchController` in a `UISearchContainerViewController`. let searchContainer = UISearchContainerViewController(searchController: searchController) searchContainer.title = NSLocalizedString("Search", comment: "") // Finally contain the `UISearchContainerViewController` in a `UINavigationController`. let searchNavigationController = UINavigationController(rootViewController: searchContainer) return searchNavigationController } } 我使用了一个名为ScoreVideo和StringSearchService的类。这些只是我用来过滤我的视频列表的类(又名:self.vms.videos)。

最后,只需选择filterString,创建一个新的过滤列表并重新加载您的收藏视图。

filterString

如果某些事情不清楚,请随时提出一些问题。我很可能忘记了什么。感谢。

答案受到apple sample code

的启发