ThinkGeo.com    |     Blog    |     Wiki    |     Support

Map not displaying inside a PageRenderer

I have a PageRenderer in xamarin iOS app which does display a label when navigated but as i add a map it does not get displayed.

Infact, it seems to get stuck at  line 54:




iOSMap.Refresh();





Can anybody tell me what could be the problem?


01.using System;
02.using System.Drawing;
03.using Xamarin.Forms.Platform.iOS;
04.using MonoTouch.UIKit;
05.using Xamarin.Forms;
06.using Agtrix.Portable.Forms;
07.using ThinkGeo.MapSuite.Core;
08.using ThinkGeo.MapSuite.iOSEdition;
09.using Agtrix.iOS.Views;
10.// This ExportRenderer command tells Xamarin.Forms to use this renderer
11.// instead of the built-in one for this page
12.[assembly:ExportRenderer(typeof(ThinkGeoPage), typeof(Agtrix.iOS.Renderers.ThinkGeoPageRenderer))]
13. 
14.namespace Agtrix.iOS.Renderers
15.{
16.    /// <summary>
17.    /// Render this page using platform-specific UIKit controls
18.    /// </summary>
19.    public class ThinkGeoPageRenderer : PageRenderer
20.    {
21.        //private MapView iOSMap;
22.        protected override void OnElementChanged (VisualElementChangedEventArgs e)
23.        {
24.            base.OnElementChanged (e);
25.            var page = e.NewElement as ThinkGeoPage;
26.            var view = NativeView;
27. 
28.         
29.            var hostViewController = ViewController;
30. 
31.            var viewController = new UIViewController();
32.         
33.//          var label = new UILabel (new RectangleF(0, 40, 320, 40));
34.//          label.Text = "3 " + page.Heading;
35.            //viewController.View.Add(label);
36.            MapView iOSMap = new MapView (new RectangleF(0, 40, 320, 40));
37.            // Set the main view frame
38.            viewController.View.Frame = UIScreen.MainScreen.Bounds;
39.            viewController.View.BackgroundColor = UIColor.White;
40.            viewController.View.AutoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight;
41. 
42. 
43.            // Add ThinkGeo Location Marker. 
44.            Marker thinkGeoLocation = new Marker();
45.            thinkGeoLocation.Position = new PointShape(-96.809523, 33.128675);
46.            thinkGeoLocation.Image = UIImage.FromBundle("Pin");
47.            MarkerOverlay markerOverlay = new MarkerOverlay();
48.            markerOverlay.Markers.Add(thinkGeoLocation);
49.            iOSMap.Overlays.Add("markerOverlay", markerOverlay);
50. 
51.            // Add MapView to MainView
52.            //viewController.View.AddSubview(iOSMap);
53.            viewController.View.Add(iOSMap);
54.            iOSMap.Refresh();
55. 
56. 
57.            hostViewController.AddChildViewController (viewController);
58.            hostViewController.View.Add(viewController.View);
59. 
60.            viewController.DidMoveToParentViewController (hostViewController);
61.        }
62.    }
63.}





Hi Zeeshan, 
  
 Welcome to map suite forums and thanks for the focus on our iOS Edition. 
 As for your issue, as far as I can see, we don’t support the PageRenderer and it seems a third-party library which we don’t have any experiences on. So, I am afraid it is hard for us to debug before we do an enough investigations.  
  
 In order to be convenient for us to recreate your issue, would you mind to send us your codes or a sample is better? 
 Thanks, 
 Troy 


Ok. There is a sample app at github.com/xamarin/xamarin-forms-samples called “Forms2Native”; all I need is to show ThinkGeo Map properly showing up on the platform specific pages: 

iOS 

github.com/xamarin/xamarin-forms-samples/blob/master/Forms2Native/FormsBasics.iOS/MyThirdPage.cs 

github.com/xamarin/xamarin-forms-samples/blob/master/Forms2Native/FormsBasics.iOS/MySecondPageRenderer.cs 

Android 

github.com/xamarin/xamarin-forms-samples/blob/master/Forms2Native/FormsBasics.Android/MyThirdActivity.cs 

github.com/xamarin/xamarin-forms-samples/blob/master/Forms2Native/FormsBasics.Android/MySecondPageRenderer.cs 



Can you please add the required Map functionality in both the iOS and Android projects? That would solve the problem. Note: the QuickStartSample (for Android and iOS Editions) which I got from your side use sample Frisco data for drawing feature layers. Suppose I don’t provide the Map with any layer data and just want to show my current location co-ordinates as Marker on a map.

I would like you to send me the xamarin’s github.com/xamarin/xamarin-forms-samples/blob/master/Forms2Native sample apps with ThinkGeo Maps implemented.

Hi Zeeshan,



We did a test on the Forms2Native Sample with your codes and found the issue might because you are missing to set the CurrentExtent and MapUnit for the map. Please try the below codes:


