一>自定义label - textField 视图
  • 自定义视图:系统标准UI之外,自己组合而出的新的视图
  • iOS 提供了很多UI组件 ,借助它们,我们可以做各种程序
  • 尽管如此,实际开发中,我们还需要自定义视图.积累自己的代码库,方便开发.自己封装的视图,能像系统UI控件一样,用于比别的项目中,能大大降低开发成本,提高开发效率.
——————>自定义视图的步骤
  • 根据需求的不同,自定义视图继承的类也有所不同,一般自定义的视图会继承于UIView ,以下是自定义视图的要点:
  • 1>创建一个UIView子类
  • 2>在类的初始化方法中添加子类图
  • 3>类的.h文件提供一些接口(方法 ) ,便于外界操作子视图
———————>label - textField 视图
  • 假设我们使用LTView 类代表label - textfield 视图
  • 我们创建一个LTView 类继承与UIView
// 创建一个view类继承与UIView ,声明一些属性变量 用于外界接口用
#import <UIKit/UIKit.h>

@interface LTView : UIView

//接口 方便外部操作
@property(nonatomic,retain)UILabel *label;
@property(nonatomic,retain)UITextField *textField;
//按钮接口
@property(nonatomic,retain)UIButton *button;
@end
  • 我们将LTView 作为一个容器 ,在LTView 的初始化方法中创建并添加label 和textField
//在view实现文件中初始化( 固定写法 ) 在初始化中 创建并添加label 和 textField
#import "LTView.h"

@implementation LTView

//固定初始化方法
-(id)initWithFrame:(CGRect)frame
{
    //frame 要重写
    self = [super initWithFrame:frame];
   
    if( self  )
    {
          [self addAllViews];
 
    }
    return self;

}
//自己写的方法
-(void)addAllViews
{
    _label = [[UILabel alloc] initWithFrame:CGRectMake(50, 50, 60, 30)];
    _label.backgroundColor = [UIColor blueColor];
    [self addSubview:_label];
//    _label.text = @"QQ";
//    _label.textAlignment =NSTextAlignmentCenter;
   
    _textField = [[UITextField alloc] initWithFrame:CGRectMake(CGRectGetMaxX(_label.frame)+20, CGRectGetMinY(_label.frame), CGRectGetWidth(_label.frame)+100, CGRectGetHeight(_label.frame))];
    _textField.backgroundColor = [UIColor greenColor];
    [self addSubview:_textField];

}

@end

 
 
  • 此时的LTView 就变成了一个具有label 和textField 的视图了
//然后再  AppDelegate .m 中  ,利用我们创建的LTView 类创建它的实例对象/
 
 
——————>LTView 控制
  • 把label 和 Textfield 封装到LTView 中 ,在一定程度上简化了我们代码
  • 往往我们需要对LTView 中的label 或者textfield进行一定的控制,比如:设置label的text ,获取Textfield 的 text ,给Textfield 指定delegate ,设置textColor ...
  • 为了方便外界操作label和Textfield ,因此我们要为外界提供一些方法
 
———>小节 :
  • 自定义LTView 使用了一种设计模式:复合设计模式
  • 复合设计模式: A类中,使用B类(或者更多类) 作为自己的成员(实例变量)
  • iOS中复合是特别常见的设计模式,ios新控件往往都是自己已有控件组合而成的
二>视图控制器指定自定义view
  • UIViewController : 视图控制器
  • 控制视图显示,响应事件
  • 分担APPDelegate 的工作
  • 实现模块独立,提高复用性
—————>视图控制器的功能
  • 控制视图大小变换,布局视图,响应事件
  • 检测以及处理内存警告
  • 检测以及处理屏幕旋转
  • 检测视图的切换
——————>MVC 概述:
  • UIViewController : 是MVC 设计模式的核心
  • MVC是一个框架级 的设计模式
  • M 是Model ,主要用于建立数据模型( 即数据的结构 )
  • V 是View ,我们能看到的所有控件都是view ,view主要的功能是展示数据 .
  • C是控制器 ,主要是控制M和V的通信
  • 是用MVC 系统的可维护型 ,可扩展性增强
———————> 使用视图控制器
  • 定以UIViewController 的子类  ———> RCViewController
  • 创建视图控制器对象 ,作为window的根视图控制器
  • 在viewDidload 中 使用默认创建好的视图对象view
//1>
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor whiteColor];
    [_window makeKeyAndVisible];

//2>创建视图控制器
    RCViewController *rcc = [[RCViewController alloc] init];
    //首先我们window自带了一个视图控制器也就是根视图控制器
   
   
    //3>将我们创建的rcc 代替我们的跟视图器 (rootViewController)

    self.window.rootViewController = rcc;
 
