2015-04-14 1 views
2

Я создаю небольшое приложение со Свифт, где хочу достичь следующего: - MapView с несколькими аннотациями - Нажмите на одну из аннотаций Детали в накладке, которая перемещается снизу и заполняется ок. половина экрана - В верхней половине дисплея по-прежнему отображается MapView. A Щёлкните на карте, чтобы закрыть детали.ViewController as Overlay on MapView в Swift (например, пользовательский интерфейс приложения Google Maps)

Теперь я много читал о различных возможностях. Во-первых, я попытался с помощью ContainerView с чем-то вроде этого:

enter image description here

@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() был только уволен один раз, и я хотел бы использовать, чтобы создать страницу сведений после передачи некоторых данных классу контроллера.

Так что в следующий я играл с настраиваемой Segue и кулачок с этим:

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() function И метод viewDidLoad() запускается каждый раз, когда этот сеанс запущен, но теперь я боюсь: - Каждый раз, когда кликается клика и вызывается segue, вводится новый View. Но если ОДНО подробный вид уже виден, я хотел бы просто обновить этот файл - Я не могу найти способ развязать этот сеанс при вызове метода didDeselectAnnotationView из MapView.

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

ответ

3

Я, наконец, удалось получить то, что я хотел вручную добавить 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

+0

Спасибо, но это похоже, что ваш проект GitHub пуст;) – Pym

+0

О, извините за это. Я просто обновил проект, так что теперь он содержит фактический код. – flavordaaave

+0

Brilliant my friend; Спасибо – gadget00

 Смежные вопросы

  • Нет связанных вопросов^_^