public class MyThirdPageRenderer : PageRenderer
{
        protected override void OnModelSet(Xamarin.Forms.VisualElement model)
        {
            base.OnModelSet(model);
            var page = model as MyThirdPage;
            var hostViewController = ViewController;
 
            var viewController = new UIViewController();
            viewController.View.Frame = UIScreen.MainScreen.Bounds;
            viewController.View.BackgroundColor = UIColor.White;
            viewController.View.AutoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight;
 
            //var label = new UILabel(new RectangleF(0, 40, 320, 40));
            //label.Text = "3 " + page.Heading;
            //viewController.View.Add(label);
 
            MapView iOSMap = new MapView(viewController.View.Frame);
            iOSMap.CurrentExtent = new RectangleShape(-96.8172, 33.1299, -96.8050, 33.1226);
            iOSMap.MapUnit = GeographyUnit.DecimalDegree;
            viewController.View.Add(iOSMap);
 
            Marker thinkGeoLocation = new Marker();
            thinkGeoLocation.Position = new PointShape(-96.809523, 33.128675);
                 thinkGeoLocation.Image = UIImage.FromBundle(“Pin”);
 
            MarkerOverlay markerOverlay = new MarkerOverlay();
            markerOverlay.Markers.Add(thinkGeoLocation);
            iOSMap.Overlays.Add(markerOverlay);
 
            iOSMap.Refresh();
 
            hostViewController.AddChildViewController(viewController);
            hostViewController.View.Add(viewController.View);
            viewController.DidMoveToParentViewController(hostViewController);
        }
}

Another thing is, the Pin.png seems be missing and we need to add the file into the resource folder and marked it as BundleResource.



Besides, Just want you know, In our internal version, the Image property of the Marker is replaced by SetImage method. So, if we update to the new version of iOS Edition, we need to change two places, one is changing

thinkGeoLocation.Image = UIImage.FromBundle(“Pin”);

to

thinkGeoLocation.SetImage(UIImage.FromBundle(“Pin”), UIControlState.Normal);



The other one is add the below code in AppDelegate’s finishedLaunching method.

PclShareEnvironment.Current = new iOSEditionPclShareEnviroment();



If the issue persists, please feel free to let us know. The attached is a test video and the Pin.png file.

Thanks,

Troy



video.zip (260 KB)

It does show the Map screen with the marker but map itself is not showing. There are ZoomIn/Out buttons but the map is a white blank screen. what’s to be left? Did you actually see the Map in your test or just a marker and ZoomIn/Out buttons on a blank canvas like me?

Hi Zeeshan,



The map is empty is because we didn’t add any layers into the map but only markers. Now, I have attached a full sample here and took a test video. please check it. screencast.com/t/JNX0VbNq0C



In the sample, here are several places we need to modify:

Add the Countries02.shp file into AppData folder.

Add the below codes in MyThirdPageRenderer


ShapeFileFeatureLayer worldLayer = new ShapeFileFeatureLayer(“AppData/Countries02.shp”);
       worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1;
       worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
 
       LayerOverlay layerOverlay = new LayerOverlay();
       layerOverlay.Layers.Add(worldLayer);
       iOSMap.Overlays.Add(layerOverlay);

Any questions, don’t hesitate to let us know.

Thanks,

Troy

Forms2Native.zip (1.68 MB)

This final answer looks to have resolved the issue (although I have not yet tested it). (Good customer support:) 

I will come back to you after having a go at it again on both Android and iOS.

Zeeshan, 
  
 Okay, if questions, don’t hesitate to let us know. 
  
 Thanks, 
 Troy

I have started to get this exception running map sample apps all over: 



 

Could not find any resources appropriate for the specified culture or the neutral culture.   

Make sure "ThinkGeo.MapSuite.Properties.MitabExceptionDescription.resources" was correctly embedded 

or linked into assembly "PortableMapSuiteCore" at compile time, or that all the satellite assemblies  

required are loadable and fully signed. 

 



What has changed? Samples which have been running nicely have started to produce this error. Plz see attached snapshot and feedback.

Hi Zeeshan, 



I think the reason is you are referring an old version, and the sample is built on a new version which is only available internally and doesn’t public yet.  

Would you please just immigrant the codes of the sample to your project? or send us your whole project including the dlls as we want to know which version you are referring so that we can modify your project to fit your version dll. If your project size is beyond the limit size of the forums, please send it to  forumsupport@thinkgeo.com



Btw, seems your attached files are missing from your reply, please attach them again if necessary. 

Thanks, 

Troy

Not really. I downloaded the samples from email attachment again. and it raises the same exception. Snapshot attached above. Alternatively it can be seen here evernote.com/shard/s204/sh/3cbb0c28-a2bf-4321-82b9-084ed34fd0a5/f7b8d522130c607686d546af1a5d07ed.


Hi,  
  
 We have solved this issue in a ticket creating by Zeeshan. 
  
 Just note here in case someone else encounters the same issue. This is proved a bug and getting a latest dll package should fix the issue. 
  
 Any questions, please feel free to let us know. 
 Thanks, 
 Troy

Ok, could you possibly tell me why Bing map is not displaying despite I specify a valid key to BingMapsTileOverlay’s constructor? also tried ApplicationId…but the sample app keeps saying :“Bing Maps require an API Key”. Note: Bing key is tested with jsfiddle to be working.

Hi Zeeshan,



In order to remove the message, please remove the below section marked yellow from SampleList.xml file in the sample project like the below:



    <Sample Name="Use BingMaps Overlay" Class="UseBingMapsTileOverlay" DisplayPicture="true" Information="Bing Maps require an API Key.">
      <Description>This sample shows how use bing map overlay.</Description>
</Sample>

Hope it helps and if more questions, please feel free to let us know.

Thanks,

Troy



Yes. Bing map is showing now.

Okay, Good to hear it shows. 
  
 Any questions, don’t hesitate to let us know. 
 Troy