Peek和Pop正在合作UISearchController.但是,一旦您开始使用表格,Peek和Pop就会停止工作updateSearchResults.
我使用UISearchController演示扩展了Apple的Table Search以支持Peek和Pop作为示例:

问题是当我开始搜索表时,Peek和Pop不再起作用了.它只是选择亮点:

我所做的更新MainTableViewController是:
class MainTableViewController: BaseTableViewController, UISearchBarDelegate, UISearchControllerDelegate, UISearchResultsUpdating {
override func viewDidLoad() {
super.viewDidLoad()
...
if traitCollection.forceTouchCapability == .available {
registerForPreviewing(with: self, sourceView: tableView)
}
}
}
extension MainTableViewController: UIViewControllerPreviewingDelegate {
func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
guard let indexPath = tableView?.indexPathForRow(at: location),
let cell = tableView?.cellForRow(at: indexPath),
let controller = storyboard?.instantiateViewController(withIdentifier: "DetailViewController") as? DetailViewController
else { return nil }
previewingContext.sourceRect = cell.frame …Run Code Online (Sandbox Code Playgroud) 我已经在我的应用程序中实现了窥视和弹出,它完美无缺.但是在不断尝试7-8次时,应用程序冻结在窥视视图上.我唯一的选择是杀死应用程序并重新运行.请让我知道冻结的原因.我在我的项目中使用了以下代码来查看和弹出:
var isPresentedBy3Dtouch: Bool = false
var passedDetails:DetailModel!
func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
guard let indexPath = tableView?.indexPathForRowAtPoint(location)
else { return nil }
guard let cell = tableView?.cellForRowAtIndexPath(indexPath)
else { return nil }
guard let detailViewController = self.storyboard?.instantiateViewControllerWithIdentifier("Navigation") as? UINavigationController
else { return nil }
(detailViewController.topViewController as! DetailViewController).passedDetails = self.customerLists[indexPath.row]
(detailViewController.topViewController as! DetailViewController).isPresentedBy3Dtouch = true
detailVC.preferredContentSize = CGSize(width: 0.0, height: 480.0)
previewingContext.sourceRect = cell.frame
return detailVC
}
func previewingContext(previewingContext: UIViewControllerPreviewing, commitViewController viewControllerToCommit :UIViewController) {
showViewController(viewControllerToCommit, sender: …Run Code Online (Sandbox Code Playgroud) 如何手动触发像使用peek&pop或应用程序快捷方式时发生的单击式振动?
我已经用uicollectionview实现了3D Touch,效果很好。但是,当uisearchController处于活动状态时,3D Touch不起作用。uisearchController使用collectionView显示结果。以下帖子也出现了同样的问题: 3d Peek&Pop搜索结果
有人有同样的问题吗?谢谢
我想出了解决方案:
扩展MyViewController:UISearchControllerDelegate {
func didPresentSearchController(_ searchController: UISearchController) {
if let context = previewingContext {
unregisterForPreviewing(withContext: context)
previewingContext = searchController.registerForPreviewing(with: self, sourceView: self.myCollectionView)
}
}
func didDismissSearchController(_ searchController: UISearchController) {
if let context = previewingContext {
searchController.unregisterForPreviewing(withContext: context)
previewingContext = registerForPreviewing(with: self, sourceView: self.myCollectionView)
}
}
Run Code Online (Sandbox Code Playgroud)
}
在Safari中,如果使用3D触摸,则正在触摸的链接的sourceRect具有圆角.当我将源矩形设置为:func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {在previewingContext上时,我只能设置previewingContext.sourceRect哪些不允许我绕角,或设置多角区域.我怎样才能做到这一点?
我有表视图的一些内容项列表,以及每个项的选项控制器.我在3D触摸上使用此选项控制器或为旧设备长按此选项.我以非常基本的方式实现了它:
extension ViewController {
func checkForForceTouch() {
if #available(iOS 9.0, *) {
if traitCollection.forceTouchCapability == .available {
registerForPreviewing(with: self, sourceView: tableView)
} else {
addLongPressRecognizer()
}
} else {
addLongPressRecognizer()
}
}
...
}
@available(iOS 9.0, *)
extension ViewController: UIViewControllerPreviewingDelegate {
public func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
if let indexPath = tableView.indexPathForRow(at: location) {
let cell = tableView.cellForRow(at: indexPath)!
previewingContext.sourceRect = cell.frame
return self.optionsController(for: indexPath)
} else {
return nil
}
}
public func previewingContext(_ …Run Code Online (Sandbox Code Playgroud) 我有一个聊天应用程序,我使用倒置表视图技术(表视图使用转换缩放到(1,-1),并且所有单元格本身也缩放到(1,-1),中和效果,从而有效地反转表视图以显示底部的"第一个"单元格,从底部"开始"表格视图.一切都很好,除了我需要实现偷看和弹出手势.我已将表格视图单元格中的一个按钮连接到目标视图控制器,并启用了peek和pop,如下所示:
手势有效,但是当我3D触摸部分并保持足够突出被触摸的项目(但不弹出预览视图控制器)时,我得到倒置视图:
如何在仍使用倒置表视图的同时使用正确的变换弹出视图?
在iOS 13中不推荐使用Peek and pop(UIViewControllerPreviewing)。它将替换为新的contextMenuInteraction东西。
那么,如何直接替换偷看和弹出?换句话说,如何将目标视图控制器显示为预览(预览),然后让用户从那里弹出以显示实际的目标视图控制器?
这是我正在尝试的方法,但与旧的“窥视”和“流行乐”不同:
override func viewDidLoad() {
super.viewDidLoad()
let inter = UIContextMenuInteraction(delegate: self)
self.view.addInteraction(inter)
}
func contextMenuInteraction(_ inter: UIContextMenuInteraction,
configurationForMenuAtLocation loc: CGPoint) -> UIContextMenuConfiguration? {
let config = UIContextMenuConfiguration(identifier: "preview" as NSString,
previewProvider: { SecondViewController() }, actionProvider: nil)
return config
}
func contextMenuInteraction(_ interaction: UIContextMenuInteraction,
willCommitWithAnimator animator: UIContextMenuInteractionCommitAnimating) {
// animator.preferredCommitStyle = .pop
if let vc = animator.previewViewController {
animator.addCompletion {
self.present(vc, animated: true, completion: nil)
}
}
}
Run Code Online (Sandbox Code Playgroud)
在此简单测试中,我们可以长按以查看第二个视图控制器的预览,从而成为第一个视图控制器的整个背景视图。发生的是,我们确实看到了预览,用户可以点击它。但是,然后关闭预览,然后显示第二个视图控制器。
那不是偷看。预览和弹出意味着预览 …
我已将3D Touch Peek/Pop功能添加到我的集合视图单元格中并且效果很好,但是我注意到预览框架不尊重单元格的角半径.
这是我的预览功能:
func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
let viewController = storyboard?.instantiateViewControllerWithIdentifier("scholarDetailViewController") as? ScholarDetailViewController
let cellPosition = self.scholarsCollectionView.convertPoint(location, fromView: self.view)
let cellIndex = self.scholarsCollectionView.indexPathForItemAtPoint(cellPosition)
guard let previewViewController = viewController, indexPath = cellIndex, cell = self.scholarsCollectionView.cellForItemAtIndexPath(indexPath) else {
return nil
}
let scholar = self.searchBarActive ? self.searchResults[indexPath.item] as! Scholar : self.currentScholars[indexPath.item]
previewViewController.setScholar(scholar.id)
previewViewController.delegate = self
previewViewController.preferredContentSize = CGSize.zero
previewingContext.sourceRect = self.view.convertRect(cell.frame, fromView: self.scholarsCollectionView)
return previewViewController
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试设置previewingContext sourceView的角半径,并在单元格上使用masksToBounds,但到目前为止我没有尝试过任何帮助.
这是单元设置:
override func awakeFromNib() {
self.layer.cornerRadius = 7 …Run Code Online (Sandbox Code Playgroud)