UI第三天:⾃定义视图、视图控制器
2015-11-12 21:06
351 查看
⼀、⾃定义视图
自定义视图步骤
1.创建了一个UIview类
2.重写新类的
初始化方法
3.把想添加的视图
封装到新类里面(初始化到新类中)
4.为了方便外部进行赋值取值把添加的视图写成属性(别忘了deacllo释放)
5.测试一下;
自定义视图的好处 :
提高工作效率 大大提高代码的复用性
label-textField视图
假设我们使⽤LTView类代表label-textfield视图。
我们创建⼀个LTView类继承于UIView。
我们将LTView作为⼀个容器,在LTView的初始化⽅法中创建并添加 label和textField。
此时的LTView就变成了⼀个具有label和textField的视图了。
//
重写初始化方法
在初始化LTView的同时把label也加上去
-(instancetype)initWithFrame:(CGRect)frame
{
self = [super
initWithFrame:frame];
if(self)
{
self.label = [[UILabel
alloc]initWithFrame:
CGRectMake(0,
0,self.frame.size.width/3,
self.frame.size.height)];
self.label.backgroundColor
= [UIColor
clearColor];
self.label.textAlignment
= NSTextAlignmentCenter;
[self
addSubview:self.label];
[_label
release];
self.text = [[UITextField
alloc]initWithFrame:CGRectMake(self.frame.size.width/3+20,
0,
self.frame.size.width/3*2-20,
self.frame.size.height)];
self.text.borderStyle
= UITextBorderStyleRoundedRect;
[self
addSubview:self.text];
[_text
release];
//获取动态宽度与高度
// CGFloat width = frame.size.width;
// CGFloat height = frame.size.height;
}
return
self;
}
⾃定义LTView使⽤了⼀种设计模式:复合设计模式。
复合设计模式:A类中,使⽤B类(或者更多类)作为⾃⼰的成员(实例 变量)。
iOS中复合是特别常⻅的设计模式。iOS新控件往往都是⽤已有控件组合 ⽽成的。
⼆、视图控制器指定⾃定义View
视图控制器概述
UIViewController:视图控制器。
控制视图显⽰,响应事件。
分担AppDelegate的⼯作。
实现模块独⽴,提⾼复⽤性。
视图控制器功能
控制视图⼤⼩变换、布局视图、响应事件。
检测以及处理内存警告。
检测以及处理屏幕旋转。
检测视图的切换。
MVC概述
UIViewController是MVC设计模式的核⼼。
MVC是⼀个框架级的设计模式。
M是Model,主要⽤于建⽴数据模型(即数据的结构)
V是View,我们能看到的所有控件都是view,view主要的功能是展⽰数据。
C是控制器,主要是控制M和V的通信
/*
MVC 是一种设计模式
好处:让视图(view)可以复用
应用:
1.视图层(view)
只写视图
的布局
2.数据模型层(model)只写数据的结构(只写ns开头的)
3.控制器(control)负责逻辑部分(例如从model中取数据然后区更改视图显示)
MVC 把工程中的代码模块化
尽量让视图部分代码复用降低耦合度
一般一个视图控制器控制一个页面
*/
使⽤视图控制器
定义UIViewController的⼦类
创建视图控制器对象,作为window的根视图控制器
在viewDidLoad中使⽤默认创建好的视图对象view
self.window.backgroundColor
= [UIColor
whiteColor];
[self.window
makeKeyAndVisible];
// 显示控制器自带的view
// 给window设置一个根视图控制器
// 初始化控制器
RootViewController *rootVC = [[RootViewController
alloc]init];
// 设置根视图控制器
[self.window
setRootViewController:rootVC];
// 释放
[rootVC release];
为什么使⽤⾃定义视图类
UIViewController⾃带⼀个空的view,与需求不符合。
视图控制器只负责控制视图显⽰,响应事件。
//
每一个视图控制器都自带一个view
//
并且这个view与屏幕一样大小
//这个方法是加载视图
并且加载的是自己自带的view
如何设置
⾃定义视图类继承UIView。在初始化⽅法中添加⼦视图控件。
重写controller的loadView⽅法。
创建⾃定义视图对象,并指定为controller 的view。
将⼦视图控件对象设置为⾃定义视图类的属性,在viewDidLoad⽅法中进 ⾏设置:添加action、设置delegate等等。
在controller中添加按钮点击事件实现和代理⽅法的实现。
-(void)loadView
{
// 调用父类的方法去加载自身视图0
// [super loadView];
//
用loginView
替换控制自带的view
LoginView *login = [[LoginView
alloc]initWithFrame:[UIScreen
mainScreen].bounds];
// 帮系统给赋值
self.view = login;
login.tag =
1000;
login.username.tag =
1100;
login.password.tag =
1101;
[login release];
}
//
视图已经加载完成
- (void)viewDidLoad {
[super
viewDidLoad];
// Do any additional setup after loading the view.
//更改自身view的颜色
self.view.backgroundColor
= [UIColor
tiankonglan];
//控制器中写逻辑部分
// 给button添加一个点击方法
LoginView *view =(LoginView *)self.view;
[view.login
addTarget:self
action:@selector(login:)
forControlEvents:UIControlEventTouchUpInside];
view.username.text.delegate
= self;
view.password.text.delegate
= self;
}
三、检测屏幕旋转
检测屏幕旋转
视图控制器本⾝能检测到屏幕的旋转,如果要处理屏幕旋转,需要重写⼏个 ⽅法:
/*
屏幕旋转
屏幕横屏改变原来布局
竖屏时
竖屏布局
1.允许屏幕选择
2.指定屏幕旋转的方向
3.找到旋转触发方法
4.判断屏幕方向更改布局
5.测试一下
*/
//允许屏幕旋转
-(BOOL)shouldAutorotate
{
return
YES;
}
// 指定屏幕旋转方向
-(NSUInteger)supportedInterfaceOrientations
{
return
UIInterfaceOrientationMaskAll;
}
// 旋转时触发的方法
-(void)viewWillTransitionToSize:(CGSize)size
withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
NSLog(@"%@",NSStringFromCGSize(size));
}
//重新布局子视图
//frame发生变化时候会触发layoutSubview方法
-(void)layoutSubviews
{
//不知道父类做了什么所有需要在从写的时候先调用父类方法
//然后再写自己的方法
[super
layoutSubviews];
//frame 发生变化相当于
横屏了
//更改布局
//判断竖屏还是横屏
//1.把应用程序取出来
//2.判断一下当前应用程序屏幕朝向
//单例方法的命名规范share什么
UIApplication *app = [UIApplication
sharedApplication];
//判断方向
if (app.statusBarOrientation ==
UIInterfaceOrientationPortrait||app.statusBarOrientation
== UIInterfaceOrientationPortraitUpsideDown) {
self.password.frame
= CGRectMake(self.username.frame.origin.x,
self.username.frame.origin.y+KRow,
self.username.frame.size.width,
self.username.frame.size.height);
}else
{
self.password.frame
= CGRectMake((self.username.frame.origin.x+10
+ self.username.frame.size.width),
self.username.frame.origin.y,
self.username.frame.size.width,
self.username.frame.size.height);
}
}
四、处理内存警告
处理内存警告
控制器能监测内存警告,以便我们避免内存不够引起的crash。
在定义的controller⼦类中重写didReceiveMemoryWarning⽅法。
释放暂时不使⽤的资源。(数据对象、图像)
//
接到内存警告触发的方法
- (void)didReceiveMemoryWarning {
[super
didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
NSLog(@"内存警告了");
// 释放已经显示过的并且不是当前显示的视图
// 如果这个视图正在被显示那么这个视图的window属性不是空的
if ([self
isViewLoaded] ==
YES &&
self.view.window
==nil) {
//把当前视图
释放
self.view =
nil;
}
}
五、容器视图控制器
常⽤⽅法
self.view显⽰:viewWillAppear: 和 viewDidAppear:
self.view消失:viewWillDisappear: 和 viewDidDisappear:
当self.view添加到⽗视图上时,执⾏appear⽅法:
当self.view从⽗视 图上移除时,执⾏disappear⽅法。
演⽰执⾏顺序
定义FirstViewController、SecondViewController类,first作为window 的根视图控制器。
将SecondViewController的view添加到FirstViewController的view上。
将SecondViewController的view移除。
查看SecondViewController中4个⽅法的执⾏顺序。
//如果你不想替换self.view一般都写在viewDidLoad方法中
//添加子控制器
self.secondVC = [[SeconViewController
alloc]init];
//把secondVC添加成子控制器
让rootVC去管理
[self
addChildViewController:self.secondVC];
//把seondVC.view
添加到 rootVC.view上
[self.view
addSubview:self.secondVC.view];
//释放
[self.secondVC
release];
self.view.backgroundColor
= [UIColor
redColor];
//添加一个按钮移除移除子视图控制器
UIButton *button = [UIButton
buttonWithType:UIButtonTypeCustom];
button.frame =
CGRectMake(100,
100,
100,
100);
button.backgroundColor = [UIColor
brownColor];
//添加方法删除视图
[button addTarget:self
action:@selector(delete:)
forControlEvents:UIControlEventTouchUpInside];
//添加到rootVC.view上
[self.view
addSubview:button];
}
-(void)delete:(UIButton *)button;
{
// 视图删了
[self.secondVC.view removeFromSuperview];
// 移除子控制器
[self.secondVC removeFromParentViewController];
}
//
视图生命周期
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
NSLog(@"视图就要出现");
}
-(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
NSLog(@"视图已经出现");
}
-(void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
NSLog(@"视图将要消失");
}
-(void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
NSLog(@"视图已经消失");
}
总结
iOS提供了很多标准组件,标准组件完成我们的需要,但是适当的 封装,组合⼀个新的控件⽆疑能给我们带来效率上的提⾼。学会⾃ 定义控件是你成为⾼⼿的关键⼀步。
视图控制器是MVC中的C,⽤于处理视图触发的事件。
处理旋转和内存警告
自定义视图步骤
1.创建了一个UIview类
2.重写新类的
初始化方法
3.把想添加的视图
封装到新类里面(初始化到新类中)
4.为了方便外部进行赋值取值把添加的视图写成属性(别忘了deacllo释放)
5.测试一下;
自定义视图的好处 :
提高工作效率 大大提高代码的复用性
label-textField视图
假设我们使⽤LTView类代表label-textfield视图。
我们创建⼀个LTView类继承于UIView。
我们将LTView作为⼀个容器,在LTView的初始化⽅法中创建并添加 label和textField。
此时的LTView就变成了⼀个具有label和textField的视图了。
//
重写初始化方法
在初始化LTView的同时把label也加上去
-(instancetype)initWithFrame:(CGRect)frame
{
self = [super
initWithFrame:frame];
if(self)
{
self.label = [[UILabel
alloc]initWithFrame:
CGRectMake(0,
0,self.frame.size.width/3,
self.frame.size.height)];
self.label.backgroundColor
= [UIColor
clearColor];
self.label.textAlignment
= NSTextAlignmentCenter;
[self
addSubview:self.label];
[_label
release];
self.text = [[UITextField
alloc]initWithFrame:CGRectMake(self.frame.size.width/3+20,
0,
self.frame.size.width/3*2-20,
self.frame.size.height)];
self.text.borderStyle
= UITextBorderStyleRoundedRect;
[self
addSubview:self.text];
[_text
release];
//获取动态宽度与高度
// CGFloat width = frame.size.width;
// CGFloat height = frame.size.height;
}
return
self;
}
⾃定义LTView使⽤了⼀种设计模式:复合设计模式。
复合设计模式:A类中,使⽤B类(或者更多类)作为⾃⼰的成员(实例 变量)。
iOS中复合是特别常⻅的设计模式。iOS新控件往往都是⽤已有控件组合 ⽽成的。
⼆、视图控制器指定⾃定义View
视图控制器概述
UIViewController:视图控制器。
控制视图显⽰,响应事件。
分担AppDelegate的⼯作。
实现模块独⽴,提⾼复⽤性。
视图控制器功能
控制视图⼤⼩变换、布局视图、响应事件。
检测以及处理内存警告。
检测以及处理屏幕旋转。
检测视图的切换。
MVC概述
UIViewController是MVC设计模式的核⼼。
MVC是⼀个框架级的设计模式。
M是Model,主要⽤于建⽴数据模型(即数据的结构)
V是View,我们能看到的所有控件都是view,view主要的功能是展⽰数据。
C是控制器,主要是控制M和V的通信
/*
MVC 是一种设计模式
好处:让视图(view)可以复用
应用:
1.视图层(view)
只写视图
的布局
2.数据模型层(model)只写数据的结构(只写ns开头的)
3.控制器(control)负责逻辑部分(例如从model中取数据然后区更改视图显示)
MVC 把工程中的代码模块化
尽量让视图部分代码复用降低耦合度
一般一个视图控制器控制一个页面
*/
使⽤视图控制器
定义UIViewController的⼦类
创建视图控制器对象,作为window的根视图控制器
在viewDidLoad中使⽤默认创建好的视图对象view
self.window.backgroundColor
= [UIColor
whiteColor];
[self.window
makeKeyAndVisible];
// 显示控制器自带的view
// 给window设置一个根视图控制器
// 初始化控制器
RootViewController *rootVC = [[RootViewController
alloc]init];
// 设置根视图控制器
[self.window
setRootViewController:rootVC];
// 释放
[rootVC release];
为什么使⽤⾃定义视图类
UIViewController⾃带⼀个空的view,与需求不符合。
视图控制器只负责控制视图显⽰,响应事件。
//
每一个视图控制器都自带一个view
//
并且这个view与屏幕一样大小
//这个方法是加载视图
并且加载的是自己自带的view
如何设置
⾃定义视图类继承UIView。在初始化⽅法中添加⼦视图控件。
重写controller的loadView⽅法。
创建⾃定义视图对象,并指定为controller 的view。
将⼦视图控件对象设置为⾃定义视图类的属性,在viewDidLoad⽅法中进 ⾏设置:添加action、设置delegate等等。
在controller中添加按钮点击事件实现和代理⽅法的实现。
-(void)loadView
{
// 调用父类的方法去加载自身视图0
// [super loadView];
//
用loginView
替换控制自带的view
LoginView *login = [[LoginView
alloc]initWithFrame:[UIScreen
mainScreen].bounds];
// 帮系统给赋值
self.view = login;
login.tag =
1000;
login.username.tag =
1100;
login.password.tag =
1101;
[login release];
}
//
视图已经加载完成
- (void)viewDidLoad {
[super
viewDidLoad];
// Do any additional setup after loading the view.
//更改自身view的颜色
self.view.backgroundColor
= [UIColor
tiankonglan];
//控制器中写逻辑部分
// 给button添加一个点击方法
LoginView *view =(LoginView *)self.view;
[view.login
addTarget:self
action:@selector(login:)
forControlEvents:UIControlEventTouchUpInside];
view.username.text.delegate
= self;
view.password.text.delegate
= self;
}
三、检测屏幕旋转
检测屏幕旋转
视图控制器本⾝能检测到屏幕的旋转,如果要处理屏幕旋转,需要重写⼏个 ⽅法:
/*
屏幕旋转
屏幕横屏改变原来布局
竖屏时
竖屏布局
1.允许屏幕选择
2.指定屏幕旋转的方向
3.找到旋转触发方法
4.判断屏幕方向更改布局
5.测试一下
*/
//允许屏幕旋转
-(BOOL)shouldAutorotate
{
return
YES;
}
// 指定屏幕旋转方向
-(NSUInteger)supportedInterfaceOrientations
{
return
UIInterfaceOrientationMaskAll;
}
// 旋转时触发的方法
-(void)viewWillTransitionToSize:(CGSize)size
withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
NSLog(@"%@",NSStringFromCGSize(size));
}
//重新布局子视图
//frame发生变化时候会触发layoutSubview方法
-(void)layoutSubviews
{
//不知道父类做了什么所有需要在从写的时候先调用父类方法
//然后再写自己的方法
[super
layoutSubviews];
//frame 发生变化相当于
横屏了
//更改布局
//判断竖屏还是横屏
//1.把应用程序取出来
//2.判断一下当前应用程序屏幕朝向
//单例方法的命名规范share什么
UIApplication *app = [UIApplication
sharedApplication];
//判断方向
if (app.statusBarOrientation ==
UIInterfaceOrientationPortrait||app.statusBarOrientation
== UIInterfaceOrientationPortraitUpsideDown) {
self.password.frame
= CGRectMake(self.username.frame.origin.x,
self.username.frame.origin.y+KRow,
self.username.frame.size.width,
self.username.frame.size.height);
}else
{
self.password.frame
= CGRectMake((self.username.frame.origin.x+10
+ self.username.frame.size.width),
self.username.frame.origin.y,
self.username.frame.size.width,
self.username.frame.size.height);
}
}
四、处理内存警告
处理内存警告
控制器能监测内存警告,以便我们避免内存不够引起的crash。
在定义的controller⼦类中重写didReceiveMemoryWarning⽅法。
释放暂时不使⽤的资源。(数据对象、图像)
//
接到内存警告触发的方法
- (void)didReceiveMemoryWarning {
[super
didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
NSLog(@"内存警告了");
// 释放已经显示过的并且不是当前显示的视图
// 如果这个视图正在被显示那么这个视图的window属性不是空的
if ([self
isViewLoaded] ==
YES &&
self.view.window
==nil) {
//把当前视图
释放
self.view =
nil;
}
}
五、容器视图控制器
常⽤⽅法
self.view显⽰:viewWillAppear: 和 viewDidAppear:
self.view消失:viewWillDisappear: 和 viewDidDisappear:
当self.view添加到⽗视图上时,执⾏appear⽅法:
当self.view从⽗视 图上移除时,执⾏disappear⽅法。
演⽰执⾏顺序
定义FirstViewController、SecondViewController类,first作为window 的根视图控制器。
将SecondViewController的view添加到FirstViewController的view上。
将SecondViewController的view移除。
查看SecondViewController中4个⽅法的执⾏顺序。
//如果你不想替换self.view一般都写在viewDidLoad方法中
//添加子控制器
self.secondVC = [[SeconViewController
alloc]init];
//把secondVC添加成子控制器
让rootVC去管理
[self
addChildViewController:self.secondVC];
//把seondVC.view
添加到 rootVC.view上
[self.view
addSubview:self.secondVC.view];
//释放
[self.secondVC
release];
self.view.backgroundColor
= [UIColor
redColor];
//添加一个按钮移除移除子视图控制器
UIButton *button = [UIButton
buttonWithType:UIButtonTypeCustom];
button.frame =
CGRectMake(100,
100,
100,
100);
button.backgroundColor = [UIColor
brownColor];
//添加方法删除视图
[button addTarget:self
action:@selector(delete:)
forControlEvents:UIControlEventTouchUpInside];
//添加到rootVC.view上
[self.view
addSubview:button];
}
-(void)delete:(UIButton *)button;
{
// 视图删了
[self.secondVC.view removeFromSuperview];
// 移除子控制器
[self.secondVC removeFromParentViewController];
}
//
视图生命周期
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
NSLog(@"视图就要出现");
}
-(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
NSLog(@"视图已经出现");
}
-(void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
NSLog(@"视图将要消失");
}
-(void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
NSLog(@"视图已经消失");
}
总结
iOS提供了很多标准组件,标准组件完成我们的需要,但是适当的 封装,组合⼀个新的控件⽆疑能给我们带来效率上的提⾼。学会⾃ 定义控件是你成为⾼⼿的关键⼀步。
视图控制器是MVC中的C,⽤于处理视图触发的事件。
处理旋转和内存警告
相关文章推荐
- 关于Activity销毁,而绘制UI的子线程未销毁出现的问题
- How to queue a heartbeat to get faster when an enemy is near
- Unable to create a constant value of type 'Closure type'
- POJ 2031 Building a Space Station【最小生成树 Kruskal】
- Extending query processing with search components
- UIImageView 圆形
- Codeforces Testing Round #12 C. Subsequences 树状数组维护DP
- UILabel UISwitch UISegmentedControl UIAlertView
- valueOf跟toString区别
- 《duilib入门到精通》- duilib概述
- NRV (named return value)
- UISwitch开关
- 《iOS Human Interface Guidelines》——Color and Typography
- String,StringBuffer与StringBuilder的区别??
- 属性动画之ValueAnimator
- 属性动画之ValueAnimator
- 属性动画之ValueAnimator
- leetcode@ [303/304] Range Sum Query - Immutable / Range Sum Query 2D - Immutable
- 单例 + UIScrollView
- easyui datagrid 单选框 效果