我正在摆弄我在游乐场的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
并没有成功。是什么给了什么?
答案 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