我一直在寻找一个关于在C#Monotouch中为Mapkit添加图像叠加的好教程。
我找到了许多彩色圆圈或多边形的叠加示例。但我想在我的地图顶部加载PNG。我是从MonoAndroid来的,已经在那里完成了,但需要将我的程序转移到iOS。
即使是客观的C示例也会有所帮助,但Mono会更好。
答案 0 :(得分:2)
我最终下载了一些本地目标C代码,几乎只是将其转换为C#。函数名称非常相似,Xamarin API参考文档非常有用。
我遇到了一些棘手的问题,围绕着app代理,以及如何在C#中对Objective C进行不同的处理。
以下是两个最难转换的功能和我的解决方案:
1)绘图功能在地图覆盖类
中 public override void DrawMapRect (MKMapRect mapRect, float zoomScale, CGContext ctx)
{
InvokeOnMainThread(
() =>
{
UIImage image = UIImage.FromFile(@"indigo_eiffel_blog.png");
DrawImgRotated(image, 0, ctx);
}
);
}
public void DrawImgRotated(UIImage image, float rotDegree, CGContext c)
{
c.SaveState();
CGImage imageRef = image.CGImage;
//loading and setting the image
MKMapRect theMapRect = ((MapOverlay)this.Overlay).BoundingMapRect;//MKMapRect theMapRect = [self.overlay boundingMapRect];
RectangleF theRect = RectForMapRect(theMapRect);
//we need to flip and reposition the image
c.ScaleCTM( 1.0f, -1.0f);
c.TranslateCTM(-theRect.Width/8,-theRect.Height);
// Proper rotation about a point
var m = CGAffineTransform.MakeTranslation(-theRect.Width/2,-theRect.Height/2);
m.Multiply( CGAffineTransform.MakeRotation(DegreesToRadians(rotDegree)));
m.Multiply( CGAffineTransform.MakeTranslation(theRect.Width/2,theRect.Height/2));
c.ConcatCTM( m );
c.DrawImage(theRect, imageRef);
c.RestoreState();
}
和2)我的mapOverlay类中的边界mapRect函数重写MKOverlay。 是的,位置是硬编码的,我正在进行单位转换atm,但这些是绘制图像的正确坐标,与我使用的示例obejctive c代码相同。
public MKMapRect BoundingMapRect
{
[Export("boundingMapRect")]
get
{
var bounds = new MKMapRect(1.35928e+08, 9.23456e+07,17890.57, 26860.05);
return bounds;
}
}
我转换的Objective C项目的源代码在这里:https://github.com/indigotech/Blog-MKMapOverlayView
Xamarin API参考文档:http://iosapi.xamarin.com/
答案 1 :(得分:0)
您想要进行此操作的方式取决于您要叠加的图像类型。如果它只是非常小,你应该能够使用单个图像逃脱。但是,如果它覆盖了一个较大的区域,可以放大使用,您可能需要将其拆分为单独的图块以获得更好的性能。
以下是Stack Overflow的其他一些问题,可能会为您解答:
How do I create an image overlay and add to MKMapView?
iPhone - Image overlay MapKit framework?
请参阅Apple的WWDC2010示例代码TileMap https://github.com/klokantech/Apple-WWDC10-TileMap(由某人发布到GitHub)
这些与Mono没有任何关系,但你应该能够转换它......