2017-01-06 1 views
5

Tableview, 여러 TableViewCells 및 각 TableViewCell의 viewController, 여러 개의 UICollectionViewItem이있는 UICollectionView가 있습니다. 각 collectionView 항목에는 레이블 및 이미지보기가 있습니다. 나는 3D 터치를 작동 시켜서 사용자와 픽을보고 테이블의 영역을 터치하여 힘을내어 콜렉션 뷰가없는 셀을보고 미리보기하고 하나의 뷰 컨트롤러에 넣은 다음이를 수행 할 수있게하려고합니다. collectionView의 이미지 중 하나를 사용하여 동일한 작업을하지만 다른보기 컨트롤러를 미리보고 팝업합니다. 나는 첫번째 시나리오가 잘 작동하고, touch와 "peek"을 강제로 시작할 때 tableCell이 화면에 선명하게 남아 있습니다. 이 컬렉션 뷰에서 작동하도록 점점 붙어있어, 아무리 내가 이미지 뷰 프레임을 상관없이 첫 번째 tableview 행 날카로운 남아 실제로 관계없이 어떤 행을 누릅니다. 아래 코드 : I 컬렉션보기 항목 이미지보기의 RECT를 얻을 필요하지만 난 그게 테이블 셀에 있기 때문에이 액세스 할 수있는 방법을 같이UITableViewCell의 UICollectionView에 대한 강제 터치

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

    //get the tableviewCell 
    if let tableCellPath = tableView.indexPathForRow(at: location) { 
     print("tableCellPath=", tableCellPath) 
     if let tableCell = tableView.cellForRow(at: tableCellPath) as? VenueMainTableViewCell { 
      //user tapped on a beer in the collectionview 
      if let collectionView = tableCell.collectionView { 
       let collectionPoint = collectionView.convert(location, from: tableView) 
       if let cvPath = collectionView.indexPathForItem(at: collectionPoint) { 
        let collectionViewCell = collectionView.cellForItem(at: cvPath) as? VenueMainCollectionViewCell 

        let cvFrame = collectionViewCell?.itemLabelImageView.frame 

        let bc = storyboard?.instantiateViewController(withIdentifier: "itemDetail") as! ItemDetailViewController 
        let ven = UTcheckin.sharedInstance.Venues[collectionView.tag] 
        let selectedItem = ven.ItemsAtVenue[(collectionViewCell?.tag)!] 
        bc.item = selectedItem 

        previewingContext.sourceRect = cvFrame! 

        return bc 
       } 
      } 
     } 
     if let tablePath = tableView.indexPathForRow(at: location) { 
      //user tapping on a venue, this works 
      previewingContext.sourceRect = tableView.rectForRow(at: tablePath) 
      let vc = storyboard?.instantiateViewController(withIdentifier: "venueDetail") as! VenueDetailViewController 
      vc.venue = UTcheckin.sharedInstance.Venues[tablePath.row] 

      return vc 
     } 
     return nil 
    } 
    return nil 
} 

보인다? 모든 포인터에 미리 감사드립니다.

+0

가 될 ? – Rikh

+0

@Rikh cvFrame : (0.0, 0.0, 60.0, 60.0)에있는 어떤 행에 관계없이 어떤 collectionView 셀에 상관없이 내 cvFrame 값은 동일합니다. 60x60은 collectionView 셀의 imageView 크기이고 0,0에서는 명확한 상태의 상자가 화면 왼쪽 상단에 있습니다. 나는 크기를 얻고 있는데, collectionview 셀의 x, y 값을 tableviewCell (필요한 경우)에서 가져와야합니다. – HH887

답변

5

이 문제에 대한 해결책은 UITableView과 동일하다고 생각합니다. registerForPreviewingWithDelegate 방법을 사용하여 미리보기를 위해 각 셀을 등록해야합니다. cellForRow 방법으로 등록해야합니다.

이것은 매우 유용합니다. 특히 The Solution 단락 : 당신은`UITableView`의 마지막 행의 컬렉션을보기 위해이 작업을 수행 할 때 *의 cvFrame * 값이 나오지 않는 무엇


            How to Peek & Pop A Specific View Inside a UITableViewCell