मैंने एक्सएफ मैप्स को लागू किया, और एक्सएफ से अतिरिक्त अनुमतियां जोड़ीं। एंड्रॉइड पर आवश्यक बहुत कुछ ठीक है, लेकिन आईओएस पर मैं अनुमतियों के लिए अनुमोदन पर क्लिक करने के बाद स्थान बटन नहीं देख सकता?

स्थान (उपयोगकर्ता भौगोलिक स्थान) के लिए बटन देखने के लिए मुझे और क्या जोड़ने की आवश्यकता है?

...
        private async void GetPermissions()
        {
            var status = await Permissions.CheckStatusAsync<Permissions.LocationWhenInUse>();
            if (status != PermissionStatus.Granted)
            { 
                status = await Permissions.RequestAsync<Permissions.LocationWhenInUse>();
            }
            if (status != PermissionStatus.Granted)
            {
                await Shell.Current.DisplayAlert("Permission Denied", "We Need to access your Location. But it is not granted", "OK");
            }
        }
...

मेरा आईओएस रेंडरर

[assembly: ExportRenderer(typeof(CustomMap), typeof(CustomMapRenderer))]
namespace OperaMobile.iOS.Renderers
{
    public class CustomMapRenderer : MapRenderer
    {
        UIStackView customPinView;
        ObservableCollection<CustomPin> customPins;

        protected override void OnElementChanged(ElementChangedEventArgs<View> e)
        {
            base.OnElementChanged(e);

            if (e.OldElement != null)
            {
                var nativeMap = Control as MKMapView;
                nativeMap.GetViewForAnnotation = null;
                nativeMap.CalloutAccessoryControlTapped -= OnCalloutAccessoryControlTapped;
                nativeMap.DidSelectAnnotationView -= OnDidSelectAnnotationView;
                nativeMap.DidDeselectAnnotationView -= OnDidDeselectAnnotationView;
            }

            if (e.NewElement != null)
            {
                var formsMap = (CustomMap)e.NewElement;
                var nativeMap = Control as MKMapView;
                customPins = formsMap.CustomPins;

                nativeMap.GetViewForAnnotation = GetViewForAnnotation;
                nativeMap.CalloutAccessoryControlTapped += OnCalloutAccessoryControlTapped;
                nativeMap.DidSelectAnnotationView += OnDidSelectAnnotationView;
                nativeMap.DidDeselectAnnotationView += OnDidDeselectAnnotationView;
            }
        }

        protected override MKAnnotationView GetViewForAnnotation(MKMapView mapView, IMKAnnotation annotation)
        {
            MKAnnotationView annotationView = null;

            if (annotation is MKUserLocation)
                return null;

            var customPin = GetCustomPin(annotation as MKPointAnnotation);
            if (customPin == null)
            {
                throw new Exception("Custom pin not found");
            }

            annotationView = mapView.DequeueReusableAnnotation(customPin.Label);
            if (annotationView == null)
            {
                annotationView = new CustomMKAnnotationView(annotation, customPin.Label);
                annotationView.Image = UIImage.FromFile("pin.png");
                annotationView.CalloutOffset = new CGPoint(0, 0);

                UIImageView uIImageView = new UIImageView(UIImage.FromFile("monkey.png"));
                uIImageView.Frame = new CGRect(0, 0, 75, 100);
                annotationView.LeftCalloutAccessoryView = uIImageView;

                //annotationView.LeftCalloutAccessoryView = new UIImageView(UIImage.FromFile("monkey.png"));
                //annotationView.RightCalloutAccessoryView = UIButton.FromType(UIButtonType.DetailDisclosure);
                ((CustomMKAnnotationView)annotationView).Name = customPin.Label;
                //((CustomMKAnnotationView)annotationView).Url = customPin.Url;

                customPinView = new UIStackView();

                foreach (var item in customPin.InfoBox.DetailsObjectInfos)
                {
                    var label = new UILabel();
                    label.Text = item.BoldLabelTitle + item.LabelValue;
                    label.BackgroundColor = UIColor.White;
                    label.Font.WithSize(36);
                    customPinView.AddArrangedSubview(label);
                }
            
                customPinView.Frame = new CGRect(0, 0, 300, 84);
                customPinView.Axis = UILayoutConstraintAxis.Vertical;
                customPinView.Distribution = UIStackViewDistribution.EqualSpacing;
                customPinView.Spacing = 1;
                customPinView.Alignment = UIStackViewAlignment.Fill;
                annotationView.DetailCalloutAccessoryView = customPinView;

                UITapGestureRecognizer tapGestureRecognizer = new
        UITapGestureRecognizer((gesture) =>
        {

                        Shell.Current.GoToAsync(Routes.ObjectParametersPage);

        });
                annotationView.DetailCalloutAccessoryView.AddGestureRecognizer(tapGestureRecognizer);

            }
            annotationView.CanShowCallout = true;

            return annotationView;
        }

