您的位置:首页 > 产品设计 > UI/UE

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,⽤于处理视图触发的事件。

处理旋转和内存警告
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: