有视频:在Peek and Pop(3D Touch)背景后滚动

时间:2017-01-06 04:25:31

标签: ios swift uitableview 3dtouch peek-pop

错误视频:Video

我有一个UITableViewCells的常规表视图。它看起来像消息。我有另一个视图控制器OperationDetailsViewController。

在表格视图委托中,我有:

// need that dict for 3D touch
var dict_previwingControllers_cellIsKey = [UITableViewCell: UIViewControllerPreviewing]()

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {

    // setup peek and pop (register proper view)
    if traitCollection.forceTouchCapability == .available, let cellForChat = cell as? OperationsSingleCell {
        let previewingController = registerForPreviewing(with: self, sourceView: cellForChat.viewTextBG)
        dict_previwingControllers_cellIsKey[cell] = previewingController // remember because we need to unregister
    }
}

func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    // setup peek and pop (unregister)
    if traitCollection.forceTouchCapability == .available {
        if let previwingController = dict_previwingControllers_cellIsKey[cell] {
            unregisterForPreviewing(withContext: previwingController)
        }
    }
}

要在用户点按消息背景时显示预览,我有:

/// Create a previewing view controller to be shown at "Peek".
func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
    // Obtain cell by previewing context
    guard let cell = (dict_previwingControllers_cellIsKey as NSDictionary).allKeys(for: previewingContext).first as? OperationsSingleCell else {return nil}
//        guard let indexPath = tableViewMain.indexPathForRow(at: location),
//            let cell = tableViewMain.cellForRow(at: indexPath) as? OperationsSingleCell else { return nil }


    guard let operationDetailsVC = storyboard?.instantiateViewController(withIdentifier: "OperationDetailsVC") as? OperationDetailsVC else {return nil}
    // custom properties
    operationDetailsVC.dbOrder = cell.dbOrder
    operationDetailsVC.navigationControllerOfParentVC = navigationController
    // need to load view so we will know content size
    operationDetailsVC.view.reloadInputViews()

    let contentHeight = operationDetailsVC.scrollViewMain.contentSize.height

    /*
     Set the height of the preview by setting the preferred content size of the detail view controller.
     Width should be zero, because it's not used in portrait.
     */
    operationDetailsVC.preferredContentSize = CGSize(width: 0.0, height: contentHeight)

    // Set the source rect to the cell frame, so surrounding elements are blurred.
    previewingContext.sourceRect = cell.viewTextBG.bounds

    return operationDetailsVC
}

/// Present the view controller for the "Pop" action.
func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController) {
    // Reuse the "Peek" view controller for presentation.
    show(viewControllerToCommit, sender: self)
}

但是当用户使用3D Touch时,背景会像在视频上一样滚动

很奇怪,因为在iMessage应用程序中它并没有发生

1 个答案:

答案 0 :(得分:0)

我尝试过使用默认的tableView,但我没有这种情况。可以这么说,当我触摸我的tableView单元格时,它弹出detailView,后台视图(tableView)不可滚动。

此外,您无需注册预览每个单元格,您只需立即注册整个tableview单元格。

class ViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        if traitCollection.forceTouchCapability == .available {
            registerForPreviewing(with: self, sourceView: tableView)
        }
    }

}

extension ViewController: UITableViewDataSource, UITableViewDelegate {
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 20
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = "Hello World"
        return cell
    }
}

PreviewDelegate

extension ViewController: UIViewControllerPreviewingDelegate {
    func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
        guard let indexPath = tableView.indexPathForRow(at: location) else { return nil }
        guard let cell = tableView.cellForRow(at: indexPath) else { return nil }

        guard let operationDetailsVC = storyboard?.instantiateViewController(withIdentifier: "OperationDetailsVC") as? OperationDetailsVC else { return nil }

        operationDetailsVC.preferredContentSize = CGSize(width: 0, height: 300)
        previewingContext.sourceRect = cell.frame

        // You can decide to return a viewController or nil for certain cell
        return operationDetailsVC

    }

    func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController) {
        show(viewControllerToCommit, sender: self)
    }
}