—————————>视图控制器指定自定义view
                              为什么使用自定义视图类呢??
  • UIViewController 自带一个空的view,与需求不符合
  • 视图控制器只负责控制视图显示,响应事件
                                如何显示??
  • 自定义视图类继承UIView ,在初始化方法中添加子视图控件
  • 重写controller 的 loadView 方法,创建自定义视图对象,并指定为controller 的view
  • 将子视图控件对象设置为自定义视图类的属性, 在viewDidLoad 方法中进行设置:添加action ,设置delegate...
  • 在controller 中添加按钮点击事件实现和代理方法的实现
三>检测屏幕旋转
视图控制器本身能检测到屏幕的旋转,如果要处理屏幕旋转,需要重写几个方法:
  • 1> supportedInterfaceOrientations  —> 设置设备支持旋转的方向
  • 2>willRotate( 旋转  ) ToInterfanceOrientations : duration(时间 ) :  —> 暂停音乐 ,关闭视图交互....
  • 3> willAnimate( 使…有活气 ) ROtation ToInterfanceOrientation : duration : ——> 添加自定义动画....
  • 4>did RotateFromInterfaceOrientation : ——> 播放音乐,打开视图交互...
——————>视图处理
  • 注意视图控制器会自动调整view 的大小以适应屏幕旋转 ,bounds 被修改,触发view 的layoutSubviews方法
  • view重写layoutSubviews方法 ,根据设备方向,重新布局
  • [UIApplication  share( 分配 )Application ] .status( 状态 )BarOrientation 提供设备当前方向
 
 
四>处理内存警告
控制器能监测内存警告 ,以便我们避免内存不够引起的crash 
在定义的controller子类中重写didReceive(接收) MemoryWarning 方法  
释放暂时不适用的资源( 数据对象,图像 .. ) ,
把不要的视图都放到这里释放 :
//程序内存超过了应用程序规定的法值就会执行 (程序)
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    //可以打印看 ,可以吧不要的视图放在这里面就释放掉了
    NSLog(@"%s,%d",__FUNCTION__,__LINE__);
    // Dispose of any resources that can be recreated.
}
 
五>容器视图控制器
———>常用方法
  • self . view 显示 : viewWillAppear : 和 viewDidAppear :
//视图将要出现
-(void)viewWillAppear:(BOOL)animated
{
    //要用父类的调用
    [super viewWillAppear:animated];
    NSLog(@"%s,%d",__FUNCTION__,__LINE__);
}
//视图已将出现
-(void)viewDidAppear:(BOOL)animated
{

[super viewDidAppear:animated];
    NSLog(@"%s,%d",__FUNCTION__,__LINE__);

}
 
  • self . view 消失 : viewWillDisapper : 和 viewDIdDisapper :
//视图将要消失
-(void)viewWillDisappear:(BOOL)animated
{

[super viewWillDisappear:animated];
    NSLog(@"%s,%d",__FUNCTION__,__LINE__);
}
//视图已经消失
-(void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
    NSLog(@"%s,%d",__FUNCTION__,__LINE__);

}
  • 当self .view 添加到父视图上时, 执行appear 方法 ,当self.view 从父视图上移除是,会执行 disappear 方法
 
————> 演示执行顺序
1>定义FirstViewController ,SecondViewController 类 , first 作为window 的根视图控制器 ,
2>将SecondViewController 的view 添加到FirstViewController 的view 上
3> 将SecondViewController 的view 移除 ———/>SecondViewController :第二个视图控制器
4>查看SecondViewController  中4个方法的执行顺序
 
 
——> 总结 :
iOS 提供了很多标准组件 ,标准组件完成我们的需要,但是适当的封装 ,组合一个新的控件无疑能给我们带来效率上的提高,
视图控制器是MVC 中的C ,用于处理视图触发的事件,
处理旋转和内存呢警告
 

