尝试编写自定义segue,其中源视图被扩展,同时更改目标的alpha以淡化目标。目标是MKMapView,所以我希望它随着淡入淡出而更新。
通过我的尝试,我最终得到了源和指定同时扩展,我无法获得扩展的源视图。
class Map_Segue: UIStoryboardSegue {
override func perform()
{
var sourceViewController : UIViewController = self.sourceViewController as UIViewController
var destinationViewController : UIViewController = self.destinationViewController as UIViewController
destinationViewController.view.alpha = 0 sourceViewController.addChildViewController(destinationViewController) sourceViewController.view.addSubview(destinationViewController.view)
UIView.animateWithDuration(2.0,delay:1.0,options: UIViewAnimationOptions.CurveEaseInOut, // delay of 1 second for aesthetics
animations:
{
sourceViewController.view.transform = CGAffineTransformScale(sourceViewController.view.transform, 100.0, 100.0);
destinationViewController.view.alpha = 1;
},
completion:
{ (finished:Bool)->Void in
destinationViewController.didMoveToParentViewController(sourceViewController);
}
)
}
}
我已经尝试了autoresizesSubviews=false
,但这似乎没有做任何事情。
我已经尝试将动画中的目标变换设置为1/100(并将选项设置为UIViewAnimationOptions.CurveLinear
,其最终结果正确,但过渡效果错误(背景中的地图放大了然后再次下来)
我相信这应该很容易,而且我很想找到一个技巧,因为我是新手。
有人有任何想法吗?
更新
我发现(有点明显)我应该使用sourceViewController.view.superview?.insertSubview( destinationViewController.view, atIndex:0)
将它与原始源视图一起插入,而不是作为它的子节点,这样,显然,转换是独立的,而不是尊重到父视图(它将作为子视图)。然后问题是交换到新视图。使用我所拥有的方法,不会调用viewWillAppear和类似的东西,并且更改视图不起作用。如果我调用presentViewController,那么在调用viewWillAppear时会出现故障。
解决方案
忘记使用自定义segues。按照这个建议,在地图视图的顶部放置了一个UIImageView,并在大约5分钟的编码过程中获得了漂亮的动画效果。
答案 0 :(得分:0)
我认为你对父视图控制器和子视图控制器等有点困惑。暂时将第二个视图控制器的视图添加到第一个,执行转换然后然后就足够了清理。
我在一个简单的示例项目中测试了以下内容。请注意,我将第二个视图控制器的视图添加到窗口而不是第一个视图控制器的视图中,否则它也会被放大。
override func perform() {
let first = self.sourceViewController as ViewController
let second = self.destinationViewController as ViewController
second.view.alpha = 0
first.view.window!.addSubview(second.view)
UIView.animateWithDuration(2.0, delay: 0.0,
options: .CurveEaseInOut, animations: { () -> Void in
first.view.transform = CGAffineTransformMakeScale(100.0, 100.0)
second.view.alpha = 1.0
})
{ (finished: Bool) -> Void in
second.view.removeFromSuperview()
first.presentViewController(second, animated: false, completion: nil)
}
}