У вас есть код, который говорит:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if scrollView is UICollectionView {
let collectionViewCenter = CGPoint(x: myMap.bounds.size.width / 2 + myMap.frame.minX, y: myMap.bounds.size.height / 2 + myMap.frame.minY)
let centredCellIndexPath = cafeCollectionView.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
}
// select annotation here, if needed
}
}
Вы устанавливаете collectionViewCenter
в центр карты , , но затем используете его в качестве параметра для indexPathForItem(at:)
Если вы пытаетесь найти centeredCellIndexPath
, вы должны использовать центр bounds
вида коллекции, а не карты.
Если ваша карта, как и приложение AirBnb, имеет другой размер, чем представление коллекции, вы, вероятно, пытаетесь вызвать indexPathForItem(at:)
для CGPoint
, который находится вне bounds
представления коллекции и не получит любые попадания в этом сценарии.
Итак, если вы хотите, например, центр представления коллекции, вы замените назначение collectionViewCenter
на что-то вроде:
let collectionViewCenter = CGPoint(x: cafeCollectionView.bounds.midX,
y: cafeCollectionView.bounds.midY)
Или, если вы хотите поместить эту ячейку в левый край, тогда используйте фиксированное значение x
вместо midX
.
Ваш код для выбора аннотации также не соответствует действительности. Вы делаете:
if let selectedAnnotation = myMap.selectedAnnotations.first {
// Ignore if correspondent annotation is already selected
if selectedAnnotation.isEqual(self.myMap.annotations[path.row]) {
self.myMap.selectAnnotation(self.myMap.annotations[path.row], animated: true)
}
}
Это фактически говорит: «Если выбранная аннотация является той, которую мы хотим, то выберите ее». Я думаю, что вы хотите противоположное, а именно:
- Найдите аннотацию, которую следует выбрать;
- Если он не выбран, сделайте это.