UI 自定义视图 ,视图管理器的更多相关文章

  1. 【详细】Android入门到放弃篇-YES OR NO-》各种UI组件,布局管理器,单元Activity

    问:达叔,你放弃了吗? 答:不,放弃是不可能的,丢了Android,你会心疼吗?如果别人把你丢掉,你是痛苦呢?还是痛苦呢?~ 引导语 有人说,爱上一个人是痛苦的,有人说,喜欢一个人是幸福的. 人与人之 ...

  2. ZendFramework-2.4 源代码 - 关于MVC - View层 - 视图渲染器、视图插件管理器

    <?php // 1. 视图渲染器 class PhpRenderer implements Renderer, TreeRendererInterface { /** * 插件管理器 */ p ...

  3. 第1组UI组件:布局管理器

    1 布局管理的来源 为了让UI在不同的手机屏幕上都能运行良好----不同手机屏幕的分辨率/尺寸并不完全相同,如果让程序手动控制每个组件的大小.位置,会给编程带来巨大的麻烦.为了解决这个问题.andro ...

  4. Android UI组件:布局管理器

    为了更好的管理Android应用的用户界面中的组件,Android提供了布局管理器.通过使用布局管理器,Android应用的图形用户界面具有良好的平台无关性.通常,推荐使用布局管理器来管理组件的分布. ...

  5. 自定义缓存管理器 或者 Spring -- cache

    Spring Cache 缓存是实际工作中非常常用的一种提高性能的方法, 我们会在许多场景下来使用缓存. 本文通过一个简单的例子进行展开,通过对比我们原来的自定义缓存和 spring 的基于注释的 c ...

  6. 游戏开发之UI管理器(跨引擎)

    使用UI管理器的目的 使用单场景与zindex结合的方式管理UI. 能够隐藏底层UI达到优化效果. 很好的组织和管理UI. 跨引擎使用. 管理器分类 根据以往经验我开发了三种类型的管理器,队列管理器, ...

  7. Python深入02 上下文管理器

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 上下文管理器(context manager)是Python2.5开始支持的一种语 ...

  8. python 上下文管理器

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 上下文管理器(context manager)是Python2.5开始支持的一种语 ...

  9. 【Python学习笔记】with语句与上下文管理器

    with语句 上下文管理器 contextlib模块 参考引用 with语句 with语句时在Python2.6中出现的新语句.在Python2.6以前,要正确的处理涉及到异常的资源管理时,需要使用t ...

  10. 流畅python学习笔记:第十五章:上下文管理器

    在开始本章之前,我们首先来谈谈try-excep..final模块.在Python中,进行异常保护的最多就是用try..except..final.首先来看下下面的代码.进行一个简单的除法运算.为了防 ...

随机推荐

  1. aix下java程序运行问题

    CLASSPATH=/track.jar:/standalone.jar export CLASSPATH nohup /usr/java6_64/bin/java com.TrackMain > ...

  2. 关于Visual Studio未能加载各种Package包的解决

    参考微软社区的一个答复解决了VS2013的问题: 进入VS对应的用户缓存文件夹,删掉那个Microsoft.VisualStudio.Default.cache缓存文件,就可以了. 这个错误估计是我们 ...

  3. java7 invokedynamic命令深入研究

    在看java虚拟机字节码执行引擎的时候,里面提到了java虚拟机里调用方法的字节码指令有5种: invokestatic //调用静态方法 invokespecial //调用私有方法.实例构造器方法 ...

  4. Iterator——迭代接口

    迭代对于JAVA的来说绝对不陌生.我们常常使用JDK提供的迭代接口进行Java集合的迭代. Iterator iterator = list.iterator(); while(iterator.ha ...

  5. 怎样在chrome中内置扩展,以及一些简单的定制

    本文中chromium 版本为54 参考资料: chromium如何新增extension API以及添加内部扩展 http://slides.com/luyuan/grit#/ 一.嵌入扩展 1.  ...

  6. 反汇编看c++引用

    继续反汇编系列,本次使用vc2008在x86体系下分析c++中的引用. 定义一个引用类型和将一个变量转换成引用类型一样吗? 引用比指针安全,真的是这样吗,对引用不理解的话比指针还危险. 为什么要用常量 ...

  7. TypeScript-01-变量、基本类型和运算符

    基本类型 基本类型有boolean.number.string.array.void.所有类型在TypeScript中,都是一个唯一的顶层的Any Type 类型的自类型.any关键字代表这种类型. ...

  8. oracle用户创建,连接,删除

    绕过管理员身份进行登录: sqlplus /nolog conn /as sysdba 如何创建一个普通用户: 1.create user jsd1412 identified by jsd1412 ...

  9. 简洁美观的Java博客系统Tale开源了,让每一个有故事的人更好的表达想法

    Tale Tale的英文含义为故事,我相信每个坚持写Blog的人都是有故事的:中文你叫它 塌了 也无所谓 . Tale 使用了轻量级mvc框架 Blade 开发,默认主题使用了漂亮的 pinghsu, ...

  10. IKAnalyzer 分词

    IK Analyzer 3.0特性 采用了特有的"正向迭代最细粒度切分算法",具有80万字/秒的高速处理能力 采用了多子处理器分析模式,支持:英文字母(IP地址.Email.URL ...