2015-04-14 41 views
2

我正在用Swift構建一個小應用程序,我想要實現以下功能: - 帶有幾個註釋的MapView - 點擊其中一個註釋顯示一些詳細信息覆蓋層從底部移動並填充約。屏幕的一半 - 顯示屏的上半部分仍顯示MapView。在地圖上單擊關閉細節ViewController作爲Swift中的MapView上的疊加層(如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中()方法只能觸發一次,我想用它來建立將一些數據傳遞給控制器​​類後的Details頁面。

所以下次我打得四處定製賽格瑞並與該凸輪起來:

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()方法在每次啓動這個segue時被觸發,但現在我很掙扎: - 每次單擊註釋並調用segue時,都會插入一個新的View。但是,如果一個細節視圖已經可見,我想只更新這一個 - 當我從MapView調用didDeselectAnnotationView時,我找不到任何方法來展開這個細節。

但也許這裏的任何人有更好的方式來實現這樣的用戶界面。

回答

3

我終於設法得到我想要通過手動添加視圖控制器和這樣的觀點:

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

輝煌的我的朋友;謝謝 – gadget00

相關問題