        protected virtual void OnCalloutAccessoryControlTapped(object sender, MKMapViewAccessoryTappedEventArgs e)
        {
            Shell.Current.GoToAsync(Routes.ObjectParametersPage);
            //(App.Current as App).NavigationPage.Navigation.PushAsync(new ContentPage());
        }

        void OnDidSelectAnnotationView(object sender, MKAnnotationViewEventArgs e)
        {
            CustomMKAnnotationView customView = e.View as CustomMKAnnotationView;
            
        }

        void OnDidDeselectAnnotationView(object sender, MKAnnotationViewEventArgs e)
        {
            if (!e.View.Selected)
            {
                customPinView.RemoveFromSuperview();
                customPinView.Dispose();
                customPinView = null;
            }
        }

        CustomPin GetCustomPin(MKPointAnnotation annotation)
        {
            var position = new Position(annotation.Coordinate.Latitude, annotation.Coordinate.Longitude);
            foreach (var pin in customPins)
            {
                if (pin.Position == position)
                {
                    return pin;
                }
            }
            return null;
        }
}}
0
Stefan0309 6 अगस्त 2020, 17:35

1 उत्तर

सबसे बढ़िया उत्तर

सुनिश्चित नहीं हैं कि अपने प्रोजेक्ट में स्थान बटन कैसे जोड़ें, हो सकता है कि आप Xaml में स्थान आइकन के साथ एक अनुकूलित ImageButton जोड़ सकें।

Xaml कोड:

<RelativeLayout>
    <local:CustomMap x:Name="customMap" 
                     IsShowingUser="True"
                     MapType="Street"
                     IsVisible="true"
                     RelativeLayout.XConstraint="{ConstraintExpression Type=RelativeToParent,
                         Property=Width,
                         Factor=0,
                         Constant=0}"
                     RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToParent,
                         Property=Height,
                         Factor=0,
                         Constant=0}"
                     RelativeLayout.WidthConstraint="{ConstraintExpression
        Type=RelativeToParent,Property=Width,Factor=1,Constant=0}"
                     RelativeLayout.HeightConstraint="{ConstraintExpression
        Type=RelativeToParent,Property=Height,Factor=1,Constant=0}" />
    <ImageButton Source="location.png"
            Clicked="Button_Clicked"
            RelativeLayout.XConstraint="{ConstraintExpression Type=RelativeToParent,
                         Property=Width,
                         Factor=0.6,
                         Constant=100}"
            RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToParent,
                         Property=Height,
                         Factor=0.8,
                         Constant=80}" />
</RelativeLayout>

सामग्रीपृष्ठ.सीएस:

private async void Button_Clicked(object sender, System.EventArgs e)
{
    var request = new GeolocationRequest(GeolocationAccuracy.Medium);
    var location = await Geolocation.GetLocationAsync(request);

    if (location != null)
    {
        Console.WriteLine($"Latitude: {location.Latitude}, Longitude: {location.Longitude}, Altitude: {location.Altitude}");
 
    }
       
    customMap.MoveToRegion(MapSpan.FromCenterAndRadius(new Position(location.Latitude, -location.Longitude), Distance.FromMiles(1.0)));
}

प्रभाव:

enter image description here

=============================== अद्यतन #1 ============= ====================

Xamarin रूपों में, आप केवल Android में xaml स्थान बटन छिपा सकते हैं, फिर iOS xaml स्थान बटन दिखाएगा।

protected override void OnAppearing()
{
    base.OnAppearing();
    if(Device.RuntimePlatform == "Android")
    {
        LocationButton.IsVisible = false;
    }
}

LocationButton को Xaml में परिभाषित किया गया है: <ImageButton x:Name="LocationButton" ... />

=============================== अद्यतन #2============ ====================

यदि आईओएस सिम्युलेटर में स्थान का परीक्षण करने की आवश्यकता है, तो आपको मैन्युअल रूप से स्थान चुनना होगा। सिम्युलेटर की क्लिकिंग सेटिंग निम्नानुसार है:

enter image description here

एक स्थान चुनें:

enter image description here

1
Junior Jiang 10 अगस्त 2020, 04:46