1. 定义自定义跳转动画
1.1 UIViewControllerTransitioningDelegate代理的两个方法
1.2 实现'UIViewControllerAnimatedTransitioning'协议中的方法
1.3 在animateTransition方法中,把要跳转到的控制器的view添加到容器视图上
1.4 修改view锚点注意事项
2. 启动图设置
2.1 两种方式
2.2 两种方式的比较
3. PCH文件
4. 杂货铺
4.1 把导航条和导航条阴影设置为透明
4.2 把导航条返回按钮变成自定义的图片
4.3 让某个子控件一直在最前方显示
1. 定义自定义跳转动画
设置跳转到控制器的代理协议
实现协议的两个方法
根据提示实现'UIViewControllerAnimatedTransitioning'协议中的方法
千万别忘记设置controller的modalPresentationStyle,不然还是会用系统的。
1.1 UIViewControllerTransitioningDelegate代理的两个方法
这两个方法都需要返回UIViewControllerAnimatedTransitioning协议的对象
遵守协议,并返回self
//模态控制器时调用
- (nullable id )animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source;
{
self.type = TransitionTypeModal;
return self;
}
//dismiss时调用
- (nullable id )animationControllerForDismissedController:(UIViewController *)dismissed;
{
self.type = TransitionTypeDismiss;
return self;
}
1.2 实现'UIViewControllerAnimatedTransitioning'协议中的方法
这两个方法,在模态和dismiss的时候都会调用
第一个方法用来设置转场动画的时间
第二个方法用来设置转场时的操作(animateTransition)
//转场的时间
- (NSTimeInterval)transitionDuration:(nullable id )transitionContext;
{
return 1;
}
//设置转场上下文
- (void)animateTransition:(id )transitionContext;
1.3 在animateTransition方法中,把要跳转到的控制器的view添加到容器视图上
步骤如下:
获取容器视图
获取目标控制器
获取来源控制器
把目标控制的view添加到容器视图中
一定要告诉系统,转场动画已经完成(如果不告诉系统,那么系统不允许第二个页面交互)
- (void)animateTransition:(id )transitionContext;
{
//获取容器视图
UIView * containerView = [transitionContext containerView];
//获取目标控制器
UIViewController * toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
//获取来源控制器
UIViewController * fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
//判断模态 还是dismiss,转场动画其实就是把目标控制器的view添加到容器视图中
if(self.type == TransitionTypeModal)
{
[containerView addSubview:toVC.view];
//一上来 就让toVC.view转到一个用户看不到的地方
toVC.view.transform = CGAffineTransformMakeRotation(-M_PI_2);
//然后再给一个动画 回到原来的位置
[UIView animateWithDuration:[self transitionDuration:nil] animations:^{
toVC.view.transform = CGAffineTransformIdentity;
fromVC.view.transform = CGAffineTransformMakeRotation(M_PI_2);
} completion:^(BOOL finished) {
//告诉系统转场动画结束 否则 就不能够和用户交互
[transitionContext completeTransition:YES];
}];
}
else if (self.type == TransitionTypeDismiss)
{
[UIView animateWithDuration:[self transitionDuration:nil] animations:^{
fromVC.view.transform = CGAffineTransformMakeRotation(-M_PI_2);
toVC.view.transform = CGAffineTransformIdentity;
}completion:^(BOOL finished) {
//4.告诉系统转场动画结束 否则 就不能够和用户交互
[transitionContext completeTransition:YES];
}];
}
}
1.4 修改view锚点注意事项
view在修改完锚点之后,记得要修改一下frame。
锚点会影响容器视图的frame
在子控制器ViewDidLoad中设置anchoPoint值会重新设置frame,所以必须重新设置frame
//!!!!!!注意 顺序不要换
//修改锚点
self.view.layer.anchorPoint = CGPointMake(0.5, 1.5);
//修改frame
self.view.frame = self.view.bounds;
2. 启动图设置
2.1 两种方式
APP的启动图片有两种方式:
方式一:设置Lauch Images
方式二:使用LaunchScreen.storyboard
2.2 两种方式的比较
如果使用原始的启动图片的形式
启动图决定分辨率的大小
会出现假适配,就是屏幕的上下出现黑边。这是苹果的历史原因造成的。
一般不太使用这种方式
新的方式,使用LaunchScreen.storyboard,
这个sb中的控制器比较特殊,不能指定控制器
类写代码,最终系统会按照这个vc的样子变成一张图片.进行展示
在这个vc上直接放一个imageView,设置填充模式即可
//开机动画
- (void)launchScreen{
// 使用SB生成controller
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"LaunchScreen" bundle:nil];
UIViewController *vc = [sb instantiateInitialViewController];
[self.view addSubview:vc.view];
// 设置动画
[UIView animateWithDuration:2 animations:^{
GMLog(@"~~~~~~~~~~~");
vc.view.transform = CGAffineTransformMakeScale(3, 3);
vc.view.alpha = 0;
} completion:^(BOOL finished) {
[vc.view removeFromSuperview];
}];
}
3. PCH文件
Xcode5中创建一个工程的时候,系统会自动创建一个以以工程名为名字的pch(Precompile Prefix Header)文件
Xcode5.0 之后PCH就消失了,不会自动创建PCH文件。
作用:
定义常用的宏:屏幕的宽高、iOS系统版本号
倒入常用的头文件:例如Masonry.h之类的
定义调试的宏
一个工程里面只有一个PCH文件,通常不改名字。
4. 杂货铺
4.1 把导航条和导航条阴影设置为透明
// 设置导航栏透明
[self.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
[self.navigationBar setShadowImage:[UIImage new]];
4.2 把导航条返回按钮变成自定义的图片
// 设置返回按钮的字,及自定义返回按钮图片
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"" style:UIBarButtonItemStylePlain target:self action:nil];
[self.navigationController.navigationBar setBackIndicatorImage:[UIImage imageNamed:@"btn_backItem"]];
[self.navigationController.navigationBar setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@"btn_backItem"]];
4.3 让某个子控件一直在最前方显示
//布局子控件
- (void)viewDidLayoutSubviews{
[super viewDidLayoutSubviews];
[self.view bringSubviewToFront:_barView];
}