我正在用Swift構建一個小應用程序,我想要實現以下功能: - 帶有幾個註釋的MapView - 點擊其中一個註釋顯示一些詳細信息覆蓋層從底部移動並填充約。屏幕的一半 - 顯示屏的上半部分仍顯示MapView。在地圖上單擊關閉細節ViewController作爲Swift中的MapView上的疊加層(如Google Maps應用程序用戶界面)
現在我已閱讀了很多關於不同的可能性。我第一次使用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中()方法只能觸發一次,我想用它來建立將一些數據傳遞給控制器類後的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時,我找不到任何方法來展開這個細節。
但也許這裏的任何人有更好的方式來實現這樣的用戶界面。
謝謝,但它看起來像你的GitHub項目是空的;) – Pym
哦,對不起。我只是更新了項目,所以它現在包含實際的代碼。 – flavordaaave
輝煌的我的朋友;謝謝 – gadget00