Swiftgram/TelegramUI/MapInputControllerNode.swift
2017-08-15 14:44:14 +03:00

70 lines
2.5 KiB
Swift

import Foundation
import Display
import AsyncDisplayKit
import MapKit
private var previousUserLocation: CLLocation?
final class MapInputControllerNode: ASDisplayNode, MKMapViewDelegate {
var dismiss: () -> Void = { }
let locationManager: CLLocationManager
let mapView: MKMapView
override init() {
self.locationManager = CLLocationManager()
self.mapView = MKMapView()
super.init()
self.setViewBlock({
return UITracingLayerView()
})
self.backgroundColor = UIColor.white
self.mapView.delegate = self
self.view.addSubview(self.mapView)
if let location = previousUserLocation {
let coordinateRegion = MKCoordinateRegionMakeWithDistance(location.coordinate, 1000.0 * 2.0, 1000.0 * 2.0)
mapView.setRegion(coordinateRegion, animated: true)
}
}
func containerLayoutUpdated(_ layout: ContainerViewLayout, navigationBarHeight: CGFloat, transition: ContainedViewLayoutTransition) {
self.mapView.frame = CGRect(origin: CGPoint(), size: layout.size)
}
func animateIn() {
self.checkLocationAuthorizationStatus()
self.layer.animatePosition(from: CGPoint(x: self.layer.position.x, y: self.layer.position.y + self.layer.bounds.size.height), to: self.layer.position, duration: 0.5, timingFunction: kCAMediaTimingFunctionSpring)
}
func animateOut() {
self.layer.animatePosition(from: self.layer.position, to: CGPoint(x: self.layer.position.x, y: self.layer.position.y + self.layer.bounds.size.height), duration: 0.2, timingFunction: kCAMediaTimingFunctionEaseInEaseOut, removeOnCompletion: false, completion: { [weak self] _ in
if let strongSelf = self {
strongSelf.dismiss()
}
})
}
private func checkLocationAuthorizationStatus() {
if CLLocationManager.authorizationStatus() == .authorizedWhenInUse {
mapView.showsUserLocation = true
} else {
locationManager.requestWhenInUseAuthorization()
}
}
func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) {
if let location = userLocation.location {
previousUserLocation = location
let coordinateRegion = MKCoordinateRegionMakeWithDistance(location.coordinate, 1000.0 * 2.0, 1000.0 * 2.0)
mapView.setRegion(coordinateRegion, animated: true)
}
}
}