菜鸟教程小白 发表于 2022-12-11 18:30:25

ios - 有视频: After Peek and Pop (3D Touch) background keeps scrolling


                                            <p><p>错误视频:<a href="https://www.dropbox.com/s/zn4h1xmv3ts3lqa/IMG_0046.MOV?dl=0" rel="noreferrer noopener nofollow">Video</a> </p>

<p>我有一个带有 UITableViewCells 的常规表格 View 。它看起来像消息。我有另一个 ViewControllerOperationDetailsViewController。</p>

<p>在 TableView 委托(delegate)中我有这个:</p>

<pre><code>// need that dict for 3D touch
var dict_previwingControllers_cellIsKey = ()

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 = 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 {
            unregisterForPreviewing(withContext: previwingController)
      }
    }
}
</code></pre>

<p>要在用户点击消息背景时显示预览,我有这个:</p>

<pre><code>/// Create a previewing view controller to be shown at &#34;Peek&#34;.
func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -&gt; 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: &#34;OperationDetailsVC&#34;) 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&#39;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 &#34;Pop&#34; action.
func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController) {
    // Reuse the &#34;Peek&#34; view controller for presentation.
    show(viewControllerToCommit, sender: self)
}
</code></pre>

<p>但是当用户使用 3D Touch 时,背景会像视频一样滚动</p>

<p>这很奇怪,因为在 iMessage 应用程序中它不会发生</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我尝试过使用默认的 tableView,但我没有这种情况。也就是说,当我3d触摸我的tableView单元格时,它会弹出detailView,并且背景 View (tableView)不可滚动。</p>

<p>另外,您不必注册预览每个单元格,您可以一次注册整个 tableview 单元格。</p>

<pre><code>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) -&gt; Int {
      return 1
    }

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -&gt; UITableViewCell {
      let cell = tableView.dequeueReusableCell(withIdentifier: &#34;cell&#34;, for: indexPath)
      cell.textLabel?.text = &#34;Hello World&#34;
      return cell
    }
}
</code></pre>

<p><strong>预览委托(delegate)</strong> </p>

<pre><code>extension ViewController: UIViewControllerPreviewingDelegate {
    func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -&gt; 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: &#34;OperationDetailsVC&#34;) 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)
    }
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 有视频: After Peek and Pop (3D Touch) background keeps scrolling,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/41498924/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/41498924/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 有视频: After Peek and Pop (3D Touch) background keeps scrolling