- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 UICollectionViewController,它有一个标题单元格,应该在 map 上显示注释。每个注释都是一个具有关联信息的企业,我想在标题下方的单元格(显示 map 的位置)中显示该企业信息的列表
现在我可以正确加载注释并将注释添加到我的标题单元格中。但我希望能够做的实际上是让 CollectionView 重新加载适当的数据,具体取决于用户在 map 标题中单击的注释。
这是我的标题单元格的代码,我在其中加载 MKMapView 并添加必要的方法来添加注释。
class MapHeaderCell: UICollectionViewCell, MKMapViewDelegate {
let mapView: MKMapView = {
let map = MKMapView()
map.mapType = .standard
map.isZoomEnabled = true
map.isScrollEnabled = true
return map
}()
override init(frame: CGRect) {
super.init(frame: frame)
backgroundColor = .green
addSubview(mapView)
mapView.anchor(top: topAnchor, left: leftAnchor, bottom: bottomAnchor, right: rightAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: 0)
guard let latitude = UserDefaultConstants().latitude, let longitude = UserDefaultConstants().longitude else {
return
}
let coordinate = CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
let region = MKCoordinateRegion(center: coordinate, span: MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01))
mapView.setRegion(region, animated: false)
}
func addAnnotations(businesses: [Business]) {
for business in businesses {
let annotation = MKPointAnnotation()
annotation.title = business.name
annotation.coordinate = CLLocationCoordinate2D(latitude: business.latitude, longitude: business.longitude)
mapView.addAnnotation(annotation)
}
}
//adds annotation to view.
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
guard annotation is MKPointAnnotation else { return nil }
var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: annotationId)
if annotationView == nil {
annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: annotationId)
annotationView!.canShowCallout = true
} else {
annotationView!.annotation = annotation
}
return annotationView
}
}
在另一个类中,我实际上加载了本地企业的数据,然后填充 map 。
class MapCollectionVewController: ListCollectionViewControllerBase {
var coupons = [Coupon]()
var businesses = [Business]()
override func viewDidLoad() {
super.viewDidLoad()
collectionView?.backgroundColor = .white
collectionView?.register(CouponCell.self, forCellWithReuseIdentifier: listCellId)
collectionView?.register(MapHeaderCell.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: mapHeaderId)
getLocalBusinesses()
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
return CGSize(width: view.frame.width, height: 200)
}
//THIS IS WHERE I ADD ANNOTATIONS TO MAP
override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
let header = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionElementKindSectionHeader, withReuseIdentifier: mapHeaderId, for: indexPath) as! MapHeaderCell
header.addAnnotations(businesses: businesses)
return header
}
override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return coupons.count
}
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: listCellId, for: indexPath) as! CouponCell
cell.coupon = coupons[indexPath.item]
cell.hideFavoritesButton()
return cell
}
fileprivate func getLocalBusinesses() {
guard let latitude = UserDefaultConstants().latitude, let longitude = UserDefaultConstants().longitude else {
print("No latitude/longitude value stored for user")
return
}
let url = ConfigKeys.apiBaseURI + "business/nearby"
let params = ["latitude": latitude, "longitude": longitude]
let apiController = APIController(email: UserDefaultConstants().userEmail, token: UserDefaultConstants().userToken)
apiController.makeRequest(type: .get, url: url, parameters: params) { (success, error, data) in
if !success {
print("error with request: ", error ?? "in getLocalBusiness")
}
guard let data = data else {return}
guard let resultsArray = data["result"] as? [[String : Any]] else {return}
for result in resultsArray {
let business = Business(data: result)
self.businesses.append(business)
}
self.collectionView?.reloadData()
}
}
}
所以重申一下:我需要能够根据用户单击的注释在 map View 下方的 Collection View 中加载业务数据。我在这里阅读了一些引导我的解决方案,但无法解决这个问题。
最佳答案
找到了我需要的解决方案。发布以防万一有人也需要这个。有点长,但这在大多数情况下应该有用。
创建此协议(protocol):
protocol MapHeaderCellDelgate {
func didSelectBusiness(id: Int)
}
在 MapHeaderCell 中创建一个作为委托(delegate)的变量。在 MKMapViewDelegate 的 DidSelect 委托(delegate)方法中,只需传递任何 View Controller 中所需的数据。
var delegate: MapHeaderCellDelgate?
func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
if let annotation = view.annotation as? BusinessAnnotation {
print("Your annotation title: \(annotation.businessId)");
guard let businessId = annotation.businessId else {return}
delegate?.didSelectBusiness(id: businessId)
}
}
在我的 View Controller 中,我首先使collectionview符合创建的协议(protocol)(MapHeaderCellDelegate)
class MapCollectionVewController: ListCollectionViewControllerBase, MapHeaderCellDelgate
在 viewForSupplementaryElementOfKind 方法中,确保将标题单元格委托(delegate)设置为 self
override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
let header = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionElementKindSectionHeader, withReuseIdentifier: mapHeaderId, for: indexPath) as! MapHeaderCell
header.delegate = self
header.addAnnotations(businesses: businesses)
return header
}
最后,在协议(protocol)方法中,您现在可以使用刚刚传递的数据来执行您想要的操作。完成数据处理后,请务必重新加载 collectionView,以便 View 更新并显示您需要显示的任何内容
func didSelectBusiness(id: Int) {
someFunction(id: id)
}
func someFunction(id: Int) {
//DO STUFF
//...
collectionView?.reloadData()
}
关于swift - 将数据从 MKAnnotationView 传递到 UICollectionViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52047536/
MKPinAnnotationView 不允许您使用自定义图像作为“图钉”并同时启用拖动,因为一旦您开始拖动图像就会变回默认图钉。因此,我使用 MKAnnotationView 而不是 MKPinAn
我正在尝试通过动画使我的注释淡入淡出,因此我使用 0 的 alpha 创建它们,然后在 didAddAnnotation 中将它们的 alpha 设置为 1。有时我只添加一些注释,减去其他注释,但现在
我使用此代码创建我的自定义注释 View 。 - (MKAnnotationView *)mapView:(MKMapView *)mV viewForAnnotation:(id )annotati
iPhone SDK map 上的标注气泡上,标题和副标题属性的字体是否可以更改。 我对标注气泡中显示的默认字体不满意,并且想使用不同的字体来匹配我的应用程序的其余部分。然而,我没有看到太多提及这一点
我在MKMapView上添加了一个MKAnnotationView,当我长按它时,我希望它可以被抬起并移动到另一个位置。 如何做?特别感谢! 最佳答案 适用于 iOS 4.0 或更高版本 摘自 App
实际上,我正在我的应用程序中开发一些东西,它可以在我的 MKMapView 中显示注释这些注释应该是可单击的并将参数传递给方法。 现在的问题是如何在点击披露按钮时将参数传递给下一个函数。 对于注释的格
我一直在尝试创建一个必须显示多行文本的 MKAnnotationView。 有人指示我做下面网址中所说的事情 How to add more details in MKAnnotation in iO
我正在尝试在 MapKit 中模拟用户位置动画(其中用户的位置由脉动的蓝点表示)。我创建了 MKAnnotationView 的自定义子类,并在 drawRect 方法中尝试循环一组颜色。这是我正在做
我有一个MKAnnotationView ( draggable 属性设置为 YES )使用自定义图像,通过 image 设置属性(property)。当注释添加到 map 时,它具有自定义图像。但当
我已经对 MKAnnotationView 进行了子类化,以创建一个注释,该注释基本上通过重写 drawRect 来围绕 map View 上的点绘制一个圆。在以下情况下(在模拟器中),圆圈绘制得很好
我很难弄清楚如何让用户一次在 map 上选择多个注释。我的 annotationViews 不显示标注,但 annotationView 的图像在选择时会发生变化。有没有一种简单的方法来启用这种行为?
我在这里使用 Daniel 提供的自定义 MKAnnotationView 动画:Subclassing MKAnnotationView and overriding setDragState但我遇
我喜欢 iOS 6 中新的自动布局功能,但是在将它与我的 MKAnnotationView 子类结合使用时遇到了一些麻烦。 我在初始化方法中禁用了自动调整掩码转换。 self.translatesAu
我使用此代码在 Swift 中创建一个简单的 MKAnnotationView 标注。 let local_parking = CustomAnnotation() local_par
以下代码返回几个编译器错误: override init(frame: CGRect) { //Initializer does not override a designated initializ
在我的代码中,我使用Apple map 并在 View Controller 中正确设置mapView和自身的委托(delegate)。 在我的 ViewController 中,我还在 for 循环
我想根据它们代表的相对时间在 UIMapView 中显示不同颜色的图钉 但似乎 mapView:viewForAnnotation: 方法的作用与调用时间无关。 在我的代码示例中,我已经将文件中较早和
大家好,提前致谢 =) 我对 MKMapView 和 MKAnnotationView 有疑问。我需要在 MKMapView 上显示带有自定义图像的注释。为此,根据几个教程和其他 stackoverf
当您设置 MKAnnotationView 的可拖动属性时,默认行为似乎是: 1) 用户点击注释 2) 用户拖动注释 是否可以将其合二为一,以便用户无需先点击即可拖动注释? 最佳答案 试试这个源代码
我在一段时间 [4 秒] 后隐藏 MKAnnotationView 时遇到问题。我有一个名为 mapView 的 MKMapView,它使用 MKUserLocation 显示用户位置,我在他的
我是一名优秀的程序员,十分优秀!