标题可能不是因为实际问题正义,因为可能存在完全不同的解决方案。
我们要做的是创建像地图视图这样的类似于视图的视图,当您按某个Annotation
时,数据将显示在集合视图中的屏幕底部。在集合视图中或通过点击注释选择注释时。选定的注释将比所有其他注释更大。要完成所有这些操作,我们的didSelect
和didDeselect
委托方法如下所示
func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
if view.annotation!.isKind(of: MKUserLocation.self) {
return
}
if view.isSelected {
view.transform = CGAffineTransform(scaleX: annotationSizeMultiplier, y: annotationSizeMultiplier)
}
if !isVisible {
isVisible = true
UIView.animate(withDuration: 0.25, animations: {
self.collectionViewBackground.frame.size.height += self.height
self.collectionViewBackground.frame.origin.y -= self.height
self.customCallout.frame = self.collectionViewBackground.frame
}, completion: { _ in
self.customCallout.showCollectionCell(self, annotationTitle: ((view.annotation?.title)!)!)
})
} else {
customCallout.showCollectionCell(self, annotationTitle: ((view.annotation?.title)!)!)
}
}
func mapView(_ mapView: MKMapView, didDeselect view: MKAnnotationView) {
if !view.isSelected {
view.transform = CGAffineTransform.identity
}
}
然而,我们想要做的是在地图视图上没有注释的地方点击时隐藏集合视图。然而,我们遇到的问题是我们实际上并不知道用户是否选择了另一个注释,或者只是在地图视图中随机点击,因为didDeselect
之前正在调用didSelect
。
我们确实通过一个非常讨厌的解决方案解决了这个问题,我们对此并不满意,您可以在下面看到。
func mapView(_ mapView: MKMapView, didDeselect view: MKAnnotationView) {
if !view.isSelected {
view.transform = CGAffineTransform.identity
}
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1, execute: {
if mapView.selectedAnnotations.count == 0 {
self.isVisible = false
UIView.animate(withDuration: 0.25, animations: {
self.collectionViewBackground.frame.size.height -= self.height
self.collectionViewBackground.frame.origin.y += self.height
self.customCallout.frame = self.collectionViewBackground.frame
})
}
})
}
我们希望有人知道一个更好的解决方案来实际解决这个问题"正确"方式。