2017-04-05 3 views
0

동일한 페이지에서 컬렉션보기와지도보기를 포함하는 신속한 앱을 제작하고 있습니다. 사용자는 컬렉션보기를 스크롤하여 쿠폰을 볼 수 있으며 (앱의 목적)지도보기에는 쿠폰의 실제 위치가 표시된 특수 효과 핀이 채워집니다.Swift에서 mapKit 주석을 CollectionView에 연결하는 데 도움이 필요합니다.

내 문제는 컬렉션보기 셀을 올바른 주석에 연결하는 것이 어렵다는 것입니다.

내가 아래지도에에게 주석을 추가 :

for location in self.queryDataMapAnnotations { 
      let annotation = MKPointAnnotation() 
      annotation.title = location["title"] as? String 
      annotation.subtitle = location["distance"] as? String 
      annotation.coordinate = CLLocationCoordinate2D(latitude: location["latitude"] as! Double, longitude: location["longitude"] as! Double) 
      self.mapView.addAnnotation(annotation) 

     } 

그때 컬렉션을 스크롤 할 수 있습니다보기 세포

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 

     // get a reference to our storyboard cell 
     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath as IndexPath) as! MyCollectionViewCell 


     // Connect cell to the linked annotation 

     // ** This links to a random annotation, but not the correct one - need help on this please ** 
     self.mapView.selectAnnotation(self.mapView.annotations[row], animated: true) 

    } 

중 하나는 컬렉션을 연결하는 방법에 나를 도울 수 있다면 올바른지도 주석을 보려면 가장 도움이 될 것입니다. 나는 그 언어로 도울 수있는 신속한 (조금) 것을 알고 있습니다. 감사합니다

+0

콜렉션 셀이 ** 탭 **되었을 때 주석을 강조 표시하려는 목적은 무엇입니까? 현재 잘못된 콜렉션 뷰 dataSource 메소드에서'selectAnnotation()'을 호출하기 때문에. – nshuman

+0

아니요, 사용자가 컬렉션 뷰를 스크롤 할 때 특수 효과를 선택하는 것이 목적입니다. 따라서 사용자가 첫 번째 컬렉션보기 셀로 스크롤하면 해당 주석이 선택되고 제목과 부제가 표시됩니다. 사용자가 두 번째 셀, 세 번째 등으로 스크롤 할 때 계속됩니다. –

답변

0

스크롤 할 때 활성지도 주석을 변경하고 수직 중심의 콜렉션 셀을 현재 표시된 것으로 간주하려는 경우 - 여기에 나와있는 방식이 있습니다.

참고 : 나는 그것을 테스트하지 않았다, 내가 유사한 기능, 사용자가 스크롤 근처에 거래되고으로 이동한다지도보기의 카메라의 목록이 표시 collectionview했다

func scrollViewDidScroll(_ scrollView: UIScrollView) { 
    if scrollView is UICollectionView { 
     let collectionViewCenter = CGPoint(x: collectionView.bounds.size.width/2 + collectionView.contentOffset.x, y: collectionView.bounds.size.height/2 + collectionView.contentOffset.y) 
     let centredCellIndexPath = collectionView.indexPathForItem(at: collectionViewCenter) 

     guard let path = centredCellIndexPath else { 
      // There is no cell in the center of collection view (you might want to think what you want to do in this case) 
      return 
     } 

     if let selectedAnnotation = mapView.selectedAnnotations.first { 
      // Ignore if correspondent annotation is already selected 
      if selectedAnnotation.isEqual(self.mapView.annotations[path.row]) { 
       self.mapView.selectAnnotation(self.mapView.annotations[path.row], animated: true) 
      } 
     } 
    } 
} 
+0

이것은 cellForItemAt 대리자 메소드에서 'selectAnnotation'을 갖는 것과 동일한 기능을 수행합니다. 문제는 솔루션과 내 솔루션 모두에서 선택된 주석이 올바르지 않다는 것입니다. 그래서 셀 1이 보일 때, 주석 3이 선택된다. 셀 2로 스크롤하면 주석 5가 선택됩니다 (예제는 무작위이지만 그림이 표시됩니다. 주석과 셀 데이터의 정렬이 잘못되어 있기 때문에 두 링크를 동기화 할 수있는 방법을 만들어야합니다. 감사합니다 다시. 감사합니다 –

+0

실제로 내 방식이 잘못되었다고 생각했습니다. 업데이트 된 대답을 확인하고 기회를주세요. – nshuman

+0

@StevenH 실제로이 행에 대해 하나 이상의 수정이 필요할 수 있습니다. let collectionViewCenter = CGPoint (x : collectionView.bounds.size.width/2 + collectionView.contentOffset.x, y : collectionView.bounds.size.height/2 + collectionView.contentOffset.y)'확실하지 않습니다. – nshuman

0

단지 기본적인 아이디어 컬렉션 뷰에서 현재 표시 거래의 위치, 다음은

func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>){ 
     /* set pagewidth to collectionview cell width*/ 
     let pageWidth = collectionView.bounds.width 
     let currentOffset : Float = Float(scrollView.contentOffset.x) 
     let targetOffset = Float(targetContentOffset.memory.x) 
     var newTargetOffset : Float = 0.0 

     if targetOffset > currentOffset { 
      newTargetOffset = ceilf(currentOffset/(pageWidth)) * pageWidth 
      /* if colelctionview swipped right increment the curentlyVisibleIndex*/ 
     //dealList is array of Model objects used to populate the 
       //CollectionView 
      if currentlyVisibleIndex != (dealList.count - 1) { 
       currentlyVisibleIndex += 1 
      } 
     } 
     else{ 
      newTargetOffset = floorf(currentOffset/(pageWidth)) * pageWidth 
      /*if collectionview swipped left decrement the currentlyVisibleCounter */ 
      if currentlyVisibleIndex != 0 { 
       currentlyVisibleIndex -= 1 
      } 
     } 
     if newTargetOffset < 0{ 
      newTargetOffset = 0 
     }else if newTargetOffset > Float(scrollView.contentSize.width){ 
      newTargetOffset = Float(scrollView.contentSize.width) 
     } 
     targetContentOffset.memory.x = CGFloat(currentOffset) 
     scrollView.setContentOffset(CGPoint(x: CGFloat(newTargetOffset), y: 0), animated: true) 

     moveCameraToDealLocation() 
     // re initialise the annotations of mapView 
     let annotationArray = mapBoxViewController.mapView.annotations 
     mapBoxViewController.mapView.removeAnnotations(annotationArray) 
     mapBoxViewController.mapView.addAnnotations(annotationArray) 
    } 

    func moveCameraToDealLocation(){ 
     mapBoxViewController.moveMapViewCameraToLocation(CLLocationCoordinate2D(latitude: dealList[currentlyVisibleIndex].eventLatitude, longitude: dealList[currentlyVisibleIndex].eventLongitude)) 
    } 

currentlyVisibleIndex 나에게 현재 표시 거래 (주석)의 인덱스를 제공 내 구현 설명를 functi on moveCameraToDealLocation은 MapView 카메라를 해당 주석으로 이동합니다. 이것이 작동하는지 알려주세요 :)