iOS 开发学习之 User Interface(4)UIView 与 UIViewController【二】
UIViewController 生命周期
从视图控制器创建,在屏幕上显示视图,再到被销毁的过程。一个生命周期内viewDidLoad只被调用一次。见图一
// 视图控制器在经过alloc 之后,开始生成UIView
- (void)loadView {
[super loadView];
// 加载视图
// 如果有 storyboard 活着 xib, 那么视图控制器就直接获取它里面的UIView
// 若无则需通过 [[UIView alloc] init]; 来生成一个view
// 一般情况下,无需干涉此方法
NSLog(@"加载视图(制作或获取视图):%s",__FUNCTION__);
}
// 视图加载完毕,注意:这个方法执行后,视图还没有显示到屏幕上
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor redColor];
// 添加一个按钮
UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(100, 150, 180, 40)];
[self.view addSubview:btn];
btn.backgroundColor = [UIColor blueColor];
[btn setTitle:@"跳转到第二页" forState:UIControlStateNormal];
[btn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
NSLog(@"视图加载完毕:%s",__FUNCTION__);
}
// 视图将要显示到屏幕上
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
NSLog(@"视图将要显示到屏幕上:%s",__FUNCTION__);
}
// 视图显示到了屏幕上
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
NSLog(@"视图显示到了屏幕上:%s",__FUNCTION__);
}
// 视图将要离开屏幕
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
NSLog(@"视图将要离开屏幕:%s",__FUNCTION__);
}
// 视图离开了屏幕
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
NSLog(@"视图完全离开了屏幕:%s",__FUNCTION__);
// 视图离开后销毁视图
// 此设置仅为观察viewdidload 方法的执行,一般情况下不需要设置
// self.view = nil;
}
——————————————————————————————
两个视图控制器-两个页面
> 模态方式切换视图控制器。
presentViewController:animated:completion: // 模态方式呈现另一个视图
dismissViewControllerAnimated:completion: // 移除被以模态方式呈现的视图
> 页面过渡动画
1.#define定义的常量
kCATransitionFade 交叉淡化过渡
kCATransitionMoveIn 新视图移到旧视图上面
kCATransitionPush 新视图把旧视图推出去
kCATransitionReveal 将旧视图移开,显示下面的新视图
2.用字符串表示
pageCurl 向上翻一页
pageUnCurl 向下翻一页
rippleEffect 滴水效果
suckEffect 收缩效果,如一块布被抽走
cube 立方体效果
oglFlip 上下翻转效果
——————————————————————————————
动画
<一> UIView(UIViewAnimation) 类方法
+ (void)beginAnimations:(nullable NSString *)animationID context:(nullable void *)context; // additional context info passed to will start/did stop selectors. begin/commit can be nested
+ (void)commitAnimations; // starts up any animations when the top level animation is commited
// no getters. if called outside animation block, these setters have no effect.
+ (void)setAnimationDelegate:(nullable id)delegate; // default = nil
+ (void)setAnimationWillStartSelector:(nullable SEL)selector; // default = NULL. -animationWillStart:(NSString *)animationID context:(void *)context
+ (void)setAnimationDidStopSelector:(nullable SEL)selector; // default = NULL. -animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
+ (void)setAnimationDuration:(NSTimeInterval)duration; // default = 0.2
+ (void)setAnimationDelay:(NSTimeInterval)delay; // default = 0.0
+ (void)setAnimationStartDate:(NSDate *)startDate; // default = now ([NSDate date])
+ (void)setAnimationCurve:(UIViewAnimationCurve)curve; // default = UIViewAnimationCurveEaseInOut
+ (void)setAnimationRepeatCount:(float)repeatCount; // default = 0.0. May be fractional
+ (void)setAnimationRepeatAutoreverses:(BOOL)repeatAutoreverses; // default = NO. used if repeat count is non-zero
+ (void)setAnimationBeginsFromCurrentState:(BOOL)fromCurrentState; // default = NO. If YES, the current view position is always used for new animations -- allowing animations to "pile up" on each other. Otherwise, the last end state is used for the animation (the default).
+ (void)setAnimationTransition:(UIViewAnimationTransition)transition forView:(UIView *)view cache:(BOOL)cache; // current limitation - only one per begin/commit block
+ (void)setAnimationsEnabled:(BOOL)enabled; // ignore any attribute changes while set.
+ (BOOL)areAnimationsEnabled;
+ (void)performWithoutAnimation:(void (^)(void))actionsWithoutAnimation NS_AVAILABLE_IOS(7_0);
案例一:
//取出动画对象, uv
UIView *uv = [self.view viewWithTag:1];
// 创建一个动画块, 动画块的开始, 第一个为名字,第二个为动画上下文,都可以为nil
[UIView beginAnimations:@"first_ani" context:nil];
// 设置动画的持续时间
[UIView setAnimationDuration:5.0];
// 动画延时
[UIView setAnimationDelay:5];
// 动画执行的次数
[UIView setAnimationRepeatCount:2];
//
uv.center = CGPointMake(50, self.view.frame.size.height-60);
// 变化过程中颜色发生变化
uv.backgroundColor = [UIColor blackColor];
uv.layer.cornerRadius = 20;
// 转圈
uv.transform = CGAffineTransformRotate(uv.transform, M_PI);
uv.transform =CGAffineTransformScale(uv.transform, 0.4, 0.2);
// 提交动画,使其执行
[UIView commitAnimations];
案例二:
UIView *uv = [self.view viewWithTag:1];
void (^block)(void) = ^(void){
uv.transform = CGAffineTransformRotate(uv.transform, M_PI/3);
// 创建一个动画块, 动画块的开始, 第一个为名字,第二个为动画上下文,都可以为nil
// [UIView beginAnimations:@"first_ani" context:nil];
// // 动画延时
// [UIView setAnimationDelay:5];
// // 动画执行的次数
// [UIView setAnimationRepeatCount:2];
// uv.center = CGPointMake(50, self.view.frame.size.height-60);
// 取出 uv 的 center
CGPoint pt = uv.center;
pt.y -= 20;
uv.center = pt;
};
//实用block 的形式创建动画
[UIView animateWithDuration:2 delay:0 options:UIViewAnimationOptionCurveEaseIn animations:block completion:^(BOOL finished){
NSLog(@"动画完成了");
[UIView animateWithDuration:1 animations:^(void) {
uv.transform = CGAffineTransformRotate(uv.transform, -M_PI/3);
// uv.center = CGPointMake(150, 40);
CGPoint pt2 = uv.center;
pt2.y += 20;
uv.center = pt2;
// uv.transform = CGAffineTransformRotate(uv.transform, 2*M_PI/3);
}];
}];
案例三:
一种更简单的方式:transform 平移
// 设置 uv 的 transform,完成平移操作,affine:矩阵,translate:移动
// 改变位置的四种方法:bounds/transform/frame/center
uv.transform = CGAffineTransformTranslate(uv.transform, -50, 0);
// 旋转: Rotate, 第一个参数是 uv 起始位置, M_PI/2 -> 90度
uv.transform = CGAffineTransformRotate(uv.transform, M_PI/4);
// 缩放, 后面两个参数代表 x、y 方向上的倍数
uv.transform = CGAffineTransformScale(uv.transform, 0.5, 0.5);
// 反转
uv.transform = CGAffineTransformInvert(uv.transform);
//设置uv 随子视图的变化而变化
uv.autoresizesSubviews = YES;
//设置uv 的子视图label 以何种模式适应父视图uv 的变化,带位移的枚举可用 | 等
// lb.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
lb.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin;
<二> CALayer 图层级别动画
// 点击事件
- (void)btnClick:(UIButton *)btn {
// 初始化第二视图对象
SecondViewController *secVC = [[SecondViewController alloc] init];
// 创建自定义动画 CALayer 图层级别的
// 过度动画
CATransition *trans = [CATransition animation];
// 动画持续时间
[trans setDuration:2];
// 设置动画的类型
/*
1.#define定义的常量
kCATransitionFade 交叉淡化过渡
kCATransitionMoveIn 新视图移到旧视图上面
kCATransitionPush 新视图把旧视图推出去
kCATransitionReveal 将旧视图移开,显示下面的新视图
2.用字符串表示
pageCurl 向上翻一页
pageUnCurl 向下翻一页
rippleEffect 滴水效
suckEffect 收缩效果,如一块布被抽走
cube 立方体效果
oglFlip 上下翻转效果
*/
// [trans setType:@"cube"];
[trans setType:@"pageCurl"];
// 动画运动的方向
[trans setSubtype:kCATransitionFromRight];
// 把动画的效果添加到layer 上
[self.view.window.layer addAnimation:trans forKey:@"animal"];
// 以模态方式跳转到第二视图
[self presentViewController:secVC animated:YES completion:^(void){
NSLog(@"视图跳转完成");
}];
// 返回来用:dismissViewControllerAnimated:YES completion:nil
}