kem*_*ica 14 uikeyboard swift tvos
看来键盘不必占用整个屏幕,请查看我帖子的问题栏中的UPDATE.谢谢.
使用UITextField在屏幕上放置全屏键盘.
我已经设置了一个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)
}
}
Run Code Online (Sandbox Code Playgroud)
使用UISplitViewController
时我怎样才能让键盘只停留在其中RootViewController
并且不占用整个屏幕?
更新:看来这已在新苹果电视上的Netflix应用程序中实现.键盘位于顶部,占据整个宽度.底部分为两部分.左侧是建议的单词结果,右侧是可能视频的视频封面的集合视图.一切都在用户输入时更新.
如果这被认为是Apple TV的糟糕设计,那么请随时指出原因.
这就是我目前得到的.文本框打开一个占据整个屏幕的键盘.
使用内置SDK方法无法仅在屏幕的一部分上显示键盘.
A UIKeyboard
显示在应用程序窗口上,而不是任何子视图上.要完成所需的行为,请使用反射来获取UIKeyboard
应用程序对象的引用UIWindow
(通过迭代窗口的子视图),并更改其框架以匹配您的宽度RootViewController
.
首先,您可以在此处查看私有UIKeyboard.h tvOS标头.我应该注意到Apple可能有代码来禁用键盘的大小调整(例如在willMoveToWindow:
或didMoveToWindow
等).这是不确定的行为,如果它甚至可以工作,你的milage会有所不同.
您已删除了我对Netflix应用程序的回答的评论,但正如shirefriendship在回答中所说,Netflix可能使用了TVML模板.你可以走这条路,建立一个混合的tvOS/TVML应用程序.此外,你也可以手动建立自己键盘用UICollectionView
在你的RootViewController
.
我终于能够实现这个而无需使用TVML templates
. 最终的解决方案看起来像这样:
总体思路是创建一个UICollectionViewController
带有 a 的UICollectionViewCell
. 然后以编程方式添加键盘并TabViewController
通过您的AppDelegate
.
第 1 步:创建故事板和控制器
打开故事板并创建一个UICollectionViewController
未SearchResultViewController
附加到您的TabViewController
.
在其中创建一个UICollectionViewCell
包含您想要的任何内容的labels
您images
。UICollectionViewCell
应该有一个名为“”的自定义类VideoSearchCell
。
你的 SearchViewController 里面应该没有其他东西。
第 2 步:通过编程方式SearchViewController
添加TabViewController
和实现键盘AppDelegate
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
}
}
Run Code Online (Sandbox Code Playgroud)
添加 SearchResultViewController 的基本框架后,当您运行项目时,您应该能够在搜索视图顶部看到键盘。
第 3 步:处理文本输入并更新结果
您会注意到,在我的文章中filterString
,我使用了一个名为 ScoreVideo 的类和一个 StringSearchService。这些只是我用来过滤视频列表的类(又名:self.vms.videos)。
所以最后,只需filterString
创建一个新的过滤列表并重新加载您的集合视图。
import UIKit
import Foundation
class SearchResultViewController: UICollectionViewController, UISearchResultsUpdating {
//private let cellComposer = DataItemCellComposer()
private var vms: VideoManagerService!
private var filteredVideos = [ScoreVideo]()
static let storyboardIdentifier = "SearchResultViewController"
var filterString = "" {
didSet {
// Return if the filter string hasn't changed.
guard filterString != oldValue else { return }
// Apply the filter or show all items if the filter string is empty.
if self.filterString.isEmpty {
self.filteredVideos = StringSearchService.start(self.filterString, videos: self.vms.videos)
}
else {
self.filteredVideos = StringSearchService.start(self.filterString, videos: self.vms.videos)
}
self.collectionView?.reloadData()
}
}
override func viewDidLoad() {
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
self.vms = appDelegate.getVideoManagerService()
}
// MARK: UICollectionViewDataSource
override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
return 1
}
override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
print("count..\(filteredVideos.count)")
return filteredVideos.count
}
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
// Dequeue a cell from the collection view.
return collectionView.dequeueReusableCellWithReuseIdentifier(VideoSearchCell.reuseIdentifier, forIndexPath: indexPath)
}
// MARK: UICollectionViewDelegate
override func collectionView(collectionView: UICollectionView, willDisplayCell cell: UICollectionViewCell, forItemAtIndexPath indexPath: NSIndexPath) {
guard let cell = cell as? VideoSearchCell else { fatalError("Expected to display a `VideoSearchCell`.") }
let item = filteredVideos[indexPath.row]
cell.configureCell(item.video)
}
override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
dismissViewControllerAnimated(true, completion: nil)
}
// MARK: UISearchResultsUpdating
func updateSearchResultsForSearchController(searchController: UISearchController) {
print("updating... \(searchController.searchBar.text)")
filterString = searchController.searchBar.text!.lowercaseString ?? ""
}
}
Run Code Online (Sandbox Code Playgroud)
如果有不清楚的地方,请随时提出一些问题。我很可能忘记了什么。谢谢。
答案灵感来自苹果示例代码
归档时间: |
|
查看次数: |
1159 次 |
最近记录: |