diff options
Diffstat (limited to 'platform/ios/app/MBXCustomCalloutView.m')
-rw-r--r-- | platform/ios/app/MBXCustomCalloutView.m | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/platform/ios/app/MBXCustomCalloutView.m b/platform/ios/app/MBXCustomCalloutView.m new file mode 100644 index 0000000000..8f9bd8ed40 --- /dev/null +++ b/platform/ios/app/MBXCustomCalloutView.m @@ -0,0 +1,95 @@ +#import "MBXCustomCalloutView.h" + +static CGFloat const tipHeight = 10.0; +static CGFloat const tipWidth = 10.0; + +@interface MBXCustomCalloutView () + +@property (strong, nonatomic) UILabel *mainLabel; + +@end + +@implementation MBXCustomCalloutView { + id <MGLAnnotation> _representedObject; + UIView *_leftAccessoryView; + UIView *_rightAccessoryView; + __weak id <MGLCalloutViewDelegate> _delegate; +} + +@synthesize representedObject = _representedObject; +@synthesize leftAccessoryView = _leftAccessoryView; +@synthesize rightAccessoryView = _rightAccessoryView; +@synthesize delegate = _delegate; + +- (instancetype)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self) + { + self.backgroundColor = [UIColor clearColor]; + _mainLabel = [[UILabel alloc] initWithFrame: CGRectZero]; + _mainLabel.backgroundColor = [UIColor clearColor]; + + [self addSubview: _mainLabel]; + } + return self; +} + + +#pragma mark - API + +- (void)presentCalloutFromRect:(CGRect)rect inView:(UIView *)view constrainedToView:(UIView *)constrainedView animated:(BOOL)animated +{ + [view addSubview:self]; + // prepare title label + if ([self.representedObject respondsToSelector:@selector(title)]) + { + self.mainLabel.text = self.representedObject.title; + [self.mainLabel sizeToFit]; + } + // prepare our frame + CGFloat frameWidth = self.mainLabel.bounds.size.width; + CGFloat frameHeight = self.mainLabel.bounds.size.height * 2.0; + CGFloat frameOriginX = rect.origin.x + (rect.size.width/2.0) - (frameWidth/2.0); + CGFloat frameOriginY = rect.origin.y - frameHeight; + self.frame = CGRectMake(frameOriginX, frameOriginY, + frameWidth, frameHeight); +} + +- (void)dismissCalloutAnimated:(BOOL)animated +{ + if (self.superview) + [self removeFromSuperview]; +} + +#pragma mark - internals + +- (void)drawRect:(CGRect)rect +{ + UIColor *fillColor = [UIColor colorWithWhite:0.7 alpha:1.0]; + + CGFloat tipLeft = rect.origin.x + (rect.size.width / 2.0) - (tipWidth / 2.0); + CGPoint tipBottom = CGPointMake(rect.origin.x + (rect.size.width / 2.0), rect.origin.y +rect.size.height); + CGFloat heightWithoutTip = rect.size.height - tipHeight; + + // draw the white background with tip + CGContextRef ctxt = UIGraphicsGetCurrentContext(); + + CGMutablePathRef tipPath = CGPathCreateMutable(); + CGPathMoveToPoint(tipPath, NULL, 0, 0); + CGPathAddLineToPoint(tipPath, NULL, 0, heightWithoutTip); + CGPathAddLineToPoint(tipPath, NULL, tipLeft, heightWithoutTip); + CGPathAddLineToPoint(tipPath, NULL, tipBottom.x, tipBottom.y); + CGPathAddLineToPoint(tipPath, NULL, tipLeft + tipWidth, heightWithoutTip); + CGPathAddLineToPoint(tipPath, NULL, CGRectGetWidth(rect), heightWithoutTip); + CGPathAddLineToPoint(tipPath, NULL, CGRectGetWidth(rect), 0); + CGPathCloseSubpath(tipPath); + + [fillColor setFill]; + CGContextAddPath(ctxt, tipPath); + CGContextFillPath(ctxt); + CGPathRelease(tipPath); +} + + +@end |