我正在创建Universal app
,并且必须在map view
上创建自定义安全区域。
我要做的是:
UIView
作为map view
的 super 视图,称为squareZone
。 squareZone
视图中,我添加了UIPanGestureRecognizer
,UIPinchGestureRecognizer
和UIRotationGestureRecognizer
,以便可以移动,旋转和缩放(放大和缩小)。 这是SquareZone的代码
- (id)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
if (self) {
self.opaque = NO;
self.layer.cornerRadius = 5.0f;
}
return self;
}
- (void)drawRect:(CGRect)rect {
[super drawRect:rect];
UIColor *color = [UIColor colorWithRed: 0.765 green: 0.439 blue: 0.443 alpha: 0.658];
UIBezierPath *rectanglePath = [UIBezierPath bezierPathWithRect: rect];
[color setFill];
[rectanglePath fill];
[UIColor.whiteColor setStroke];
rectanglePath.lineWidth = 5;
CGFloat rectanglePattern[] = {2, 3};
[rectanglePath setLineDash: rectanglePattern count: 2 phase: 0];
[rectanglePath stroke];
}
现在,当用户调整
squareZone
时,我必须在UILabel
上显示以米为单位的每个点之间的距离。为此,我正在使用- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location
当用户与
UILabels
交互时,如何添加/显示四个squareZone
。我这里需要些灯。我看过很多教程,但我无法想象这怎么可能。作为参考,有一个名为
Trax:https://itunes.apple.com/us/app/trax-gps-tracker/id647170688?mt=8
我必须执行相同的“绘图地理围栏”区域。
提前致谢。
最佳答案
首先要提到的是Trax
具有两种不同的模式:
1)editing
-绘制路径
2)live
-显示结果的位置。
编辑模式
使用editing
时,无法在MKMapView内部移动和缩放。发生这种情况的原因是,他们使用的方法与您使用的方法相同-他们在UIView
的顶部添加了MKMapView
,以使手势不会相互冲突。
您需要做的就是将CGPoint
添加到某个数组中,并在将来使用它们。
当然,使用CoreGraphics
框架有一些困难,但这并不是那么棘手。
现场模式
用户添加了所有CGPoint
之后,您现在必须将这些点转换为实际的CLLocationCoordinate2D
实例。
CGPoint thePoint = ...
CLLocationCoordinate2D theLocationCoordinate2D = [theMapView convertPoint:thePoint toCoordinateFromView:theDrawingView];
他们的应用程序中的
Trax
可能(几乎可以肯定)是MKPolygon
类的实例。您可以这样添加它:
NSUInteger theCount = self.theMainDrawingView.thePointsArray.count;
CLLocationCoordinate2D theLocationCoordinatesArray[theCount];
for (NSUInteger theIndex = 0; theIndex < theCount; theIndex++)
{
CGPoint thePoint = self.theMainDrawingView.thePointsArray[theIndex].CGPointValue;
CLLocationCoordinate2D theLocationCoordinate2D = [self.theMainMapView convertPoint:thePoint toCoordinateFromView:self.theMainDrawingView];
theLocationCoordinatesArray[theIndex] = theLocationCoordinate2D;
}
MKPolygon *thePolygon = [MKPolygon polygonWithCoordinates:theLocationCoordinatesArray count:theCount];
[self.theMainMapView addOverlay:thePolygon];
但是,这还没有结束。这将触发
MKMapView
的委托方法(不要忘记设置其.delegate
属性)- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay
{
if (![overlay isKindOfClass:[MKPolygon class]])
{
return nil;
}
MKPolygonView *thePolygonView = [[MKPolygonView alloc] initWithPolygon:(MKPolygon *)overlay];
thePolygonView.fillColor = [[UIColor cyanColor] colorWithAlphaComponent:0.2];
thePolygonView.strokeColor = [[UIColor redColor] colorWithAlphaComponent:0.6];
thePolygonView.lineWidth = 4;
return thePolygonView;
}
结果如下:
摘要
当然,这不能完全解决问题,因为您也必须添加
pinch
和pan
手势,但是我希望我能指出正确的方向。