Жесты касания флаттера не работают с UiKitView и MapBox - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь найти лучший способ использования MapBox с Flutter, а UiKitView / AndroidView кажется хорошим подходом.

Мне удалось настроить UiKitView, который загружает MapBox с аннотацией и нарисованной полилиниейоднако попытка использовать некоторые жесты, которые MapBox допускает, такие как нажатие на аннотацию для отображения выноски или размещение аннотации на карте с помощью длинного нажатия, не работает. Я не вижу никаких ошибок или чего-либо еще во время работы приложений, поэтому трудно сказать, что-то идет не так или просто ничего не происходит.

Некоторые жесты работают, например, панорамирование карты или двойное касание для увеличенияно я хочу получить все или хотя бы большую часть функциональности от MapBox. Я также попытался просто вернуть нормальный UIView для UiKitView и передать жесты, но мне тоже не повезло, поэтому я предполагаю, что не правильно обрабатываю жесты.

Ниже приведена реализация UiKitView

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Map App'),
        ),
        body: Container(
          child: Center(
              child: SizedBox(
                  height: double.infinity, width: double.infinity, child: MapBoxUIKitView())
              ),
        ),
      ),
    );
  }
}

class MapBoxUIKitView extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return MapBoxUIKitViewState();
  }
}

class MapBoxUIKitViewState extends State<MapBoxUIKitView> {
  @override
  Widget build(BuildContext context) {
    return UiKitView(
      viewType: "com.mapapp/mapbox_uikitview",
      gestureRecognizers: <Factory<OneSequenceGestureRecognizer>>[
        new Factory<OneSequenceGestureRecognizer>(
            () => new EagerGestureRecognizer())
      ].toSet(),
    );
  }
}

Ниже приведен AppDelegate.swift

import UIKit
import Flutter
import Mapbox

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GeneratedPluginRegistrant.register(with: self)

    let mapBoxViewFactory = MapBoxViewFactory()
    registrar(forPlugin: "MapApp").register(mapBoxViewFactory, withId: "com.mapapp/mapbox_uikitview")

    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

public class MapBoxViewFactory : NSObject, FlutterPlatformViewFactory {
    public func create(withFrame frame: CGRect, viewIdentifier viewId: Int64, arguments args: Any?) -> FlutterPlatformView {
        return MapBoxView(frame, viewId: viewId, args: args)
    }
}

public class MapBoxView : NSObject, FlutterPlatformView, MGLMapViewDelegate {
    let frame: CGRect
    let viewId: Int64
    var mapView: MGLMapView!

    init(_ frame: CGRect, viewId: Int64, args: Any?) {
        self.frame = frame
        self.viewId = viewId
    }

    public func view() -> UIView {
        let url = URL(string: "mapbox://styles/mapbox/streets-v11")
        mapView = MGLMapView(frame: frame, styleURL: url)
        mapView.delegate = self

        mapView.setCenter(CLLocationCoordinate2D(latitude: 45.522585, longitude: -122.685699), zoomLevel: 9, animated: false)

        var coordinates = [
        CLLocationCoordinate2D(latitude: 45.522585, longitude: -122.685699),
        CLLocationCoordinate2D(latitude: 45.534611, longitude: -122.708873),
        CLLocationCoordinate2D(latitude: 45.530883, longitude: -122.678833),
        CLLocationCoordinate2D(latitude: 45.547115, longitude: -122.667503),
        CLLocationCoordinate2D(latitude: 45.530643, longitude: -122.660121)
        ]

        let shape = MGLPolylineFeature(coordinates: &coordinates, count: UInt(coordinates.count))
        let source = MGLShapeSource(identifier: "route-source", features: [shape], options: nil)

        let lineStyle = MGLLineStyleLayer(identifier: "route-style", source: source)
        lineStyle.lineColor = NSExpression(forConstantValue: #colorLiteral(red: 0.1897518039, green: 0.3010634184, blue: 0.7994888425, alpha: 1))
        lineStyle.lineWidth = NSExpression(forConstantValue: 3)

        mapView.style?.addSource(source)
        mapView.style?.addLayer(lineStyle)

        mapView.addAnnotation(shape)
        let annotation = MGLPointAnnotation()
        annotation.coordinate = CLLocationCoordinate2D(latitude: 45.522585, longitude: -122.685699)
        annotation.title = "Annotation"
        mapView.addAnnotation(annotation)

        let longPress = UILongPressGestureRecognizer(target: self, action: #selector(didLongPress(_:)))
        mapView.addGestureRecognizer(longPress)

        return mapView
    }

    // Implement the delegate method that allows annotations to show callouts when tapped
    func mapView(_ mapView: MGLMapView, annotationCanShowCallout annotation: MGLAnnotation) -> Bool {
        return true
    }

    @objc func didLongPress(_ sender: UILongPressGestureRecognizer) {
        guard sender.state == .began else { return }

            let point = sender.location(in: mapView)
            let coordinate = mapView.convert(point, toCoordinateFrom: mapView)

            let annotation = MGLPointAnnotation()
            annotation.coordinate = coordinate
            annotation.title = "Long Press"
            mapView.addAnnotation(annotation)
    }
}

Извините за весь код, но я подумал, что было бы полезно показать все это. Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...