UI开发----自定义视图和视图控制器(Controller)

//  Created By 郭仔  2015年04月14日21:34:01

一.自定义视图:

根据需求的不同,?自定义视图继承的类也有所不同。?一般?自定义的

视图会继承于UIView。以下是?自定义视图的要点:

1、创建?一个UIView?子类

2、在类的初始化?方法中添加?子视图

3、类的.h?文件提供?一些接?口(?方法),便于外界操作?子视图

==================

这里以label-textfield自定义视图为例:

把Label和Textfield封装到LTView中,在?一定程度上简化了我们的代 码。

往往我们需要对LTView中的Label或者Textfield进?行?一定的控制,?比 如:设置Label的text,获取Textfield的text,给Textfield指定 delegate,设置textColor等。

为了?方便外界操作Label和Textfield,因此我们要为外界提供?一些方法。

代码实现:

@interface LTView : UIView

@property(nonatomic,retain)UILabel * lable;
@property(nonatomic,retain)UITextField * textField;
- (instancetype) initWithFrame:(CGRect)frame
                  andLabelText:(NSString *)labelText
                andPlaceholder:(NSString *)placeholder;

@end
// 指定义视图,重写init
- (id)init
{
    self = [super init];
    if (self) {
        //
        self = [self initWithFrame:CGRectZero];
    }
    return self;
}

- (id)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
        UILabel * lable = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, frame.size.width/3, frame.size.height)];
        lable.backgroundColor = [UIColor orangeColor];
        [self addSubview:lable];
        // 把创建的lable赋值为_lable
        self.lable = lable;
        [lable release];
        // =========================
        UITextField * textField = [[UITextField alloc]initWithFrame:CGRectMake(frame.size.width/3, 0, frame.size.width*2/3, frame.size.height)];
        textField.backgroundColor = [UIColor yellowColor];
        self.textField = textField;
        [self addSubview:textField];
        [textField release];

    }
    return self;
}

- (void)dealloc
{
    [_lable release];
    [_textField release];
    [super dealloc];
}

- (instancetype)initWithFrame:(CGRect)frame andLabelText:(NSString *)labelText andPlaceholder:(NSString *)placeholder
{
    self = [self initWithFrame:frame];
    if (self) {
        self.lable.text = labelText;
        self.lable.font = [UIFont systemFontOfSize:15];
        self.textField.placeholder = placeholder;
    }
    return self;
}
- (void)setFrame:(CGRect)frame
{
    [super setFrame:frame];
    self.lable.frame = CGRectMake(0, 0, frame.size.width/3, frame.size.height);
    self.textField.frame = CGRectMake(frame.size.width/3, 0, frame.size.width*2/3, frame.size.height);
}

LoginView视图调用该自定义视图:

