ViewController как наложение на MapView в Swift (например, пользовательский интерфейс приложения Google Maps)

Я создаю небольшое приложение с 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.

Но, возможно, у кого-то здесь есть еще лучший способ добиться такого пользовательского интерфейса.


person flavordaaave    schedule 14.04.2015    source источник
comment
См. stackoverflow.com/questions/37967555/   -  person GaétanZ    schedule 16.12.2018


Ответы (1)


Наконец-то мне удалось получить то, что я хотел, вручную добавив ViewController и такое представление:

let detailsWidth: CGFloat = view.bounds.width
let detailsHeight: CGFloat = 150
let detailsViewFrame: CGRect = CGRectMake(0, view.bounds.height, detailsWidth, detailsHeight)

detailsController = storyboard?.instantiateViewControllerWithIdentifier("details") as! DetailsViewController
detailsController.descriptionText = "I'm a text that was passed from the MainViewController"

self.addChildViewController(detailsController)
detailsController.view.frame = detailsViewFrame
view.addSubview(detailsController.view)
detailsController.didMoveToParentViewController(self)

И при отклонении деталей я удаляю контроллер следующим образом:

self.detailsController.removeFromParentViewController()

Я создал небольшой образец для демонстрации своего решения: https://github.com/flavordaaave/iOS-Container-View-Overlay

person flavordaaave    schedule 20.04.2015
comment
Спасибо, но похоже, что ваш проект GitHub пуст;) - person Pym; 12.05.2015
comment
О, извините за это. Я только что обновил проект, поэтому теперь он содержит фактический код. - person flavordaaave; 13.05.2015