1

アプリの両方のコレクション ビューで 3D タッチを使用したいと考えています (「ピーク」機能のみ)。どちらも同じView Controllerに含まれています。どのような構文を試しても、2 番目のコレクション ビューでセルを選択しても、最初のコレクション ビューのセルの画像とテキストが常に表示されます。選択した collectionview セルに対して 1 つだけが発生するように、これらを分離するにはどうすればよいですか?

3Dタッチ機能を実装する方法は次のとおりです。

何らかの理由でviewDidLoadで機能していなかったため、これをVCのviewDidAppearに入れました:

  override func viewDidAppear(animated: Bool) {

  if( traitCollection.forceTouchCapability == .Available){

    registerForPreviewingWithDelegate(self, sourceView: collectionView1)
    registerForPreviewingWithDelegate(self, sourceView: collectionView2)

}

これは、2 つのコレクションビューを収容する VC にもあるものです。

func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {


guard let previewVC = storyboard?.instantiateViewControllerWithIdentifier("PreviewVC") as? PreviewViewController
    else{ return nil }

guard let indexPath = collectionView1?.indexPathForItemAtPoint(location) else { return nil }
guard let indexPath2 = collectionView2.indexPathForItemAtPoint(location) else { return nil }
guard let cell1 = collectionView1?.cellForItemAtIndexPath(indexPath) else { return nil }
guard let cell2 = collectionView2.cellForItemAtIndexPath(indexPath) else { return nil}

    previewVC.selectedItem = String(Gifs.row1[indexPath.row])
    previewVC.selectedItem2 = String(Gifs.row2[indexPath.rown])

    previewVC.preferredContentSize = CGSize(width: 245, height: 200)
    previewingContext.sourceRect = cell1.frame

return previewVC
}

そして、これが私がpreviewVCに持っているものです:

class PreviewViewController: UIViewController {


 @IBOutlet weak var selectedGifImageView: UIImageView!

 @IBOutlet weak var textLabel: UILabel!


 var selectedItem: String?
 var selectedItem2: String?
 var delegate: MoveScrollViewController?

override func viewWillAppear(animated: Bool) {

 textLabel.text = Gifs.gifDictionary[selectedItem]
 selectedGifImageView.setGifImage(UIImage(name: selectedItem))

 textLabel.text = Gifs.gifDictionary[selectedItem2]
 selectedGifImageView.setGifImage(UIImage(name: selectedItem2))

}

何が起こっているかのgif

4

1 に答える 1

4

これが私のプロジェクトで行ったことです。

viewController の上部に scrollView があり、下部に tableView があります。そして、そのうちの 2 つはピークとポップを採用してほしいと思います。それで、以下は私がしたことです。

まず、peek and pop 機能を実装したい viewController に UIViewControllerPreviewingDelegate を追加する必要があります。

次に、呼び出してコンテナー ビュー (通常は self.view) を登録します。

if self.traitCollection.forceTouchCapability == .Available {
    registerForPreviewingWithDelegate(self, sourceView: view)
}

3 番目に、ビュー座標系の CGPoint を、previewingContext デリゲートでピーク アンド ポップ機能を使用する任意のビューに変換します。

func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController?

例えば:

を。self.view の CGPoint を tableView 内のポイントに変換します

let tableViewPoint = tableView.convertPoint(location, fromView: view)

b. このポイントを取得したら、tableViewPoint が tableView 内にあるかどうかを確認し、tableViewPoint から tableViewCell を取得して、何かを行うことができます。

if self.tableView.pointInside(tableViewPoint, withEvent: nil) {
    guard let indexPath =  self.tableView.indexPathForRowAtPoint(tableViewPoint) else {
            return nil
        }

    guard let tableViewCell = self.tableView.cellForRowAtIndexPath(indexPath) else {
            return nil
        }
    // do something with your tableView cell here...
    let yourViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("YOURVIEWCONTROLLER") as! YOURVIEWCONTROLLER

    // set up the contentSize for peek
    yourViewController.preferredContentSize = CGSize(width: 0.0, height: 600)

    // set up the focusing rect for the tableViewCell so that it won't be blurred out.
    let viewPoint = self.view.convertPoint(tableCell.frame.origin, fromView: self.tableView)
    previewingContext.sourceRect = CGRect(origin: viewPoint, size: tableCell.frame.size)
    return yourViewController
}

そして、スクロールビューに対してまったく同じことを行うと、同じviewControllerでscrollViewとtableViewの両方に対してピークとポップを行うことができます。

最後に pop の 2 番目のデリゲートを実装します

func previewingContext(previewingContext: UIViewControllerPreviewing, commitViewController viewControllerToCommit: UIViewController) {
    showViewController(viewControllerToCommit, sender: self)
}

それは私にとって完璧に機能します。うまくいけば、それもあなたを助けるでしょう。

于 2016-11-29T15:40:24.673 に答える