MKMapView不遵守动画延迟

时间:2016-07-24 06:03:35

标签: ios swift mkmapview

我正在摆弄我在游乐场的MKMapView,我在设置frame.size.height动画时遇到了麻烦。这是我的Playground代码:

let vc = UIViewController()
vc.view.backgroundColor = UIColor.whiteColor()
XCPlaygroundPage.currentPage.liveView = vc

let map = MKMapView(frame: vc.view.frame)
map.backgroundColor = UIColor.redColor()
map.autoresizesSubviews = false
vc.view.addSubview(map)

UIView.animateWithDuration(2.0, delay: 1.0, usingSpringWithDamping: 0.5, initialSpringVelocity: 1.0, options: .CurveEaseInOut, animations: {

    map.frame.size.height = 200

    }, completion: nil)

您可以通过观察地图的红色背景颜色来判断实际动画的发生时间。可见地图的高度在MKMapView高度之前减小。设置autoresizesSubviews = false似乎没有做任何事情。那么为什么看起来好像有两个截然不同的动画呢?

更新在我的操场上,我删除了所有MKMapView子视图和_MKMapContentView,地图的两个子视图之一(另一个是“法律”{{ 1}}),被删除,只用它的红色背景呈现MKAttributionLabel。因此MKMapView被调整为子视图,但是调用_MKMapContentView并没有成功。是什么给了什么?

enter image description here

2 个答案:

答案 0 :(得分:0)

如果你愿意的话,这有点像黑客。我尝试使用animateWithDuration:delay:usingSpringWithDamping和非零延迟动画地图的高度。我的问题是_MKMapContentView不会遵守延迟,这就是解释不同动画的原因。

所以,在@Matt的famous delay solution的帮助下,我废弃了我的函数延迟并将整个方法放在延迟块中,这样任何(子)视图都会同时生成动画。

delay(3.5) {

    UIView.animateWithDuration(1.0, delay: 0, usingSpringWithDamping: 0.8, initialSpringVelocity: 1.0, options: .CurveEaseInOut, animations: {

        map.frame.size.height -= 200

        }, completion: nil)

}


func delay(delay:Double, closure:()->()) {
    dispatch_after(
        dispatch_time(
            DISPATCH_TIME_NOW,
            Int64(delay * Double(NSEC_PER_SEC))
        ),
        dispatch_get_main_queue(), closure)
}

有点变通方法,但它确实有效。仍然渴望了解为什么地图的子视图不遵守功能延迟,如果有人有想法的话。

答案 1 :(得分:-1)

我想你可能会用这个来避免:

arr[0] = 2**15 + 2
arr