2016-07-21 5 views
1

Я хотел бы иметь трехмерное касание обоих представлений коллекции моего приложения (только функциональность «Peek»). Они оба содержатся в одном контроллере. Независимо от того, какой синтаксис я стараюсь, он всегда отображает изображение и текст для ячейки в первом представлении коллекции, даже если я выбираю ячейку во втором представлении коллекции. Как отделить их так, чтобы только один был выбран специально для ячейки коллекции, которую я выбрал?Внедрение 3D-прикосновений к нескольким представлениям коллекции или представлениям таблиц в одном и том же контроллере представления

Вот как я реализую 3D-функциональность сенсорного:

я положил это в viewDidAppear VC, потому что он не работает в viewDidLoad по какой-то причине:

override func viewDidAppear(animated: Bool) { 

    if(traitCollection.forceTouchCapability == .Available){ 

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

} 

Вот что у меня есть в ВК, что дома два collectionviews:

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 of what's happening

+1

Проверьте, находится ли первое место в 'colletionView1' или' collectionView2'. Например, если CGRectContainsPoint (collectionView1.frame, location) {// обрабатывает collectionView1} else, если CGRectContainsPoint (collectionView2.frame, location) {// handle 2} ' – beyowulf

ответ

4

Это то, что я сделал в моем проекте.

У меня есть scrollView в верхней части viewController и tableView внизу. И я хотел бы, чтобы двое из них приняли взгляд и поп. Итак, вот что я сделал.

Во-первых, вам нужно добавить UIViewControllerPreviewingDelegate в viewController, что вы хотите реализовать функцию peek и pop.

Во-вторых, зарегистрировать вид контейнера (обычно self.view) по телефону

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

В-третьих, вы конвертировать CGPoint мнение о системе координат для любой точки зрения, что вы хотели бы иметь заглянуть и поп-функцию в previewingContext делегатом

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

Например:

а. Преобразование CGPoint на self.view в точку внутри tableView

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

b. После того, как вы это сделаете, вы можете проверить, находится ли tableViewPoint внутри tableView, получить tableViewCell из tableViewPoint и что-то сделать с ним.

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 
} 

А затем сделать точно так же, с точки зрения прокрутки, то вы будете иметь возможность заглянуть и поп-музыки как для Scrollview и Tableview в том же ViewController.

Последний реализации второго делегата для поп-музыки

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

Это работает для меня идеально. Надеюсь, это поможет вам.

Смежные вопросы