summaryrefslogtreecommitdiff
path: root/platform/ios/app/MBXCustomCalloutView.m
diff options
context:
space:
mode:
Diffstat (limited to 'platform/ios/app/MBXCustomCalloutView.m')
-rw-r--r--platform/ios/app/MBXCustomCalloutView.m95
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