##DAY3 自定义视图、视图控制器、视图控制器指定视图、loadView、 viewDidLoad、MVC、屏幕旋转、内存警告
##DAY3 自定义视图、视图控制器、视图控制器指定视图、loadView、 viewDidLoad、MVC、屏幕旋转、内存警告
#pragma mark ———————自定义视图的步骤 ———————————
自定义视图的步骤:
1)明确该视图内部有什么控件,并且将所有控件声明成属性
2)重写LTView继承UIView的布局方法(initWithFrame:),来创建子视图,并且添加子视图(定义label和textField的布局frame,并将其添加到LTView中)(注意开辟空间,一定要将子视图加入到父视图上)(这里是 self = [super initWithFrame:frame];)
3)自定义初始化方法(定义label和textField的基本属性)(这里是 self = [self initWithFrame:frame];)
4)内存管理(label和textField在第二步创建时alloc增加的引用计数,或是使用setter方法增加的引用计数)
#pragma mark ———————视图控制器 ———————————
视图控制器:
视图控制器概述:
1)视图控制器是应用程序数据和视图之间的重要桥梁,每个iOS应⽤程序只显示一个用户界面,显示的内容是由控制器或一组视图控制器协调管理。所以,视图控制器提供了一个基本的框架来构建应用程序。
2)UIViewController是所有视图控制器的父类。
3)iOS提供了许多内置的视图控制器,以支持标准的用户界面部分,比如导航控制器(UINavigationController), 标签控制器(UITabBarController), 表视图控制器(UITableViewController)等。
视图控制器的功能:
1)控制视图大小变换、布局视图、响应事件.
2)检测以及处理内存警告。
3)检测以及处理屏幕旋转。
4)检测视图的切换。
5)实现模块独立性,提高复用性
设置window的根视图控制器:
第一步:引入视图控制器的头文件
第二步:在application:didFinishLaunchingWithOptions:方法中定义window的根视图
视图控制器的使⽤:
第一步:定义UIViewController的子类(创建视图控制器类MyUIViewController)
第二步:在APPDelegate里创建视图控制器对象(myViewController),作为window的根视图控制器(指定window的根视图控制器self.window.rootView = myViewController;)
第三步:在视图控制器类(MyUIViewController)的viewDidLoad方法中,使用默认创建好的视图对象(self.view)(在viewDidLoad方法内部创建视图,并且添加到根视图(self.view)上面)
注意:无法改变视图控制器上默认视图(self.view)的布局(frame)
视图控制器的默认视图用 init 初始化即可:
UIView *view = [[UIView alloc] init];
view.backgroundColor = [UIColor redColor];
self.view = view;
#pragma mark ———————视图控制器指定视图 ———————————
视图控制器指定视图:
1)自定义视图类继承UIViw。在初始化方法中添加子视图控件。
2)重写controller的loadView⽅法。创建自定义视图对象(alloc),并指定为 controller的view。(注:loadView方法在控制器的view为nil的时候被调用,用于以编程的方式创建view。loadView是使用代码生成视图的时候,当视图第一次载入的时候调用的⽅法,用于使用(写)代码来实现控件。)
3)将子视图控件对象设置为自定义视图类的属性,在viewDidLoad方法中进行设置:添加action、设置delegate等等。
4)在controller中添加按钮点击事件实现和代理⽅法的实现。
#pragma mark ———————loadView、 viewDidLoad———————————
loadView 方法的注意事项:
1)loadView在每一次使用self.view这个property,并且self.view为nil的时候被调用,用以产生一个有效的self.view(手工维护views,必须重写该方法)
2)view 控制器收到didReceiveMemoryWarning的消息时, 默认的实现是检查当前控制器的view是否在使用。 如果它的view不在当前正在使用的view hierarchy里面,且你的控制器实现了loadView方法,那么这个view将被release, loadView方法将被再次调用来创建一个新的view。(注:iOS6.0以下 如果没有实现loadView,内存警告时不会调用viewDidUnload)
重写loadView 方法的注意事项:
1)加载根视图的方法,我们通常在这个方法中,指定根视图为我们想要的某个视图
2)并且在一个视图器生命周期中,这个方法只会走一次
3)在加载方法中不能使用self.view这个getter方法获取根视图,因为此时根视图正在加载,并没有真实存在
viewDidLoad方法的注意事项:
1)视图控制器加载完毕的方法,默认视图控制器是空白师徒,并且背景色是透明色clearColor
2)如果想要显示内容,只需在此方法内部创建视图,并且添加到根视图(sefl.view)上面
3)一般我们会在这里做界面上的初始化操作,比如往view中添加一些子视图、从数据库或者网络加载模型数据到子视图中
#pragma mark ———————MVC———————————
MVC概述:
1)UIViewController是MVC设计模式的核心。
2)MVC是一个框架级的设计模式。
3)M是Model,主要用建⽴数据模型(即数据的结构)。
4)V是View,我们能看到的所有控件都是view,view主要的功能是展示数据。
5)C是控制器,主要是控制M和V的通信。
#pragma mark ———————屏幕旋转———————————
屏幕旋转:
检测屏幕旋转:
视图控制器本身能检测到屏幕的旋转,如果要处理屏幕旋转,需要重写几个方法:
1)supportedInterfaceOrientations(设置设备支持旋转的方向,如果不添加,视图控制器将无法检测屏幕的旋转)。
2)willRotateToInterfaceOrientation:duration:(旋转的时候,暂停音乐、关闭视图交互等)。
3)willAnimateRotationToInterfaceOrientation:duration:(添加自定义动画等)。
4)didRotateFromInterfaceOrientation:(播放音乐、打开视图交互等)。
视图控制器的其他重要方法:
1)视图控制器里的视图的大小发生改变的时候,视图控制器会收到这个方法的通知(即这个方法会在此时自动执行):
viewWillTransitionToSize:withTransitionCoordinator:
2)设置屏幕旋转时支持的方法,返回所有视图控制器支持的方向(注意home键在上的情况默认不处理):
supportedInterfaceOrientations
/*
注意:在这个方法的API中可找到以下枚举值,这里不详细介绍
//UIInterfaceOrientationMaskAll 横屏和竖屏
//UIInterfaceOrientationMaskLandscape 横屏
*/
视图的处理:
1)注意视图控制器会自动调整view的大小以适应屏幕旋转,bounds被修改, 触发view的layoutSubviews方法。
2)view重写layoutSubviews方法,根据设备方向,重新布局。
3)[UIApplication shareApplication].statusBarOrientation提供设备当前方向(获取应用程序的状态栏的方向)。
//只要视图本身的bounds发生变化,此方法就会执行
- (void)layoutSubviews {
//获取屏幕方向 UIInterfaceOrientation(枚举类型)
UIInterfaceOrientation orientaion = [UIApplication sharedApplication].statusBarOrientation;
//判断是否横向
if (orientaion == UIInterfaceOrientationLandscapeLeft || orientaion == UIInterfaceOrientationLandscapeRight) {
self.getbackButton.frame = CGRectMake(300, 150, 100, 40);
}else {
self.getbackButton.frame = CGRectMake(150, 150, 100, 40);
}
}
#pragma mark ———————内存警告———————————
内存警告:
ios下每个app可用的内存是被限制的,如果一个app使用的内存超过了这个阀值,则系统会向该app发送Memory Warning消息。收到消息后,app必须尽可能多的释放一些不必要的内存,否则OS会关闭app。
注意:
1)多用lazyCode(懒加载)
2)viewDidLoad由于在初次创建viewcontroller和重新恢复时都会调用,因此这个函数需要注意区分不同的情况,设置正确的状态。
http://blog.sina.com.cn/s/blog_65c178a80101gb66.html
##DAY3 自定义视图、视图控制器、视图控制器指定视图、loadView、 viewDidLoad、MVC、屏幕旋转、内存警告的更多相关文章
- iOS学习之视图加载过程中会触发的方法(loadView/viewDidLoad/didReceiveMemoryWarning)
1.loadView 这是视图控制器用来加载根视图的方法; 如果需要将自定义的视图作为根视图,则不需要调用父类对该方法的实现([super loadView]);直接将自定义视图通过self.view ...
- iOS创建自定义的xib视图,不带控制器调用
1 我们平常使用视图都是在控制器中加载各种视图,但是有时候一个单独的视图,弄一个控制器未免有些显得太沉重了,所以我们现在来创建一个带xib加载视图的自定义视图 2 创建一个视图类集成uiview 3 ...
- MVC 在控制器中获取某个视图动态的HTML代码
ASP.NET MVC 在控制器中获取某个视图动态的HTML代码 如果我们需要动态的用AJAX从服务器端获取HTML代码,拼接字符串是一种不好的方式,所以我们将HTML代码写在cshtml文件中, ...
- UI基础:视图控制器.屏幕旋转.MVC 分类: iOS学习-UI 2015-07-02 22:21 62人阅读 评论(0) 收藏
UIViewController 视图控制器,继承自UIResponder,作用:管理视图并且响应事件 功能: 1.分担APPdelegate的工作 2.实现模块独立,能提高复用性 创建UIViewC ...
- ASP.NET MVC 在控制器中获取某个视图动态的HTML代码
如果我们需要动态的用AJAX从服务器端获取HTML代码,拼接字符串是一种不好的方式,所以我们将HTML代码写在cshtml文件中,然后通过代码传入model,动态获取cshtml中的HTML代码 当然 ...
- iOS:集合视图UICollectionView、集合视图控制器UICollectionViewController、集合视图单元格UICollectionViewCell(创建表格的另一种控件)
两种创建表格方式的比较:表格视图.集合视图(二者十分类似) <1>相同点: 表格视图:UITableView(位于storyboard中,通过UIViewController控制器实现 ...
- ASP.NET MVC 5 学习教程:控制器传递数据给视图
原文 ASP.NET MVC 5 学习教程:控制器传递数据给视图 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字 ...
- [Xcode 实际操作]三、视图控制器-(3)使用UINavigationController视图控制器
目录:[Swift]Xcode实际操作 本文将演示导航视图控制器的使用. 选择项目导航区的资源文件夹.需要导入两张图片,作为选项卡控制器的图标. [+]->[Import]->选择图片-& ...
- Android自定义视图一:扩展现有的视图,添加新的XML属性
这个系列是老外写的,干货!翻译出来一起学习.如有不妥,不吝赐教! Android自定义视图一:扩展现有的视图,添加新的XML属性 Android自定义视图二:如何绘制内容 Android自定义视图三: ...
随机推荐
- ASP.NET 4.0升级至ASP.NET 4.5需要注意的地方 【转】
原以为只要在Visual Studio 2012中将每个项目的Target framework设置为.NET Framewor 4.5进行编译,然后在web.config中设置compilation的 ...
- Swift中元组(Tuples),结构体(Struct),枚举(Enums)之间的区别
Swift有许多种存储数据方式,你可以用枚举(enums),元组(tuples),结构体(structs),类(classes),在这篇文章中我们将比较枚举.元组.结构体之间区别,首先从最简单的开始- ...
- 【迪杰斯特拉双关键字最短路】【HDU3790】【最短路径问题】
题目大意: 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. 只需要再更新的时候判断一下就好 voi ...
- inline函数
C语言中的inline函数并不是单纯的用函数块内容来替换,也可能存在局部变量啥的.另外,使用inline定义的函数只是建议编译器作为内联函数处理,但并不一定真会这样处理.inline一般直接在头文件中 ...
- css 实现评分效果
css实现评分效果,其实是css sprites (css精灵)的延伸应用,效果的实现主要是由 background-position 属性移动图片位置.之前看到有前辈写过关于这方面的内容,在理解上 ...
- Jquery二级简单折叠菜单
写在前面: 1.前端新手 2.欢迎交流 3. 源代码百度云页面示例链接: http://pan.baidu.com/s/1nt0yjd3 链接失效请留言 效果图: 代码部分:jquery部分: < ...
- python基础之 re(正则表达式)模块学习
今天学习了Python中有关正则表达式的知识.关于正则表达式的语法,不作过多解释,网上有许多学习的资料.这里主要介绍Python中常用的正则表达式处理函数. re.match re.match 尝试从 ...
- Android_CodeWiki_03
1.发送不重复的通知(Notification) public static void sendNotification(Context context, String title, String m ...
- 转载 java枚举类型enum的使用 (原文地址:http://blog.csdn.net/wgw335363240/article/details/6359614)
java枚举类型enum的使用 最近跟同事讨论问题的时候,突然同事提到我们为什么java中定义的常量值不采用enmu枚举类型,而采用public final static 类型来定义呢?以前我们都是采 ...
- JQuery DataTables Editor---页面内容修改&&数据库信息修改 (1)
我们使用jquery datatables 不光是为了对数据的展示,同时需要对数据惊行简单的操作,这个操作分为两个部分:1.页面内容的修改:2.对应的数据库信息的修改. 前一篇博文介绍了页面级的操作, ...