代码之家  ›  专栏  ›  技术社区  ›  PvDev

mkannontation pin图像大小调整问题

  •  0
  • PvDev  · 技术社区  · 5 年前

    自定义的PIN图像 MKAnnotation . 当点击或缩放地图时,自定义的别针会被拉伸,并且主地图汽车的别针标记的开口很大。以下是我在MapView中得到的输出结果:

    enter image description here

    以下是迄今为止我尝试过的代码:

    var pin = MKAnnotationView()
    var userPinView: MKAnnotationView!
    
    if annotation is MKUserLocation {
    
        pin = mapView.view(for: annotation) ?? MKAnnotationView(annotation: annotation, reuseIdentifier: nil)
        let pinImage = UIImage(named: "carIcon3")
        let size = CGSize(width: 38, height: 44)
        UIGraphicsBeginImageContext(size)
        pinImage!.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))
        let resizedImage = UIGraphicsGetImageFromCurrentImageContext()
        pin.image = resizedImag
        userPinView = pin
        userPinView.contentMode = .scaleAspectFill
        userPinView.clipsToBounds = true
        return pin
    }
    
    if !(annotation is MKPointAnnotation) {
        return nil
    }
    
    let annotationIdentifier = "AnnotationIdentifier"
    var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: annotationIdentifier)
    
    if annotationView == nil {
        annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: annotationIdentifier)
        //            annotationView!.canShowCallout = true
    } else {
        annotationView!.annotation = annotation
    }
    return annotationView
    

    如何得到这样的结果:

    enter image description here

    尝试使用当前位置标记。但它崩溃了

       func locationManager(_ manager: CLLocationManager, didUpdateHeading newHeading: CLHeading) {
    
            UIView.animate(withDuration: 0.005) {
    
            let angle = newHeading.trueHeading.toRadians() // convert from degrees to radians
    
            self.userPinView.transform = CGAffineTransform(rotationAngle: CGFloat(angle)) // rotate the picture
        }
    }
    

    这里是我为位置注释执行的didselect和deselect代码。

         func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
    
        if annotView == true {
    
            let heights = 70
    
            let widths = 50
    
            UIView.animate(withDuration: 0.5, delay: 0.0, options: .curveLinear, animations: {
    
                view.frame.size = CGSize(width: widths, height: heights)
    
            })
        }
    
    }
    
    func mapView(_ mapView: MKMapView, didDeselect view: MKAnnotationView) {
    
        let heights = 70
    
        let widths = 50
    
        UIView.animate(withDuration: 0.5, delay: 0.0, options: .curveLinear, animations: {
    
            view.frame.size = CGSize(width: view.frame.width - CGFloat(widths), height: view.frame.height - CGFloat(heights))
    
        })
    }
    
    1 回复  |  直到 5 年前
        1
  •  1
  •   AamirR    5 年前

    虽然我不能重现这个问题,但我建议进行以下几点修改:

    1. 分离视图配置逻辑,让子类 MKAnnotationView ,像这样:

      class CarAnnotationView: MKAnnotationView {
          override var annotation: MKAnnotation? {
              didSet {
                  let size = CGSize(width: 38, height: 44)
                  UIGraphicsBeginImageContext(size)
                  UIImage(named: "carIcon")?.draw(in: CGRect(origin: .zero, size: size))
                  self.image = UIGraphicsGetImageFromCurrentImageContext()
                  UIGraphicsEndImageContext()
              }
          }
      }
      
    2. 内变化 mapView(_:viewFor:) 要利用可重用视图,例如:

      func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
          if annotation is MKUserLocation {
              userPinView = mapView.dequeueReusableAnnotationView(withIdentifier: "carId") as? CarAnnotationView
              if (userPinView == nil) {
                  userPinView = CarAnnotationView(annotation: nil, reuseIdentifier: "carId")
              }
      
              userPinView.annotation = annotation
              userPinView.setNeedsLayout()
              // userPinView.centerOffset = CGPoint(x: 0, y: -view.bounds.midY)
      
              return userPinView
          }
      
          guard annotation is MKPointAnnotation else { return nil }
      
          let annotationIdentifier = "AnnotationIdentifier"
          ...
          return annotationView
      
      }
      
    3. 删除不必要的变量

      var pin = MKAnnotationView()