CGRect newFrame = CGRectMake(0, 0, 320, 480);
    self = [super initWithFrame:newFrame];
    if (self) {
        LTView * ltView = [[LTView alloc]initWithFrame:CGRectMake(50, 50, 200, 50) andLabelText:@"用户名" andPlaceholder:@"请输入用户名"];
        [self addSubview:ltView];
        // delegate
        ltView.textField.delegate = self;
        ltView.tag = 100;
        [ltView release];
        // ============
        LTView * ltView2 = [[LTView alloc]initWithFrame:CGRectMake(50, 140, 200, 50) andLabelText:@"密码" andPlaceholder:@"请输入密码"];
        ltView2.textField.secureTextEntry = YES;
        //
        ltView2.textField.delegate = self;
        [self addSubview:ltView2];
        //
        ltView2.tag = 200;
        [ltView2 release];
        // ============
        UIButton * loginBtn = [UIButton buttonWithType:UIButtonTypeCustom];
        loginBtn.frame = CGRectMake(50, 230, 60, 50);
        loginBtn.backgroundColor = [UIColor redColor];
        [loginBtn setTitle:@"登陆" forState:UIControlStateNormal];
        [loginBtn addTarget:self action:@selector(login:) forControlEvents:UIControlEventTouchUpInside];
        [self addSubview:loginBtn];
        // =====================
        UIButton * loginBtn2 = [UIButton buttonWithType:UIButtonTypeCustom];
        loginBtn2.frame = CGRectMake(130, 230, 60, 50);
        loginBtn2.backgroundColor = [UIColor redColor];
        [loginBtn2 setTitle:@"注册" forState:UIControlStateNormal];
        [self addSubview:loginBtn2];
        // ============210 230 100 50
        UIButton * loginBtn3 = [UIButton buttonWithType:UIButtonTypeCustom];
        loginBtn3.frame = CGRectMake(210, 230, 100, 50);
        loginBtn3.backgroundColor = [UIColor redColor];
        [loginBtn3 setTitle:@"找回密码" forState:UIControlStateNormal];
       // [loginBtn3 addTarget:self action:@selector(searchPsw:) forControlEvents:UIControlEventTouchUpInside];
        [self addSubview:loginBtn3];

二。视图控制器:

?自定义视图类继承UIView。在初始化?方法中添加?子视图控件。

重写controller的loadView?方法。创建?自定义视图对象,并指定为controller 的view。

将?子视图控件对象设置为?自定义视图类的属性,在viewDidLoad?方法中进 ?行设置:添加action、设置delegate等等。

在controller中添加按钮点击事件实现和代理?方法的实现

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
//    self.view.backgroundColor = [UIColor greenColor];
//    UISwitch *aSwitch = [[UISwitch alloc]initWithFrame:CGRectMake(200, 300, 50, 50)];
//    [self.view addSubview:aSwitch];
//    [aSwitch release];
    // ===============================
    // 把LoginView给覆盖了
    thirdViewController * thirdVC = [[thirdViewController alloc]init];
    [self.view addSubview:thirdVC.view];
    // retain
    [self addChildViewController:thirdVC];
    [thirdVC release];

}
// ========
- (void)loadView
{
    LoginView * logV = [[LoginView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];
    self.view = logV;
    [logV release];

}

三,检测屏幕旋转:

注意视图控制器会?自动调整view的?大?小以适应屏幕旋转,bounds

被修改,触发view的layoutSubviews?方法。

view重写layoutSubviews?方法,根据设备?方向,重新布局。

[UIApplication shareApplication].statusBarOrientation提供设备 当前?方向。

controller中:

-(NSUInteger)supportedInterfaceOrientations
{
    // 设置当屏幕旋转时,字体是否跟着旋转,根据按位或运算
    // 里面的方向数值为1,2,4,8....
    // 比如3 = 1 + 2 表示两个方向
    return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskPortrait;
}

view中:

// 重写
// 当视图需要重绘时,会执行该视图的layoutSubviews方法
- (void)layoutSubviews
{
    // 获取设备的方向
    if([UIApplication sharedApplication].statusBarOrientation ==
       UIInterfaceOrientationLandscapeLeft || [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeRight)
    {
        UIView * v1 = [self viewWithTag:100];
        // 这里需要重写setFrame方法
        v1.frame = CGRectMake(50, 50, 400, 50);
        v1.backgroundColor = [UIColor redColor];
    }
    else
    {
        UIView * v1 = [self viewWithTag:100];
        v1.frame = CGRectMake(50, 50, 200, 50);
        v1.backgroundColor = [UIColor redColor];
    }
}

四,处理内存警告:

控制器能监测内存警告,以便我们避免内存不够引起的crash。 在定义的controller?子类中重写didReceiveMemoryWarning?方法。 释放暂时不使?用的资源。(数据对象、图像)

controller的方法:

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
    // 当视图已经加载到内存,并没有显示在window上时,将视图置空
    if ([self isViewLoaded] && self.view.window == nil) {
        self.view = nil;
    }
}

时间: 2024-10-25 15:04:03

UI开发----自定义视图和视图控制器(Controller)的相关文章

ASP.Net MVC开发基础学习笔记(3):Razor视图引擎、控制器与路由机制学习

首页 头条 文章 频道                         设计频道 Web前端 Python开发 Java技术 Android应用 iOS应用 资源 小组 相亲 频道 首页 头条 文章 小组 相亲 资源 设计 前端 Python Java 安卓 iOS 登录 注册 首页 最新文章 经典回顾 开发 Web前端 Python Android iOS Java C/C++ PHP .NET Ruby Go 设计 UI设计 网页设计 交互设计 用户体验 设计教程 设计职场 极客 IT技术

ASP.Net MVC开发基础学习笔记:三、Razor视图引擎、控制器与路由机制学习

一.天降神器“剃须刀” — Razor视图引擎 1.1 千呼万唤始出来的MVC3.0 在MVC3.0版本的时候,微软终于引入了第二种模板引擎:Razor.在这之前,我们一直在使用WebForm时代沿留下来的ASPX引擎或者第三方的NVelocity模板引擎. Razor在减少代码冗余.增强代码可读性和Visual Studio智能感知方面,都有着突出的优势.Razor一经推出就深受广大ASP.Net开发者的喜爱. 1.2 Razor的语法 (1)Razor文件类型:Razor支持两种文件类型,分

[转载]开发 Spring 自定义视图和视图解析器

原文出处 http://www.ibm.com/developerworks/cn/java/j-lo-springview/ 概述 Spring 3.0 默认包含了多种视图和视图解析器,比如 JSP.Velocity 视图等,但在某些情况下,我们需要开发自定义的视图及其解析器,以便显示特殊文件格式的视图,我们也可以使用自定义视图及解析器,针对特定的视图做相应的处理.本文将通过一个示例来介绍如何开发 Spring 自定义视图和视图解析器,来显示后缀名为 SWF 的视图,并提供一个简单的注册机制,

IOS开发之视图和视图控制器

视图(View), 视图控制器(ViewController)是IOS开发UI部分比较重要的东西.在学习视图这一块的东西的时候,感觉和Java Swing中的Panel差不多.在UIKit框架中都有一个UIWindow来容纳我们的View.应用程序中几乎全部的可视控件都是UIView以及UIView的子类的实例,并且UIWindow也是UIView的子类.UIWindow可以不借助于父类视图显示在屏幕上,其余的视图都需要添加到父视图中才能显示.窗口是用来显示视图的,下面我们将会结合着实例来具体的

iOS开发- 自定义遮罩视图(引导, 功能说明)源码+解析

iOS开发- 自定义遮罩视图(引导, 功能说明)源码+解析 我们平时使用App的时候, 经常在第一次使用的时候, 会有类似"新手教程"之类的东西, 来引导我们应该如何使用这个App. 但是这个"新手教程"不同于常规的引导页(引导页指第一次打开App时候, 弹出的那种介绍视图. 他是静态的, 不需要与用户交互, 可以直接一页页翻, 或者直接跳过.)所谓的"新手教程", 就是按照App的提示, 一步步跟着完成. 那这个"新手教程"

iOS开发 MMDrawerController左右抽屉打开手势与中心视图子视图控制器手势冲突问题的解决方案

MMDrawerController是一个很好用的解决抽屉效果的第三方类,但有时候当我们在中心视图控制器中需要使用手势进行其他操作的时候会产生手势冲突,导致运行效果不符合我们的想象.那么问题来了,该怎么解决冲突问题呢? 下面是我在使用过程中的个人总结: 我的需求: 1.有一个左抽屉和中心视图控制器,从中心视图控制器右滑可以打开左抽屉. 2.中心视图控制器中的TableViewCell可通过滑动手势删除 问题所在: 1.由于删除cell的左滑手势和MMDrawerController的打开右抽屉的

UI: 使用 UITabBarController 显示多视图控制器

假设有两个视图控制器,它们的分别为 FirstViewController 和 SecondViewControlller. 现在到 app delegate 中定义视图控制器和标签栏.代码如下: .h: #import <UIKit/UIKit.h> #import "FirstViewController.h" #import "SecondViewController.h" @interface AppDelegate : UIResponder

Asp.Net MVC4.0 从入门到精通与项目实战 (Petapoco框架、二维码自定义、Bootstrap视图)视频教程

Asp.Net MVC4.0 从入门到精通与项目实战 (Petapoco框架.二维码自定义.Bootstrap视图)视频教程下载    联系QQ:1026270010 Asp.Net MVC 简介      MVC模式是“Model-View-Controller”的缩写,中文翻译为“模式-视图-控制器”.MVC模式是于20世纪70年代在smaltalk80的GUI设计中被提出的.它包括3个部分:模型(Model).视图(View)和控制器(Controller).MVC模式至今已被广泛使用,A

MapKit之大头针全面解析(使用系统大头针、自定义大头针callout视图、使用图片显示大头针)

首先了解一些相关知识点: 添加大头针到地图 在iOS开发中经常会标记某个位置,需要使用地图标注,也就是大家俗称的"大头针".大头针(Annotations)提供了一种方式来突出地图中具体的位置并可以提供相关的信息.我们能够使用大头针标记具体的地址,兴趣点和其他类型的目的地.当显示在地图上的时候,大头针可以使用图片作为标识,也能够点击大头针弹出小弹框提供相应的链接和具体内容.Figure6-1显示了系统标准的大头针样式标记具体的位置,并提供了小弹框显示额外的信息,使用箭头提示用户点击获取