title: Customise iOS8 Callout bubble (Swift)
body: <p>I want to customise the iOS8 MapView Callout bubble which get visualised when clicking on a MKAnnotationView. The Default bubble is a bit limiting (having only Title,Subtitle and 2 accessory view) so I'm struggling to find an alternative solution. Here two possible ways and the relative problems I'm facing:</p>
  
  <p><strong>PROBLEM 1) CREATING A CUSTOM CALLOUT BUBBLE</strong></p>
  
  <p>Digging the <a href="https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/LocationAwarenessPG/AnnotatingMaps/AnnotatingMaps.html">Apple documentation</a> I have found this:</p>
  
  <blockquote>
    <p>When you use a custom view instead of a standard callout, you need to
    do extra work to make sure your callout shows and hides appropriately
    when users interact with it. The steps below outline the process for
    creating a custom callout that contains a button:</p>
    
    <p>Design an NSView or UIView subclass that represents the custom
    callout. It’s likely that the subclass needs to implement the
    drawRect: method to draw your custom content. Create a view controller
    that initializes the callout view and performs the action related to
    the button. In the annotation view, implement hitTest: to respond to
    hits that are outside the annotation view’s bounds but inside the
    callout view’s bounds, as shown in Listing 6-7. In the annotation
    view, implement setSelected:animated: to add your callout view as a
    subview of the annotation view when the user clicks or taps it. If the
    callout view is already visible when the user selects it, the
    setSelected: method should remove the callout subview from the
    annotation view (see Listing 6-8). In the annotation view’s
    initWithAnnotation: method, set the canShowCallout property to NO to
    prevent the map from displaying the standard callout when the user
    selects the annotation. Listing 6-7 shows an example of implementing
    hitTest: to handle hits in the callout view that might be outside the
    bounds of the annotation view.</p>
  </blockquote>
  
  <pre><code>Listing 6-7  Responding to hits within a custom callout
  - (NSView *)hitTest:(NSPoint)point
  {
      NSView *hitView = [super hitTest:point];
      if (hitView == nil &amp;&amp; self.selected) {
          NSPoint pointInAnnotationView = [self.superview convertPoint:point toView:self];
          NSView *calloutView = self.calloutViewController.view;
          hitView = [calloutView hitTest:pointInAnnotationView];
      }
      return hitView;
  }
  </code></pre>
  
  <blockquote>
    <p>Listing 6-8 shows an example of implementing setSelected:animated: to
    animate the arrival and dismissal of a custom callout view when the
    user selects the annotation view.</p>
  </blockquote>
  
  <pre><code>Listing 6-8  Adding and removing a custom callout view
  - (void)setSelected:(BOOL)selected
  {
      [super setSelected:selected];
  
      // Get the custom callout view.
      NSView *calloutView = self.calloutViewController.view;
      if (selected) {
          NSRect annotationViewBounds = self.bounds;
          NSRect calloutViewFrame = calloutView.frame;
        // Center the callout view above and to the right of the annotation view.
          calloutViewFrame.origin.x = -(NSWidth(calloutViewFrame) - NSWidth(annotationViewBounds)) * 0.5;
          calloutViewFrame.origin.y = -NSHeight(calloutViewFrame) + 15.0;
          calloutView.frame = calloutViewFrame;
  
          [self addSubview:calloutView];
      } else {
          [calloutView.animator removeFromSuperview];
      }
  }
  </code></pre>
  
  <p>Now, when I try to convert this Objective-C code to Swift I cannot find this property:</p>
  
  <pre><code>NSView *calloutView = self.calloutViewController.view;
  </code></pre>
  
  <p>How can I access the callout bubble view?</p>
  
  <p><strong>PROBLEM 2) MODIFYING THE DEFAULT CALLOUT BUBBLE</strong></p>
  
  <p>As said before, the default callout displayed has title,subtitle and 2 accessory view. I noticed I cannot change much about the font style of the strings or the colour of the bubble. Also if my title has more then 24 characters my accessory views positioning gets messed up. 
  How can I avoid this problem?</p>