iOS 开发学习之 User Interface(5)UIView 与 UIViewController【二】
2016-01-16 16:31
639 查看
UIViewController 生命周期
从视图控制器创建,在屏幕上显示视图,再到被销毁的过程。一个生命周期内viewDidLoad只被调用一次。见图一
// 视图控制器在经过alloc之后,开始生成UIView
- (void)loadView {
[super loadView];
//
加载视图
//
如果有 storyboard
活着 xib, 那么视图控制器就直接获取它里面的UIView
//
若无则需通过 [[UIView alloc] init];
来生成一个view
// 一般情况下,无需干涉此方法
NSLog(@"加载视图(制作或获取视图):%s",__FUNCTION__);
}
// 视图加载完毕,注意:这个方法执行后,视图还没有显示到屏幕上
- (void)viewDidLoad {
[superviewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColorredColor];
//
添加一个按钮
UIButton *btn = [[UIButtonalloc]initWithFrame:CGRectMake(100,150,180,40)];
[self.viewaddSubview:btn];
btn.backgroundColor = [UIColorblueColor];
[btn setTitle:@"跳转到第二页"forState:UIControlStateNormal];
[btn setTitleColor:[UIColorwhiteColor]forState:UIControlStateNormal];
[btn addTarget:selfaction:@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 上下翻转效果
——————————————————————————————
// 先获取当前视图控制器的父容器的所有子视图控制器
NSArray *arr =self.parentViewController.childViewControllers;
// 通过本视图控制器的父容器将当前视图切换成下一视图
[self.parentViewControllertransitionFromViewController:selftoViewController:arr[1]duration:2options:UIViewAnimationOptionTransitionFlipFromLeftanimations:nilcompletion:nil];
自定义容器视图控制器
方法,属性:
指定一个视图控制器作为容器视图控制器
addChildViewController: // 在容器视图控制器里添加子视图控制器
removeFromParentViewController // 从容器视图控制器里脱离
view.addSubview:
transitionFromViewController:toViewController:duration:options:animations:completion:
// 从一个视图控制器跳转到另一个视图控制器
.childViewControllers // 容器视图控制器的所有子视图控制器
.parentViewController // 子视图控制器的父视图控制器
——————————————————————————————
动画
<一> UIView(UIViewAnimation) 类方法
+ (void)beginAnimations:(nullableNSString
*)animationID context:(nullablevoid *)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:(nullableid)delegate; // default = nil
+ (void)setAnimationWillStartSelector:(nullableSEL)selector;
// default = NULL. -animationWillStart:(NSString *)animationID context:(void *)context
+ (void)setAnimationDidStopSelector:(nullableSEL)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))actionsWithoutAnimationNS_AVAILABLE_IOS(7_0);
案例一:
//取出动画对象, uv
UIView *uv = [self.viewviewWithTag:1];
// 创建一个动画块,动画块的开始,第一个为名字,第二个为动画上下文,都可以为nil
[UIViewbeginAnimations:@"first_ani"context:nil];
// 设置动画的持续时间
[UIViewsetAnimationDuration:5.0];
//
动画延时
[UIViewsetAnimationDelay:5];
//
动画执行的次数
[UIViewsetAnimationRepeatCount:2];
//
uv.center =
CGPointMake(50,self.view.frame.size.height-60);
// 变化过程中颜色发生变化
uv.backgroundColor = [UIColorblackColor];
uv.layer.cornerRadius =20;
//
转圈
uv.transform =CGAffineTransformRotate(uv.transform,M_PI);
uv.transform =CGAffineTransformScale(uv.transform,0.4,0.2);
// 提交动画,使其执行
[UIViewcommitAnimations];
案例二:
UIView *uv = [self.viewviewWithTag: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的形式创建动画
[UIViewanimateWithDuration:2delay:0options:UIViewAnimationOptionCurveEaseInanimations:blockcompletion:^(BOOL
finished){
NSLog(@"动画完成了");
[UIViewanimateWithDuration:1animations:^(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 = [[SecondViewControlleralloc]init];
//
创建自定义动画 CALayer
图层级别的
//
过度动画
CATransition *trans = [CATransitionanimation];
//
动画持续时间
[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.layeraddAnimation:transforKey:@"animal"];
// 以模态方式跳转到第二视图
[selfpresentViewController:secVCanimated:YEScompletion:^(void){
NSLog(@"视图跳转完成");
}];
//
返回来用:dismissViewControllerAnimated:YES completion:nil
}
从视图控制器创建,在屏幕上显示视图,再到被销毁的过程。一个生命周期内viewDidLoad只被调用一次。见图一
// 视图控制器在经过alloc之后,开始生成UIView
- (void)loadView {
[super loadView];
//
加载视图
//
如果有 storyboard
活着 xib, 那么视图控制器就直接获取它里面的UIView
//
若无则需通过 [[UIView alloc] init];
来生成一个view
// 一般情况下,无需干涉此方法
NSLog(@"加载视图(制作或获取视图):%s",__FUNCTION__);
}
// 视图加载完毕,注意:这个方法执行后,视图还没有显示到屏幕上
- (void)viewDidLoad {
[superviewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColorredColor];
//
添加一个按钮
UIButton *btn = [[UIButtonalloc]initWithFrame:CGRectMake(100,150,180,40)];
[self.viewaddSubview:btn];
btn.backgroundColor = [UIColorblueColor];
[btn setTitle:@"跳转到第二页"forState:UIControlStateNormal];
[btn setTitleColor:[UIColorwhiteColor]forState:UIControlStateNormal];
[btn addTarget:selfaction:@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 上下翻转效果
——————————————————————————————
// 先获取当前视图控制器的父容器的所有子视图控制器
NSArray *arr =self.parentViewController.childViewControllers;
// 通过本视图控制器的父容器将当前视图切换成下一视图
[self.parentViewControllertransitionFromViewController:selftoViewController:arr[1]duration:2options:UIViewAnimationOptionTransitionFlipFromLeftanimations:nilcompletion:nil];
自定义容器视图控制器
方法,属性:
指定一个视图控制器作为容器视图控制器
addChildViewController: // 在容器视图控制器里添加子视图控制器
removeFromParentViewController // 从容器视图控制器里脱离
view.addSubview:
transitionFromViewController:toViewController:duration:options:animations:completion:
// 从一个视图控制器跳转到另一个视图控制器
.childViewControllers // 容器视图控制器的所有子视图控制器
.parentViewController // 子视图控制器的父视图控制器
——————————————————————————————
动画
<一> UIView(UIViewAnimation) 类方法
+ (void)beginAnimations:(nullableNSString
*)animationID context:(nullablevoid *)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:(nullableid)delegate; // default = nil
+ (void)setAnimationWillStartSelector:(nullableSEL)selector;
// default = NULL. -animationWillStart:(NSString *)animationID context:(void *)context
+ (void)setAnimationDidStopSelector:(nullableSEL)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))actionsWithoutAnimationNS_AVAILABLE_IOS(7_0);
案例一:
//取出动画对象, uv
UIView *uv = [self.viewviewWithTag:1];
// 创建一个动画块,动画块的开始,第一个为名字,第二个为动画上下文,都可以为nil
[UIViewbeginAnimations:@"first_ani"context:nil];
// 设置动画的持续时间
[UIViewsetAnimationDuration:5.0];
//
动画延时
[UIViewsetAnimationDelay:5];
//
动画执行的次数
[UIViewsetAnimationRepeatCount:2];
//
uv.center =
CGPointMake(50,self.view.frame.size.height-60);
// 变化过程中颜色发生变化
uv.backgroundColor = [UIColorblackColor];
uv.layer.cornerRadius =20;
//
转圈
uv.transform =CGAffineTransformRotate(uv.transform,M_PI);
uv.transform =CGAffineTransformScale(uv.transform,0.4,0.2);
// 提交动画,使其执行
[UIViewcommitAnimations];
案例二:
UIView *uv = [self.viewviewWithTag: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的形式创建动画
[UIViewanimateWithDuration:2delay:0options:UIViewAnimationOptionCurveEaseInanimations:blockcompletion:^(BOOL
finished){
NSLog(@"动画完成了");
[UIViewanimateWithDuration:1animations:^(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 = [[SecondViewControlleralloc]init];
//
创建自定义动画 CALayer
图层级别的
//
过度动画
CATransition *trans = [CATransitionanimation];
//
动画持续时间
[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.layeraddAnimation:transforKey:@"animal"];
// 以模态方式跳转到第二视图
[selfpresentViewController:secVCanimated:YEScompletion:^(void){
NSLog(@"视图跳转完成");
}];
//
返回来用:dismissViewControllerAnimated:YES completion:nil
}
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 讲解iOS开发中基本的定位功能实现
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略
- 浅析iOS应用开发中线程间的通信与线程安全问题
- 检测iOS设备是否越狱的方法
- .net平台推送ios消息的实现方法
- 探讨Android与iOS,我们将何去何从?
- Android、iOS和Windows Phone中的推送技术详解
- IOS 改变键盘颜色代码
- 举例详解iOS开发过程中的沙盒机制与文件
- Android和IOS的浏览器中检测是否安装某个客户端的方法
- 分享一个iOS下实现基本绘画板功能的简单方法
- javascript实现阻止iOS APP中的链接打开Safari浏览器