Use*_*343 6 iphone objective-c uiviewanimationtransition ios
在我的iOS应用程序中,我需要更改应用程序.so之间的窗口的rootviewController,当我更改我的rootviewcontroller dyncamically它在更改之前轻弹视图.但我想要的是在rootviewcontroller更改时给出平滑过渡.
我试过以下但不是我想要的过渡.
[UIView transitionWithView:self.window
duration:.8
options:UIViewAnimationOptionTransitionCurlUp
animations:^{
self.window.rootViewController = tabBarControllerMain;
[self.window makeKeyAndVisible];
}
completion:NULL];
Run Code Online (Sandbox Code Playgroud)
我想要特定的过渡,如navigationcontroller pushview过渡.
任何机构能否让我知道如何实现这一目标?
Wuj*_*ujo 11
基于Hardik Darji的回答,我创建了UIWindow扩展来交换rootViewController,其中可配置的动画类型模拟系统动画 - 推,弹出,呈现和关闭.
斯威夫特3.
public enum SwapRootVCAnimationType {
case push
case pop
case present
case dismiss
}
extension UIWindow {
public func swapRootViewControllerWithAnimation(newViewController:UIViewController, animationType:SwapRootVCAnimationType, completion: (() -> ())? = nil)
{
guard let currentViewController = rootViewController else {
return
}
let width = currentViewController.view.frame.size.width;
let height = currentViewController.view.frame.size.height;
var newVCStartAnimationFrame: CGRect?
var currentVCEndAnimationFrame:CGRect?
var newVCAnimated = true
switch animationType
{
case .push:
newVCStartAnimationFrame = CGRect(x: width, y: 0, width: width, height: height)
currentVCEndAnimationFrame = CGRect(x: 0 - width/4, y: 0, width: width, height: height)
case .pop:
currentVCEndAnimationFrame = CGRect(x: width, y: 0, width: width, height: height)
newVCStartAnimationFrame = CGRect(x: 0 - width/4, y: 0, width: width, height: height)
newVCAnimated = false
case .present:
newVCStartAnimationFrame = CGRect(x: 0, y: height, width: width, height: height)
case .dismiss:
currentVCEndAnimationFrame = CGRect(x: 0, y: height, width: width, height: height)
newVCAnimated = false
}
newViewController.view.frame = newVCStartAnimationFrame ?? CGRect(x: 0, y: 0, width: width, height: height)
addSubview(newViewController.view)
if !newVCAnimated {
bringSubview(toFront: currentViewController.view)
}
UIView.animate(withDuration: 0.3, delay: 0, options: [.curveEaseOut], animations: {
if let currentVCEndAnimationFrame = currentVCEndAnimationFrame {
currentViewController.view.frame = currentVCEndAnimationFrame
}
newViewController.view.frame = CGRect(x: 0, y: 0, width: width, height: height)
}, completion: { finish in
self.rootViewController = newViewController
completion?()
})
makeKeyAndVisible()
}
Run Code Online (Sandbox Code Playgroud)
}
UIViewController *viewControllerToBeShown=[[UIViewController alloc]init];
//viewControllerToBeShown.view.frame = self.view.frame;
viewControllerToBeShown.view.backgroundColor = [UIColor orangeColor];
AppDelegateClass *yourAppDelegate =(AppDelegateClass*)[UIApplication sharedApplication].delegate;
UIView *myView1 = yourAppDelegate.window.rootViewController.view;
UIView *myView2 = viewControllerToBeShown.view;
myView2.frame = yourAppDelegate.window.bounds;
[yourAppDelegate.window addSubview:myView2];
CATransition* transition = [CATransition animation];
transition.startProgress = 0;
transition.endProgress = 1.0;
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromRight;
transition.duration = 5.0;
// Add the transition animation to both layers
[myView1.layer addAnimation:transition forKey:@"transition"];
[myView2.layer addAnimation:transition forKey:@"transition"];
myView1.hidden = YES;
myView2.hidden = NO;
yourAppDelegate.window.rootViewController = viewControllerToBeShown;
Run Code Online (Sandbox Code Playgroud)
迅速
guard let appDelegate = UIApplication.shared.delegate,
let appDelegateWindow = appDelegate.window,
let appDelegateView = window.rootViewController?.view,
let viewContollersView = viewController.view else {
return
}
viewContollersView.frame = (appDelegateWindow?.bounds)!
appDelegate.window??.addSubview(viewContollersView)
let transition = CATransition()
transition.startProgress = 0
transition.endProgress = 1.0
transition.type = kCATransitionPush
transition.subtype = kCATransitionFromRight
transition.duration = 0.35
appDelegateView.layer.add(transition, forKey: "transition")
viewContollersView.layer.add(transition, forKey: "transition")
appDelegateView.isHidden = true
viewContollersView.isHidden = false
appDelegateWindow?.rootViewController = viewController
Run Code Online (Sandbox Code Playgroud)
以下是Swift中有关如何在rootviewcontroller中制作Push和Pop动画的代码.
//Declare enum
enum AnimationType{
case ANIMATE_RIGHT
case ANIMATE_LEFT
case ANIMATE_UP
case ANIMATE_DOWN
}
// Create Function...
func showViewControllerWith(newViewController:UIViewController, usingAnimation animationType:AnimationType)
{
let currentViewController = UIApplication.sharedApplication().delegate?.window??.rootViewController
let width = currentViewController?.view.frame.size.width;
let height = currentViewController?.view.frame.size.height;
var previousFrame:CGRect?
var nextFrame:CGRect?
switch animationType
{
case .ANIMATE_LEFT:
previousFrame = CGRectMake(width!-1, 0.0, width!, height!)
nextFrame = CGRectMake(-width!, 0.0, width!, height!);
case .ANIMATE_RIGHT:
previousFrame = CGRectMake(-width!+1, 0.0, width!, height!);
nextFrame = CGRectMake(width!, 0.0, width!, height!);
case .ANIMATE_UP:
previousFrame = CGRectMake(0.0, height!-1, width!, height!);
nextFrame = CGRectMake(0.0, -height!+1, width!, height!);
case .ANIMATE_DOWN:
previousFrame = CGRectMake(0.0, -height!+1, width!, height!);
nextFrame = CGRectMake(0.0, height!-1, width!, height!);
}
newViewController.view.frame = previousFrame!
UIApplication.sharedApplication().delegate?.window??.addSubview(newViewController.view)
UIView.animateWithDuration(0.33,
animations: { () -> Void in
newViewController.view.frame = (currentViewController?.view.frame)!
currentViewController?.view.frame = nextFrame!
})
{ (fihish:Bool) -> Void in
UIApplication.sharedApplication().delegate?.window??.rootViewController = newViewController
}
}
// call the func for ANIMATE_LEFT or ANIMATE_RIGHT etc
self.showViewControllerWith(rootViewController, usingAnimation: AnimationType.ANIMATE_LEFT)
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助...