视图控制器
一、自定义视图(label-textField组合视图)
自定义视图的优点:
1.通过自己封装的视图,可用于别的项目,大大降低开发成本,提高开发效率
2.高质量代码的特点:可复用,可移植,精炼等。(高内聚,低耦合)
自定义LTView使用了一种设计模式:复合设计模式
封装自定义视图的步骤:
如果不想被其他人在外界胡乱修改设置,就可以通过延展的方式在的.m文件中声明和实现视图控件,只需要设置几个传参数的方法就可以了
1.声明UILabel和UITextField控件
2.重写LTView的初始化方法,在初始化的时候拿到总体的frame,在对子视图进行布局
- (instancetype)initWithFrame:(CGRect)frame{
//如果外界在调用的时候,frame赋值有误操作,例如宽度给了个0或者负数,这个时候我们就无法正常布局,为了更正这种误操作,需要对frame中的宽度和高度进行判断,看值是否在合理的区间内。
//根据目测宽度最小是240,所以如果外面传进来的宽度小于240,那么就让宽度改为240;
if (frame.size.width < 240) {
frame.size.width = 240;
}
//根据目测高度最小是45,所以如果外面传进来高度小于45,那么就让宽度改为45;
if (frame.size.height < 45) {
frame.size.height = 45;
}
//当子视图添加的时候,添加到了父视图矩形的外部,显示可以,但是不能进行交互
self = [super initWithFrame:frame];
if (self) {
//进行自定义的初始化的操作
_leftLable = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, frame.size.width/3, frame.size.height)];
_rightTF = [[UITextField alloc] initWithFrame:CGRectMake(frame.size.width/3, 0, frame.size.width*2/3, frame.size.height)];
[self addSubview:_leftLable];
[self addSubview:_rightTF];
self.backgroundColor = [UIColor greenColor];
}
return self;
}
3.设置传参数的方法,并且要在.h文件中声明方法
- (void)receivePlaceHolder:(NSString*)placeholder{
self.rightTF.placeholder = placeholder;
}
//获取Textfield文本中框中的内容
- (NSString*)textfieldContent{
return self.rightTF.text;
}
//为Textfield设置代理
- (void)addDelegate:(id)delegate{
self.rightTF.delegate = delegate;
}
4.使用的时候直接通过调用方法传递参数
//给Textfield设置输入提示
[ltView receivePlaceHolder:@"请输入用户名"];
//
[ltView addDelegate:self];
UIAlertView的学习
在点击事件完成以后显示警示框(弹出框、提示框),
1.//创建对象。参数为弹出框的标题,内容,代理对象,取消按钮,其他按钮(可以有多个),
注意:按钮的位置,取消按钮永远是在0 index的位置上
UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"友情提示" message:@"您已到达洗澡区域,请您尽快脱掉衣服" delegate:self cancelButtonTitle:@"不脱" otherButtonTitles:@"已脱",@"马上脱", nil];
2.//显示alert
[alert show];
二、视图控制器
1.视图控制器是应用程序数据和视图之间的重要桥梁,每个iOS应用程序只显示一个用户界面,显示的内容是由控制器或一组视图控制器协调管理,所以,视图控制器提供了一个基本的框架来构建应用程序
2.UIViewController是所有视图控制器的父类。
3.iOS提供了许多内置的视图控制器,以支持标准的用户界面部分,比如:导航控制器(UINavigationController),标签控制器(UITabBarController),表视图控制器(UITableViewController)等。
4.视图控制器的功能:
1.控制视图大小变换、布局视图、响应事件。
2.检测以及处理内存警告。
3.检测以及处理屏幕旋转。
4.检测视图的切换
5.实现模块独立,提高复用性。
5.视图控制器的使用:--使用哪个视图控制器,就用那个来创建根视图控制器对象
self.window.rootViewController = [[ViewController alloc] init];
三、视图控制器指定视图
视图控制器本身自带的View的设置:
1.加载视图(在该方法中对VC自带的视图进行初始化操作)---对ViewController自带的视图进行加载,也是系统启动的第一个View
- (void)loadView{
[super loadView];
//创建一个我们需要的视图
LoginView* myView = [[LoginView alloc] initWithFrame:[UIScreen mainScreen].bounds];
//将自定义创建的View赋值给系统创建的View
self.view = myView;
}
2.视图加载完毕 - (void)viewDidLoad{
[super viewDidLoad];
NSLog(@"%s,%d",__FUNCTION__,__LINE__);//打印执行的方法名和执行代码的行数
VC生命周期里的一个方法,当执行这个方法的时候,说明VC自带的视图已经加载完毕,我们可以对该视图进行操作,一般视图控制器自带的视图都是和屏幕(window)一样大小。一般都是在该方法中初始化我们的UI控件。
}
四、MVC
1.UIViewController是MVC设计模式的核心。
2.MVC是一个框架级的设计模式,M是Model,主要用于建立数据模型(及数据的结构)。V是View,我们能看到的所有控件都是View,View的主要功能是展示数据。C数控制器,主要是控制M和V的通信。
3.M和C之间通过通知(Natification)和KVO来通信。
4.V和C之间通过协议代理和target通信
5.MVC的优点:低耦合性、高重用性和可适用性,系统的可维护性、可扩展性增强,代码量是一样
五、屏幕旋转LandscapeRight
1.屏幕的方向:Portrait(竖向),UpsideDown(颠倒),LandscapeLeft(左横屏),LandscapeRight(右横屏)
2.检测屏幕的旋转
1.supportedInterfaceOrientations(设置设备支持旋转的方向,如果不添加,视图控制器将无法检测屏幕的旋转)。
2.willRotateToInterfaceOrientation:duration:(暂停音乐、关闭视图交互等)。
3.willAnimateRotationToInterfaceOrientation:duration:(添加自定义动画等)。
4.didRotateFromInterfaceorientation:(播放音乐、打开视图交互等)。
3.视图的处理
1.注意视图控制器会自动调整View的大小以适应屏幕旋转,bounds被修改,触发View的layoutSubviews方法。
2.View重写layoutSubviews方法,根据设备方向,重新布局
3.[UIApplication shareApplication].statusBarOrientation提供设备当前方向
4.举例
当屏幕发生旋转或者当前视图的bounds或者frame发生改变的时候,View会执行下面的方法,在该方法中我们对视图上面的子控件进行重新布局
- (void) layoutSubviews{
[super layoutSubviews];
//拿到需要调整位置的控件的frame
CGRect labelRect = self.userNameLabel.frame;
//判断屏幕是否横屏
//[UIApplication sharedApplication]:得到应用程序对象
UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
switch (orientation) {
case UIInterfaceOrientationUnknown:
NSLog(@"不知道当前屏幕的方向");
break;
case UIInterfaceOrientationPortrait:
NSLog(@"竖屏方向");
//设置回初始状态
labelRect = CGRectMake(100, 100, 100, 50);
break;
case UIInterfaceOrientationPortraitUpsideDown:
NSLog(@"倒立方向");
break;
case UIInterfaceOrientationLandscapeLeft:
NSLog(@"左横屏方向");
// labelRect.origin = CGPointMake(([UIScreen mainScreen].bounds.size.width - CGRectGetWidth(labelRect))/2, (([UIScreen mainScreen].bounds.size.height - CGRectGetHeight(labelRect))/2));
self.userNameLabel.center = self.center;
break;
case UIInterfaceOrientationLandscapeRight:
NSLog(@"右横屏方向");
labelRect.origin = CGPointMake(([UIScreen mainScreen].bounds.size.width - CGRectGetWidth(labelRect))/2, ([UIScreen mainScreen].bounds.size.height - CGRectGetHeight(labelRect))/2);
break;
default:
break;
}
self.userNameLabel.frame = labelRect;
}
六、内存警告
当我们发生内存问题的时候,系统会自动调用该方法,一般是释放内存不及时
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
NSLog(@"内存警告了");
//如果当前视图已经被加载,但是又没有显示。
if ([self isViewLoaded] && [self.view window] == nil) {
self.view = nil;
}
}
七、懒加载
懒加载 lazy load :本质上就是重写属性的getter方法,当调用该属性的getter方法的时候。在该方法内部对属性进行初始化操作
- (UILabel*)userNameLabel{
//当外部调用该属性的getter方法的时候,我们先判断该对象是否已经给创建过了。如果已经创建,那么,直接返回
if (!_userNameLabel) {
//创建控件属性的对象
_userNameLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 50)];
//将控件对象添加到View上
[self addSubview:_userNameLabel];
}
return _userNameLabel;
}
网友评论