UI-第三讲:视图控制器
* 自定义视图(label-textField组合视图)
* 视图控制器
* MVC
* 屏幕旋转
* 内存警告
一 自定义视图
* 自定义视图:系统标准UI之外,自己组合而出的新的视图
* 特点:可复用,可移植(高内聚,低耦合)
* 步骤:
1. 根据需求的不同,所继承的类也会不同,一般继承于UIView,
2. 创建一个UIView子类:@Interface LTView: UIView
3. 在类的初始化方法中添加子视图:
[self addSubView : _leftLabel];
[self addSubView : _rightField];
4. 类的.h文件提供一些接口(方法),便于外界操作子视图.
@property (nonatomic, retain) UILabel *leftLabel;
@property (nonatomic, retain) UITextField *rightField;
* 自定义LTView使用了一种设计模式: 复合设计模式
二 视图控制器
* UIViewController是所有视图控制器的父类
* 功能:
1. 控制视图大小变化,布局视图,响应事件
2. 检测以及处理内存警告
3. 检测以及处理屏幕旋转
4. 检测视图切换
5. 实现模块独立,提高复用性
* 在APPDelegate里创建视图控制器对象 ,作为window的根视图控制器
-(void)loadView
{
[super loadView];
self.myView = [[MyView alloc]initWithFrame:self.view.frame];
self.view = self.myView;
[self.myView release];
}
#pragma mark - 视图加载完毕
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor grayColor];
NSLog(@"%s %d", __FUNCTION__, __LINE__);
[self.myView.button addTarget:self action:@selector(buttonAction)
forControlEvents:UIControlEventTouchUpInside];
}
#pragma mark - 点击⽅方法
-(void)buttonAction
{
NSLog(@"点击了⾃自定义视图⾥里⾯面的按钮");
三 MVC
* UIViewController是MVC设计模式的核心
* MVC是一个框架级的设计模式
* M是Model 主要用于建立数据模型(数据的结构)
* V是View 能看到的所有控件都是View,View主要的功能是展示数据
* C是控制器,主要是控制M和V的通信
四 检测屏幕旋转
* 检测屏幕旋转,需要重写下面几个方法:
1. supportedInterfaceOrientations (设置设备⽀支持旋转的方向,如果不添加,视图控制器将无法检测屏幕的旋转
2. willRotateToInterfaceOrientation:duration:(暂停音乐、关闭视图交互等)
3. willAnimateRotationToInterfaceOrientation:duration:(添加自定义动画等)
4. didRotateFromInterfaceOrientation:(播放音乐、打开视图交互等)
* 视图的处理:
1. 注意视图控制器会自动调整view的⼤小以适应屏幕旋转,bounds被修改,触发view的layoutSubviews⽅法
2. view重写layoutSubviews⽅法,根据设备⽅向,重新布局
3. [UIApplication shareApplication].statusBarOrientation提供设备当前⽅向
五 处理内存警告
* 内存警告来源:⼿机内存80M,程序运行过程中内存接近80M时程序会为每一个视图控制器发送内存警告消息
* 如何处理:
1. 控制器能监测内存警告,以便我们避免内存不够引起的crash。
2. 在定义的controller子类中重写didReceiveMemoryWarning方法
3. 释放暂时不使用的资源(self.view及view的⼦子视图例如数据对象、图像)
#pragma mark - 内存警告⽅方法
-(void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
NSLog(@"%s %d", __FUNCTION__, __LINE__);
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
if ([self isViewLoaded] == YES && self.view.window == nil) {
self.view = nil;
}
}
总结:
1. iOS提供了很多标准组件,标准组件完成我们的需要,但是适当的封装,组合一个新的控件⽆疑能给我们带来效率上的提⾼。学会自定义控件是你成为⾼手的关键⼀一步。•
2. 视图控制器是MVC中的C,⽤用于处理视图触发的事件
3. 视图控制器处理旋转和内存警告
•- (instancetype)initWithNibName:(NSString*)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil;
•- (void)viewDidLoad;
•- (void)loadView;
•- (void)viewWillAppear:(BOOL)animated;
•- (void)viewWillDisappear:(BOOL)animated;
•- (void)viewDidAppear:(BOOL)animated;
•- (void)viewDidDisappear:(BOOL)animated
•- (instancetype)initWithNibName:(NSString*)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil;
•- (void)viewDidLoad;
•- (void)loadView;
•- (void)viewWillAppear:(BOOL)animated;
•- (void)viewWillDisappear:(BOOL)animated;
•- (void)viewDidAppear:(BOOL)animated;
•- (void)viewDidDisappear:(BOOL)animated;