         }
 
         mapView?.setUserTrackingMode(userTrackingMode, animated: true)
+    }
+    
+    // MARK: MKMapViewDelegate Implementation
+    
+    public func mapView(mapView: MKMapView, didUpdateUserLocation userLocation: MKUserLocation) {
+        updateState(forMapView: mapView, animated: true)
+    }
+    
+    public func mapView(mapView: MKMapView, didChangeUserTrackingMode mode: MKUserTrackingMode, animated: Bool) {
+        updateState(forMapView: mapView, animated: true)
+    }
+    
+    // MARK: Helpers
+    
+    private func addButton(button: UIButton, withImage image: UIImage?) {
+        button.addTarget(self, action: "pressed:", forControlEvents: .TouchUpInside)
+        button.setImage(image?.imageWithRenderingMode(.AlwaysTemplate), forState: .Normal)
+        button.translatesAutoresizingMaskIntoConstraints = false
+        self.addSubview(button)
+        
+        self.addConstraints([
+            NSLayoutConstraint(
+                item: button,
+                attribute: .Leading,
+                relatedBy: .Equal,
+                toItem: self,
+                attribute: .Leading,
+                multiplier: 1,
+                constant: 0),
+            NSLayoutConstraint(
+                item: button,
+                attribute: .Trailing,
+                relatedBy: .Equal,
+                toItem: self,
+                attribute: .Trailing,
+                multiplier: 1,
+                constant: 0),
+            NSLayoutConstraint(
+                item: button,
+                attribute: .Top,
+                relatedBy: .Equal,
+                toItem: self,
+                attribute: .Top,
+                multiplier: 1,
+                constant: 0),
+            NSLayoutConstraint(
+                item: button,
+                attribute: .Bottom,
+                relatedBy: .Equal,
+                toItem: self,
+                attribute: .Bottom,
+                multiplier: 1,
+                constant: 0),
+            ])
     }
     
     private func updateState(forMapView mapView: MKMapView, animated: Bool) {

        
        self.layer.cornerRadius = 4
        self.clipsToBounds = true
    }
    
    private func addButton(button: UIButton, withImage image: UIImage?) {
        button.addTarget(self, action: "pressed:", forControlEvents: .TouchUpInside)
        button.setImage(image?.imageWithRenderingMode(.AlwaysTemplate), forState: .Normal)
        button.translatesAutoresizingMaskIntoConstraints = false
        self.addSubview(button)
        
        self.addConstraints([
            NSLayoutConstraint(
                item: button,
                attribute: .Leading,
                relatedBy: .Equal,
                toItem: self,
                attribute: .Leading,
                multiplier: 1,
                constant: 0),
            NSLayoutConstraint(
                item: button,
                attribute: .Trailing,
                relatedBy: .Equal,
                toItem: self,
                attribute: .Trailing,
                multiplier: 1,
                constant: 0),
            NSLayoutConstraint(
                item: button,
                attribute: .Top,
                relatedBy: .Equal,
                toItem: self,
                attribute: .Top,
                multiplier: 1,
                constant: 0),
            NSLayoutConstraint(
                item: button,
                attribute: .Bottom,
                relatedBy: .Equal,
                toItem: self,
                attribute: .Bottom,
                multiplier: 1,
                constant: 0),
            ])
    }
    
    public override func intrinsicContentSize() -> CGSize {

    }
    
    private func transitionToState(state: ViewState, animated: Bool) {
        
        switch state {
        case .RetrievingLocation:
            self.hide(locationOffButton, animated: animated)
            self.hide(locationButton, animated: animated) {
                self.trackingActivityIndicator.hidden = false
                self.trackingActivityIndicator.startAnimating()
            }
        case .TrackingLocation:
            self.trackingActivityIndicator.stopAnimating()
            self.hide(locationOffButton, animated: animated)
            self.show(locationButton, animated: animated)
        case .TrackingLocationOff:
            self.trackingActivityIndicator.stopAnimating()
            self.hide(locationButton, animated: animated)
            self.show(locationOffButton, animated: animated)
        default:
            break
        }
