首先说一下CALayer的两个属性 position与anchorPoint
/* The position in the superlayer that the anchor point of the layer's * bounds rect is aligned to. Defaults to the zero point. Animatable. */ @property CGPoint position; /* Defines the anchor point of the layer's bounds rect, as a point in * normalized layer coordinates - '(0, 0)' is the bottom left corner of * the bounds rect, '(1, 1)' is the top right corner. Defaults to * '(0.5, 0.5)', i.e. the center of the bounds rect. Animatable. */ @property CGPoint anchorPoint;
锚点的作用就是作为变换的支点,如旋转、平移、缩放等。
并且position是根据anchorPoint而定的,其变换为:
__.layer.position.x = __.layer.frame.origin.x + __.layer.anchorPoint.x * __.layer.bounds.size.width; __.layer.position.y = __.layer.frame.origin.y + __.layer.anchorPoint.y * __.layer.bounds.size.height;
下面说重点,类似开门关门的动画
直接上代码:
APPDelegate:
#import "AppDelegate.h" #import "ViewController.h" #import "SecondViewController.h" @interface AppDelegate () { UIWindow * _leftWindow; } @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. self.window.rootViewController = [[ViewController alloc] init]; _leftWindow = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; _leftWindow.windowLevel = UIWindowLevelNormal - 1; _leftWindow.rootViewController = [[SecondViewController alloc] init]; [_leftWindow makeKeyAndVisible]; return YES; }ViewController:
#import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. self.view.backgroundColor = [UIColor redColor]; UIView * view1 = [[UIView alloc] initWithFrame:CGRectMake(50, 200, 200, 200)]; view1.backgroundColor = [UIColor whiteColor]; [self.view addSubview:view1]; UIButton * btn = [[UIButton alloc] initWithFrame:CGRectMake(10, 10, 50, 50)]; [btn setTitle:@"click" forState:UIControlStateNormal]; [self.view addSubview:btn]; [btn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside]; } - (void) btnClick { UIWindow * currentWindow = self.view.window; CGPoint oldAnchorPoint = currentWindow.layer.anchorPoint; currentWindow.layer.anchorPoint = CGPointMake(1, 0.5); CGPoint p = CGPointMake(currentWindow.layer.position.x + currentWindow.layer.bounds.size.width * (currentWindow.layer.anchorPoint.x - oldAnchorPoint.x), currentWindow.layer.position.y +currentWindow.layer.bounds.size.height * (currentWindow.layer.anchorPoint.y - oldAnchorPoint.y)); [currentWindow.layer setPosition:p]; if (currentWindow.frame.origin.x > 0) { [UIView animateWithDuration:1.0 delay:0.3 options:UIViewAnimationOptionCurveEaseInOut animations:^{ currentWindow.layer.transform = CATransform3DIdentity; currentWindow.frame = [[UIScreen mainScreen] bounds]; } completion:^(BOOL finished) { }]; }else{ currentWindow.layer.transform = CATransform3DIdentity; CGFloat angle = -60 * M_PI / 180;//控制旋转角度 CATransform3D dh = currentWindow.layer.transform; dh.m34 = 1.0 / - 600;//这个是最重要的,控制旋转方向 dh = CATransform3DRotate(dh, angle, 0, 1, 0); [UIView animateWithDuration:1.0 delay:0.3 options:UIViewAnimationOptionCurveEaseInOut animations:^{ currentWindow.layer.transform = dh; } completion:^(BOOL finished) { }]; } }
SecondViewController:
#import "SecondViewController.h" @interface SecondViewController () @end @implementation SecondViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. self.view.backgroundColor = [UIColor purpleColor]; UIButton * btn = [[UIButton alloc] initWithFrame:CGRectMake(10, 10, 50, 50)]; [btn setTitle:@"click" forState:UIControlStateNormal]; [self.view addSubview:btn]; [btn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside]; } - (void) btnClick { UIWindow * currentWindow = [[UIApplication sharedApplication] keyWindow]; [UIView animateWithDuration:1.0 delay:0.3 options:UIViewAnimationOptionCurveEaseInOut animations:^{ currentWindow.layer.transform = CATransform3DIdentity; currentWindow.frame = [[UIScreen mainScreen] bounds]; } completion:^(BOOL finished) { }]; }