Я создаю небольшое приложение с Swift, в котором я хочу добиться следующего: - MapView с несколькими аннотациями - щелчок по одной из аннотаций показывает некоторые детали в наложении, которое движется снизу и заполняет ок. половина экрана — в верхней половине экрана по-прежнему отображается MapView. Щелчок по карте закрывает детали
Теперь я много читал о разных возможностях. Сначала я попытался использовать ContainerView примерно так:
@IBOutlet weak var detailsContainerYPosition: NSLayoutConstraint!
func mapView(mapView: MKMapView!, didSelectAnnotationView view: MKAnnotationView!) {
UIView.animateWithDuration(0.3, delay: 0.0, options: UIViewAnimationOptions.CurveEaseOut, animations: {
self. detailsContainerYPosition.constant = 0
self.view.layoutIfNeeded()
}, completion: nil)
}
Проблема заключалась в том, что метод viewDidLoad() был запущен только один раз, и я хотел использовать его для создания страницы сведений после передачи некоторых данных в класс контроллера.
Итак, затем я поиграл с пользовательским переходом и пришел к следующему:
class DetailsSegue: UIStoryboardSegue {
override func perform() {
// Assign the source and destination views to local variables.
var mapView = self.sourceViewController.view as UIView!
var detailsView = self.destinationViewController.view as UIView!
// Get the screen width and height.
let screenWidth = UIScreen.mainScreen().bounds.size.width
let screenHeight = UIScreen.mainScreen().bounds.size.height
// Specify the initial position of the destination view.
detailsView.frame = CGRectMake(0.0, screenHeight, screenWidth, 140)
// Access the app's key window and insert the destination view above the current (source) one.
let window = UIApplication.sharedApplication().keyWindow
window?.insertSubview(detailsView, aboveSubview: mapView)
// Animate the transition.
UIView.animateWithDuration(0.4, animations: { () -> Void in
detailsView.frame = CGRectOffset(detailsView.frame, 0.0, -140)
}, completion: nil)
}
}
Это кажется лучшим решением, потому что я могу отправить некоторые данные новому контроллеру в функции prepareForSegue() И метод viewDidLoad() запускается каждый раз, когда этот переход инициируется, но теперь я борюсь: - Каждый раз, когда аннотация нажимается и вызывается переход, вставляется новый вид. Но если ОДИН детальный вид уже виден, я хотел бы просто обновить этот - я не могу найти способ раскрутить этот переход, когда didDeselectAnnotationView вызывается из MapView.
Но, возможно, у кого-то здесь есть еще лучший способ добиться такого пользовательского интерфейса.