在iOS7中使用MKOverlayRenderer显示UIImage

时间:2014-07-01 19:02:39

标签: ios objective-c uiimage mkoverlay

我正在尝试将UIImage显示为基于地图的iPad应用程序的叠加层。我尝试按照以下4个步骤设置Apple的文档中定义的自定义叠加层:定义叠加层数据对象,定义对象渲染器,在地图视图委托中实现地图视图,以及将叠加数据对象添加到地图视图。尝试完所有这些后,我运行模拟器时没有叠加。任何建议都会很棒。我的代码如下

ViewController.h

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>
#import "bjorkOverlay.h"
#import "bjorkOverlayRenderer.h"

@interface TUTViewController : UIViewController <MKMapViewDelegate>
{
    CLLocationManager *locationManager;
    CLLocation *location;

}

@property (strong, nonatomic) IBOutlet MKMapView *mapView;
@property(nonatomic) MKCoordinateRegion region;
@property (nonatomic, readonly) MKMapRect boundingMapRect;
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;
@property (nonatomic, readonly) CLLocationCoordinate2D bjorkOverlayCenterPoint;
@property (nonatomic, readonly) MKMapRect bjorkOverlayBoundingMapRect;

@end

ViewController.m

#import "TUTViewController.h"
#import "bjorkOverlay.h"
#import "bjorkOverlayRenderer.h"
@import MapKit;

@interface TUTViewController () <MKMapViewDelegate>

@end

@implementation TUTViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    locationManager = [[CLLocationManager alloc] init];
    [locationManager startUpdatingLocation];
    _mapView.showsUserLocation = YES;
    _mapView.delegate = self;

    CLLocationCoordinate2D lowerLeftCoord = CLLocationCoordinate2DMake(  45.022943             ,-87.146606);
    MKMapPoint lowerLeft = MKMapPointForCoordinate(lowerLeftCoord);
    CLLocationCoordinate2D upperRightCoord = CLLocationCoordinate2DMake( 45.048513, -87.124765);
    MKMapPoint upperRight = MKMapPointForCoordinate(upperRightCoord);
    MKMapRect mapRect = MKMapRectMake(lowerLeft.x, upperRight.y, upperRight.x - lowerLeft.x, lowerLeft.y - upperRight.y);

    [self.mapView setVisibleMapRect:mapRect animated:YES];

    bjorkOverlay * mapOverlay = [[bjorkOverlay alloc] init];
    [_mapView addOverlay:mapOverlay];

}



- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:        (id<MKOverlay>)overlay {

    MKOverlayRenderer *mapOverlay = [[MKOverlayRenderer alloc] init];
    return mapOverlay;
}



    // Do any additional setup after loading the view, typically from a nib.

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}




@end

bjorkOverlay.h

#import <Foundation/Foundation.h>
@import MapKit;

@interface bjorkOverlay : NSObject <MKOverlay>

+ (id)overlayWithCoordinate:(CLLocationCoordinate2D)coordinate;

@property (nonatomic, assign) CLLocationCoordinate2D bjorkOverlayCenterPoint;

@property (nonatomic) MKMapRect bjorkOverlayBoundingMapRect;


@end

bjorkOverlay.m

#import "bjorkOverlay.h"
@import MapKit;

@implementation bjorkOverlay 

 + (id)overlayWithCoordinate:(CLLocationCoordinate2D)coordinate radius:(CLLocationDistance)radius{
    bjorkOverlay* overlay = [[bjorkOverlay alloc] init];
    overlay.coordinate = coordinate;
    return overlay;
}

-(MKMapRect)boundingMapRect{
CLLocationCoordinate2D lowerLeftCoord = CLLocationCoordinate2DMake(  45.022943 ,-87.146606);
    MKMapPoint lowerLeft = MKMapPointForCoordinate(lowerLeftCoord);
    CLLocationCoordinate2D upperRightCoord = CLLocationCoordinate2DMake( 45.048513, -87.124765);
    MKMapPoint upperRight = MKMapPointForCoordinate(upperRightCoord);
    MKMapRect mapRect = MKMapRectMake(lowerLeft.x, upperRight.y, upperRight.x - lowerLeft.x, lowerLeft.y - upperRight.y);

    return mapRect;
}


- (CLLocationCoordinate2D)bjorkOverlayCenterPoint
{
    CLLocationCoordinate2D coord1 = {
    45.035728,-87.1356855
    };

    return coord1;
}

@end

bjorkOverlayRenderer.h

#import <MapKit/MapKit.h>

@interface bjorkOverlayRenderer : MKOverlayRenderer

@end

bjorkOverlayRender.m

#import "bjorkOverlayRenderer.h"

@implementation bjorkOverlayRenderer

- (void)drawMapRect:(MKMapRect)mapRect
          zoomScale:(MKZoomScale)zoomScale
          inContext:(CGContextRef)ctx
{

    UIImage *image = [UIImage imageNamed:@"overlay.png"];

    CGImageRef imageReference = image.CGImage;

    MKMapRect theMapRect = [self.overlay boundingMapRect];
    CGRect theRect = [self rectForMapRect:theMapRect];
    CGRect clipRect = [self rectForMapRect:mapRect];

    CGContextAddRect(ctx, clipRect);
    CGContextClip(ctx);

    CGContextDrawImage(ctx, theRect, imageReference);



}


@end

任何建议都会很棒,或者如果你看过MKOverlayRenderer的示例代码,我会很感激。感谢

0 个答案:

没有答案