2017-02-10 55 views
17

我有一個MKMapView其上有2個按鈕:放大和縮小。setRegion:MKMapView變得沒有反應

我注意到,當我使用它們時,我不能捏地圖放大,直到動畫完成。

我把我的按鈕連接到setRegion,比現在更小或更大的跨度。

我試着在我的地圖上添加一個UIPinchGestureRecognizer來停止動畫並允許捏動作。以下是我如何做到這一點:

我添加了一個Bool變量,該變量確保地圖當前是否從點擊按鈕開始動畫。

func pinchRecognized() { 
    if animating { 
     var region = self.region 
     region.span.latitudeDelta += 0.001 
     setRegion(region, animated: false) 
     animating = false 
    } 
} 

我重寫setRegion這樣的:

override func setRegion(_ region: MKCoordinateRegion, animated: Bool) { 
    if (animated) 
    { 
     animating = true 
     super.setRegion(region, animated: animated) 

     perform(#selector(noLongerAnimating), with: nil, afterDelay: 1) 
    } 
    else 
    { 
     super.setRegion(region, animated: animated) 
    } 
} 

func noLongerAnimating() { 
    animating = false 
} 

這些工作停止動畫,但捏不是由地圖本身放大的認可,即使我這樣做:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { 
    return true 
} 

我猜 pinchRecognized打破它,但我不知道如何停止動畫。

按照要求,該按鈕的代碼,這兩個按鈕使用此方法,放大使用0.5,縮小使用2:

func zoomTo(delta: Double, animated: Bool) { 
    var region = self.region 
    var span = region.span 

    span.latitudeDelta *= delta 
    span.longitudeDelta *= delta 
    if (span.latitudeDelta < 180 && span.longitudeDelta < 180) 
    { 
     region.span = span 
     setRegion(region, animated: animated) 
    } 
} 

編輯:我嘗試設置時停止動畫的setRegion(一個)在gestureRecognizer:shouldRecognizeSimultaneouslyWith:中,但在動畫地圖時不會調用它。

編輯:想什麼@robinb建議後,我看到我的註釋更新比我的地圖本身更快,這表明該區域被設置,它只是等待的東西在視覺上更新地圖。

+0

你可以發佈你的按鈕方法代碼? – CodeChanger

+0

@CodeChanger更新了問題 – vrwim

+0

覆蓋setRegion:function?的任何特定原因? –

回答

2

手勢識別器不會觸發正在動畫的視圖。在ViewController的變量/數組中保存視圖。使用代碼在這個崗位執行動畫:https://stackoverflow.com/a/13814789/3970581

這裏是testproject:https://github.com/DuncanMC/iOS-CAAnimation-group-demo

+0

我以爲這會起作用,但在手勢識別器的地圖上使用'setRegion'似乎並沒有更新地圖。單步執行代碼不會顯示任何錯誤,'setRegion'會使用正確的值進行更新,但它不會更新區域。 – vrwim

1

MapView的動畫集isUserInteractionEnabled在起動假的,但是如果你想力量,你也可以繼承的MKMapView和覆蓋的UIView的的touchesBegan方法來響應用戶的交互。您可以首先調用setCenter/setRegion(開始或目標值)而不使用動畫來中斷/退出正在進行的動畫,並將isUserInteractionEnabled設置爲true。

MKMapView使用CATiledLayer,不幸的是沒有簡單的方法可以在中斷時獲取地圖的區域和/或中心。 在另一方面,我注意到動畫持續時間是恆定的,雖然私人,所以你可以使用定時器,使地圖的區域更好的猜測時touchesBegun被稱爲

private var isAnimating: Bool = false 

override func setRegion(_ region: MKCoordinateRegion, animated: Bool) { 
    isAnimating = animated 
    ... 
} 

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    if isAnimating { 
     isAnimating = false 
     let region = // Destination region or the approximate region where the animation reached at this moment (although this is a nightmare todo) 
     setRegion(region: region, animated: false) // or use setCenter 
     isUserInteractionEnabled = true 
    } 
} 
+0

這給出了相同的結果,地圖使用setRegion(),它打破了剛剛開始的當前捏。 – vrwim