iOS --- UI 简单总结




代码创建UIWindow对象

Xcode7之后使用代码创建UIWindow对象:

//创建UIWindow对象

self.window =[[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];

//给window设置背景颜色(白色)

self.window.backgroundColor = [UIColorwhiteColor];

//使window显示

[self.window makeKeyAndVisible];

//创建一个视图控制器

UIViewController *VC = [[UIViewController alloc] init];

//给window指定根视图控制器

self.window.rootViewController = VC;

自动创建UIWindow对象

l1)先执行Main函数,执行UIApplicationMain()创建代理

l2)看项目配置文件info.plist里面的StoryBoard的name

l3)根据这个name找到对应的StoryBoard,加载StoryBoard

l4)在加载的时候创建一个window。

UIView功能

•1)管理矩形区域里的内容

•2)处理矩形区域中的事件

•3)子视图的管理

•4)实现UIView动画

•5)UIView作为父类,子类也具有这些功能

如何确定一个矩形

1.首先确定这个矩形的位置。(iOS中以左上角为坐标原点)

2.其次确定这个矩形的大小。

iOS中通过确定一个矩形的左上角的点(x,y)以及矩形的 宽(width)和高(height)来确定一个矩形。

坐标系相关数据类型

坐标:

struct CGPoint {CGFloat x;

CGFloat y;

};

typedef struct CGPoint CGPoint;

大小:

struct CGSize {CGFloat width;

CGFloat height;

};

typedef struct CGSize CGSize;

矩形:

struct CGRect {CGPoint origin;

CGSize size;

};

typedef structCGRect CGRect;

iOS中使用CGRect类型确定矩形位置以及大小

创建UIView

代码:

//开辟空间创建UIView对象

//设置frame确定UIView对象的位置及大小

UIView *view =[[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];

//设置UIView对象的属性:设置背景颜色

view.backgroundColor = [UIColor redColor];

//将创建好的UIView对象添加到window上显示

[self.windowaddSubview:view];

第二节:

UILabel:

•UILabel(标签):是显⽰示⽂文本的控件。在App中UILabel是出现频率最⾼高的控件

•UILabel是UIView⼦子类,作为⼦子类⼀一般是为了扩充⽗父类的 功能UILabel扩展了⽂文字显⽰示的功能,UILabel是能显⽰示⽂文 字的视图。

创建UILabel与创建UIView的步骤很相似。

1、开辟空间并初始化(如果本类有初始化⽅方法,则使⽤用⾃自⼰己的初 始化⽅方法;否则使⽤用⽗父类的)。

2、设置⽂文本控制相关的属性

3、添加到⽗父视图上,⽤用以显⽰示

4、 释放所有权(只是做了引⽤用计数-1)

UILabel *userNameLabel = [[UILabel alloc]

initWithFrame:CGRectMake(30, 100, 100, 30)]; userNameLabel.text = @“⽤用户名”;

[containerView addSubview:userNameLabel];

[userNameLabel release];

注:containerView已经添加到根视图上

•UITextField(输入框):是控制⽂本输入和显示的控件。在App中UITextField出现频率也比较高。

•iOS系统借助虚拟键盘实现输入,当点击输入框,系统会自动调出键盘, ⽅便你进一步操作。在你不需要输入的时候,可以使用收回键盘的⽅法,收回弹出的键盘。

•UITextField和UILabel相比,UILabel主要用于文字显示,不能编辑,UITextField允许用户编辑文字(输⼊)

创建UITextField与创建UILabel的步骤很相似。

1、开辟空间并初始化(如果本类有初始化⽅方法,则使⽤用⾃自⼰己的初始化⽅方法;否则使⽤用⽗父类的)。

2、设置⽂文本显⽰示、输⼊入等相关的属性

3、添加到⽗父视图上,⽤用以显⽰示

4、释放对象所有权

//使用初始化方法创建对象

UITextField *userNameTextField = [[UITextFieldalloc] initWithFrame:CGRectMake(100, 100, 190, 30)];

//设置边框⻛风格

userNameTextField.borderStyle= UITextBorderStyleRoundedRect;

//设置占位符

userNameTextField.placeholder

= @“手机号/邮箱";[containerViewaddSubview:userNameTextField];[userNameTextField release];

•UIButton(按钮):是响应用户点击的控件。在App中UIButton是 出现频率很高的控件。

•UIButton与UILabel、UITextField侧重点不同,侧重于处理用户交互 事件。当然UIButton类也提供了一些方法控制按钮外观。

创建UIButton与创建UILabel、UITextField、UIView的步骤很相似。

1、创建button对象(如果本类有初始化方法,则使用自己的初始化方法;否则使用父类的)。

2、设置按钮相关的属性

3、为按钮添加点击事件

4、添加按钮到父视图上,用以显示

5、按钮无需释放(一般情况创建UIButton都使用自己的便利构造器方法,无需释放对象的所有权)

//便利构造器⽅方法创建对象

UIButton*loginButton = [UIButton buttonWithType:UIButtonTypeSystem];loginButton.frame = CGRectMake(30, 200, 60,30);

//设置button的标题

[loginButton setTitle:@"登录" forState:UIControlStateNormal];

//添加点击事件

[loginButtonaddTarget:self action:@selector(login:)forControlEvents:UIControlEventTouchUpInside];[containerView addSubview:loginButton];

UIImageView是iOS中用于显示图片的类,iOS中几乎所有看到的 图片,都是由这个类来显示的。

//图⽚片⽂文件路径

NSString *path= [[NSBundle mainBundle] pathForResource:@"1"ofType:@"jpg"];

//创建⼀一个UIImage对象,使用initWithContentOfFile:方法

UIImage *image= [UIImage imageWithContentsOfFile:path];//创建一个UIImageView对象,使用initWithImage:方法

UIImageView*imageView = [[UIImageView alloc] initWithImage:image];

imageView.frame= CGRectMake(100, 100, 100, 100);[self.view addSubview:imageView];

•animationImages//设置⼀一组动态图⽚片

•animationDuration//设置播放⼀一组动态图⽚片的时间

•animationRepeatCount//设置重复次数

•startAnimating//开始动画

•stopAnimating//结束动画

第三节:

LTView的具体使用

//创建LTView对象

LTView*usernameView = [[LTView alloc] initWithFrame:CGRectMake(40,100, 300,50)];usernameView.leftLabel.text =@"⽤用户名:";usernameView.rightField.placeholder = @"请输入用户名";[usernameView.rightField becomeFirstResponder];[backViewaddSubview:usernameView];//backView是LTView添加到的父视图

[usernameViewrelease];

视图控制器指定自定义View

如何设置

-(void)loadView{

[superloadView];

self.myView =[[MyView alloc] initWithFrame:self.view.frame];

self.view =self.myView;

[self.myViewrelease];

}

#pragma mark视图加载完毕

- (void)viewDidLoad {

[superviewDidLoad];

self.view.backgroundColor= [UIColor grayColor];NSLog(@"%s%d",__FUNCTION__, __LINE__);

//为自定义视图里面的按钮添加点击事件[self.myView.buttonaddTarget:self action:@selector(buttonAction)forControlEvents:UIControlEventTouchUpInside];

}

#pragma mark点击⽅方法

-(void)buttonAction{

NSLog(@"点击了⾃自定义视图⾥里⾯面的按钮");

}

#pragma mark内存警告⽅方法

-(void)didReceiveMemoryWarning {

//即使没有显⽰示在window上,也不会⾃自动的将self.view释放。

[super didReceiveMemoryWarning];

NSLog(@"%s%d", __FUNCTION__, __LINE__);

// Dispose ofany resources that can be recreated.

}

第四节:

触摸事件的处理方法:

在给定的触摸阶段中,如果发生新的触摸动作或已有的触摸动作发生变化,应用程序就会发送这些消息;

当一个手指或多个手指触碰屏幕时,发送touchesBegan:withEvent:消息。

当一个手指或多个手指在屏幕上移动时,发送touchesMoved:withEvent:消息。

当一个手指或多个手指离开屏幕时,发送touchesBegan:withEvent:消息。

手势识别器

1 . UIapGestureRecognizer是轻拍⼿势识别器,能识别轻拍操作

2.U I L o n g P r e s s G e s t u r e R e c o

g n i z e r是长按⼿势识别器,能识别长按操作

3 . U I R o t a t i o n G e s t u r e R e c o g n i z

e r是旋转⼿势识别器,能识别旋转操作

4 .U I P i n c h G e s t u r e R e c o g n i z e r是捏合⼿势识别器,能识别捏合操作

5 .U I P a n G e s t u r e R e c o g n i z e r是平移⼿势识别器,能识别拖拽操作

6 . U I S w i p e G e s t u r e R e c o g n i z e r是轻扫⼿势识别器,能识别拖拽操作

7 . U I S c r e e n E d g e P a n G e s t u r e R e c

o g n i z e r是屏幕边缘轻扫识别器

View的transform属性:

transform是view的一个重要属性,他在矩阵层面上改变view的显示状态,能实现view的缩放、旋转、平移、等功能。

平移:CGAffineTransformMakeTranslation;

缩放:CGAffineTransformMakeScale;

旋转:CGAffineTransformMakeRottion;

第五节

UIControl常用方法:

1.添加一个事件:

参数说明:target为目标对象;action为方法选择器;controlEvents为触发事件。

(void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;

2.移除一个事件:

参数说明:target为目标对象;action为方法选择器;

controlEvents为触发事件。

- (void)removeTarget:(id)target action: (SEL)action

forControlEvents: (UIControlEvents)controlEvents;

UISlider⽰示例代码:

创建一个UISlider对象,并且添加到self.view上

UISlider *slider = [[UISlider alloc] initWithFrame:CGRectMake(self.view.center.x- 100, imageView.frame.origin.y + imageView.frame.size.height + 50, 200,50)];

[self.view addSubview:slider];

[sliderrelease];

2.UISlider相关属性设置

//设置slider的最⼩小值

slider.minimumValue = 0.0;

//设置slider的最⼤大值

slider.maximumValue = 2;

//设置划过区域的颜⾊色

slider.minimumTrackTintColor = [UIColor redColor];

3.为UISlider添加事件:

//添加slider的事件

[slider addTarget:self action:@selector(sliderAction:)forControlEvents:UIControlEventValueChanged];

UISegmentedControl添加事件

1.为UISegmentedControl添加事件

[segmented addTarget:self action:@selector(segmentedAction:) forControlEvents:UIControlEventValueChanged];

2.UISegmentedControl事件的响应(通常我们和swich...case分⽀支语

句组合使用)

#pragma mark segmentedControl点击事件

-(void)segmentedAction:(UISegmentedControl *)segmented

{

switch (segmented.selectedSegmentIndex) {

case 0:

[self.view insertSubview:self.redbelowSubview:segmented];

break;

case 1:

[self.view insertSubview:self.bluebelowSubview:segmented];

break;

case 2:

[self.view insertSubview:self.yellowbelowSubview:segmented];

break;

default:

break;

}

}

UIPageControl常用属性和方法

•numberOfPages //指定页面个数(即点的个数)

•currentPage //指定pageControl的值(即选中的点)

•addTarget:action:forControlEvents: //给slider添加

事件

注意:controlEvent为UIControlEventValueChanged

原因:分页本质是通过数据管理分页,所以使⽤用valueChanged

属性来触发事件,即数组下标变化

总结

1.UIControl是所有控制视图的⽗父类。

2.UISwitch的状态监测。

3.UISlider为滑块控件,通过控制value来设置当前的值,通过⽤用来控制视

频、⾳音频等播放进度。

4.UISegmentedControl为分段控件,相当于⼀一组按钮,不同的Item可以

设置不同的点击事件。

5.UIPageControl的currentPage属性的使用。

需要注意:添加的点击事件通过UIControlEventValueChanged来触发事件

第六节

UIScrollView的创建

#define WIDTH self.view.frame.size.width

#define HEIGHTself.view.frame.size.height

// 1.创建⼀一个和屏幕等尺⼨寸的UIScrollView

UIScrollView*scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0,WIDTH,HEIGHT)];

// 2.设置背景颜⾊色

scrollView.backgroundColor= [UIColoryellowColor];

// 3.把scrollView放到self.view上显示

[self.viewaddSubview:scrollView];

// 4.内存管理

[scrollViewrelease];

UIScrollView协议方法

•当我们签好协议,设置好代理人之后,我们就可以使用

UIScrollView的协议方法了,它的协议方法分为两部分:

•一是监控滚动时候的状态。

•二是控制视图的缩放。

总结

•本节主要是为了让大家了解滚动视图的创建和基本的使用

方法,并且配合UIPageControl实现关联使用。

•UIScrollView主要的属性contentSize用来控制视图的滚动

范围,视图的变化显示主要由contentOffset偏移量来控

制。

•UIPageControl一般会和UIScrollView一同使用。

第七节

UINavigationController

UINavigationController:导航控制器,,是iOS中最常⽤用的多视图控制器之一,用它来管理多个视图控制器。

导航控制器可以称为是,管理控制器的控制器,主要管理有层

次递进关系的控制器。

创建

//创建根视图

RootViewController *rootVC =

[[RootViewController alloc] init];

//创建导航控制器 把rootVC作为导航控制器的根视图控制器

UINavigationController *navi =

[[UINavigationController alloc]

initWithRootViewController:rootVC];

//设置导航为window的根视图

self.window.rootViewController = navi;

//内存管理

[rootVC release];

[navi release];

导航栏半透明效果

//导航栏半透明效果(iOS7以后 默认为YES)

//当半透明效果开启时 屏幕左上⾓角为坐标原点

//关闭时 导航栏左下⾓角为坐标原点

self.navigationController.navigation

Bar.translucent = YES;

//创建⼀一个View

UIView *view = [[UIView alloc]

initWithFrame:CGRectMake(0, 0, 100,100)];

view.backgroundColor = [UIColor blueColor];

[self.view addSubview:view];

[view release];

页面跳转工作原理:

UINavigationController通过栈的方式管理控制器的切换,控制入栈和出栈来展示各个视图控制器。

•UINavigationController的ContentView里始终显示栈顶控制器的view。

•viewControllers属性是一个可变数组(NSMutableArray)存储了栈中的所有被管理的控制器,入栈的时候,使用addObject把新的视图控制器对象添加到数组末尾,出栈时removeLastObject移除数组末尾的试图控制器对象。

•navigationController属性,父类中的属性,每个在栈中的控制器,都能通过此属性,获取自己所在UINavigationController对象。

工作原理

• 栈的特点:先进后出,后进先出。

• 栈顶为当前显⽰示的视图控制器。

模态进入下一页

- (void)next

{

//⻚页⾯面跳转

//模态(modal)

// 1.创建第二页对象

SecondViewController *secVC = [[SecondViewControlleralloc]init];

// 2.设置过渡动画(有默认值,可以不设置)

secVC.modalTransitionStyle =UIModalTransitionStyleCoverVertical;

// 3.模态控制器

//参数1:第二页对象

//参数2:是否使用动画

//参数3:模态完成后执行的block

[self presentViewController:secVC animated:YEScompletion:^{

}];

// 4.内存管理

[secVC release];

}

总结

1.UINavigationController的创建

2.通过导航跳转页⾯面

3.自定义NavigationBar

4.模态

第八节:

回顾协议六步

第一步:声明协议

第二步:声明代理人

第三步:执行协议方法

第四步:签订协议

第五步:指定代理人

第六步:实现协议方法

代码演示

#warning第1步

//在SecondViewController.h⾥里声明协议

@protocol SecondViewControllerDelegate

-(void)changeValue:(NSString *)name;

@end

@interface SecondViewController : UIViewController

#warning第2步

//声明代理人

@property(nonatomic,assign)id

elegate>secondDelegate;

@end

#warning第3步

-(void)buttonAction:(UIButton *)button

{

//执⾏行协议方法

[self.secondDelegate

changeValue:self.textField.text];

[self.navigationController

popViewControllerAnimated:YES];

}

#warning第4步

//FirstViewController签订协议

@interface FirstViewController :

UIViewController

#warning第5步

-(void)buttonAction:(UIButton *)button

{

SecondViewController *secondVC =

[[SecondViewController alloc] init];

//指定当前对象为代理⼈人

secondVC.secondDelegate = self;

secondVC.contents = self.label.text;

[self.navigationController

pushViewController:secondVC animated:YES];

[secondVC release];

}

#warning第6步

//实现协议方法,并接收传过来的值

-(void)changeValue:(NSString *)name

{

self.label.text = name;

}

注意

@protocol SecondViewControllerDelegate

@required //必须要实现的⽅方法,默认是必须实现

-(void)changeValue:(NSString *)name;

@optional //可选实现的协议方法

-(void)changeColor:(UIColor *)color;

@end

block传值两种方式

• 方式一:使用block属性实现回调传值

• 方式二:在方法中定义block实现回调传值

方法中定义block

• 创建一个RootViewController并添加一个button和一个label

• 封装一个NSObject类

• 实现点击button将一个NSInteger类型的10086数字传入NSObject中,

• 将其转换为NSString类型

• 用block将转换完的字符串回传给RootViewController并显示在label上

提示:使用在方法中封装一个block来回调传值更方便

#warning第一步

//在AppTool.h中重定义void(^)(NSString *string)类型

的别名为AppToolBlock

typedef void(^AppToolBlock)(NSString *string);

#warning第二步

//声明方法,在方法中封装block

-(void)sendNumber:(NSInteger )number andBlock:

(AppToolBlock)block;

#warning第三步

//在AppTool.m实现方法,并执行block

-(void)sendNumber:(NSInteger )number andBlock:

(AppToolBlock)block;

{

NSString *string = [NSString

stringWithFormat:@"%ld",number];

block(string);

}

-(void)buttonAction:(UIButton *)button

{

#warning第四步

AppTool *appTool = [[AppTool alloc] init];

//执行方法,实现block并接收回传过来的string值

[appTool sendNumber:10086 andBlock:^(NSString

*string) {

self.label.text = string;

}];

}

总结

使用属性传值解决从前往后传值的问题

使用协议/代理解决从后往前传值的问题

使用__block修饰变量来解决block循环引用问题

注意:关于block内存管理上的三个区域,在arc和⾮非arc下还是有区别的,请学员自行打印验证结果

第九节

代码创建UITabBarController

代码:

// 1.创建UITabBarController对象

UITabBarController *tabBarController =

[[UITabBarController alloc] init];

// 2.将TabBarController管理的视图控制器放到⼀一个数组中

NSArray *viewControllers = [NSArray

arrayWithObjects:firstNav, secondNav,thirdNav,fourthNav, nil];

// 3.设置TabBarController的⼦子视图控制器数组

mainTabBarVC.viewControllers = viewControllers;

// 4.将根视图控制器设置成TabBarController

[self.window setRootViewController:mainTabBarVC]

程序的添加过程

UITabBarController创建完成后有一句关键代码

//将根视图控制器设置成TabBarController

[self.window setRootViewController:mainTabBarVC];

程序的添加过程:

UIWindow—>UITabBarcontroller—>UINavigationController—>UIViewController

UITabBar

•UITabBar包含多个UITabBarItem,每一个UITabBarItem对

应一个UIViewController。UITabBar的高度是49。

• 系统最多只显示5个UITabBarItem,当UITabBarItem超过5个时系统会自动增加一个更多按钮,点击更多按钮没有在

底部出现的按钮会以列表的形式显示出来

•UITabBar的属性:tintColor、barTintColor、图像设置

等。

UITabBarItem的图⽚片处理

代码:

//未选中的图片

UIImage *secondNormalImage = [UIImage

imageNamed:@“carGary”];

//图片不被渲染,保持图片本⾝身的样子

secondNormalImage = [secondNormalImage

imageWithRenderingMode:UIImageRenderingModeAlwaysO

riginal];

//选中时的图片

UIImage *secondSelectedImage = [UIImage

imageNamed:@"carRed"];

secondSelectedImage = [secondSelectedImage

imageWithRenderingMode:UIImageRenderingModeAlways

Original];

UIAppearance

代码:

//设置全局外观

//通过[UITabBar appearance]得到当前应用的UITabBar对象来设置tabBar的外观

//注意:设置全局外观最好在appDelegate里,否则会无效

[[UITabBar appearance] setBarTintColor:[UIColorcyanColor]];

[[UITabBar appearance] setTintColor:[UIColorbrownColor]];

//改变导航栏外观颜色

[[UINavigationBar appearance] setBarTintColor:[UIColor

lightGrayColor]];

//改变导航栏字体颜色

[[UINavigationBar appearance] setTitleTextAttributes:

[NSDictionary dictionaryWithObjectsAndKeys:[UIColor

redColor],NSForegroundColorAttributeName,[UIFontsystemFontOfSize:17],NSFontAttributeName, nil]];

总结

•UITabBarController是项目开发中常见的布局样式,与

UINavigationController不同,它的viewControllers都是并列

的;⽽而UINavigationController的则是层次性的。

•UITabBar通常都会定义外观以适应程序风格,必要时会完全自定义

第十节

UITableView

•UITableView继承于UIScrollView,可以滚动。

•UITableView的每一条数据对应的单元格叫做Cell,是UITableViewCell的一个对象,继承于UIView。

•UITableView可以分区显示, 每一个分区称为section,每一行称为row, 编号都从0开始。

• 系统提供了一个专门的类来整合section和row,叫做NSIndexPath。

UITableViewDataSource协议方法的实现代码

// tableView每个分区要显示的行数

- (NSInteger)tableView:(UITableView *)tableView

numberOfRowsInSection:(NSInteger)section{

return 100;

}

// tableView每次要显示一个cell都会调用这个方法获取

- (UITableViewCell *)tableView:(UITableView*)tableView

cellForRowAtIndexPath:(NSIndexPath *)indexPath{

UITableViewCell *cell = [[[UITableViewCell alloc]

initWithStyle:UITableViewCellStyleDefault

reuseIdentifier:@"reuse"] autorelease];

cell.textLabel.text = @"标题";

return cell;

}

UITableView重用cell的流程

•1.当一个cell被滑出屏幕,这个cell会被系统放到相应的重⽤用池中。

•2.当tableView需要显⽰示一个cell,会先去重⽤用池中尝试获取一个

cell(红色的cell)。

•3.如果重用池没有cell,就会创建一个cell(黄色的cell)。

•4.取得cell之后会重新赋值进行使用。

UITableView和数组

@interface ViewController ()

UITableViewDelegate>

//数组属性,用来和tableView结合使用

@property (nonatomic, retain) NSMutableArray*sourceArr;

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

//初始化数组

self.sourceArr = [NSMutableArray arrayWithObjects:

@"张三", @"李四", @"王五", @"赵六", nil];

}

总结

1. UITableView的基本概念和创建方法

2. UITableView的重用机制

3.常用的UITableView的协议方法的使用

第十一节

UITableView编辑步骤

UITableView编辑步骤如下:

一.让TableView处于编辑状态

二.协议设定

1.确定Cell是否处于编辑状态

2.设定Cell的编辑样式(删除、添加)

3.编辑状态进行提交

UITableView编辑步骤如下:

一.让TableView处于编辑状态

- (void)setEditing:(BOOL)editinganimated:(BOOL)animated

二.协议设定

1.确定Cell是否处于编辑状态

- (BOOL)tableView:(UITableView *)tableViewcanEditRowAtIndexPath:

(NSIndexPath *)indexPath

2.设定Cell的编辑样式(删除、添加)

- (UITableViewCellEditingStyle)tableView:(UITableView*)tableView

editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath

3.编辑状态进行提交

-(void) tableView:(UITableView *) tableViewcommitEditingStyle:

(UITableViewCellEditingStyle)editingStyleforRowAtIndexPath:

(NSIndexPath *)indexPath

UITableViewController

一:UITableViewController继承自UIViewController,自带

一个tableView

二:self.view不是UIView而是UITableView

三:datasource和delegate默认都是

self(UITableViewController)

四:开发中只需要建立UITableViewController子类

总结

1.UITableView编辑的写法

2.UITableViewController

第十二节

自定义Cell

为什么需要自定义Cell?

• 在前期我们学过自定义视图,即创建一个类继承于UIView

或者其他的视图,在自定义类中创建其子视图,这样就会

形成一个新的自定义视图。

• 系统提供的cell满足不了复杂的样式,因此:自定义Cell

和自定义视图⼀一样,自己创建一种符合我们需求的Cell并

使用这个Cell

⾃自定义Cell步骤:

• 创建⼀一个类继承于UITableViewCell。

• 实现UITableViewCell的初始化⽅方法:

-(instancetype)initWithStyle:(UITableViewCellStyle)style

reuseIdentifier:(NSString *)reuseIdentifier。

• 确保所有的你想添加的子视图都在自定义Cell的初始化方法中创建,由于UITableView的重用机制,一个Cell在第一次创建成功并用于下一次显示的时候,不会再走初始化方法,这样

可以避免子视图的重复创建。

• 在Cell的子视图创建成功后,将子视图设置为属性,类似于

UITableViewCell所自带的textLabel和detailTextLabel属性。便于在UITableView的协议中给自定义视图赋值。

Model的使用

创建步骤:

• 创建一个类并继承于NSObject

• 添加和字典中对应的属性

• 在视图控制器中将字典通过KVC为Model赋值

• 将Model对象添加到数组中并刷新TableView

判断多种Cell一

Model *model = [self.tableArray

objectAtIndex:indexPath.row];

//根据model属性划分

if (model.type == 0) {

FirstTableViewCell *cell = [tableView

dequeueReusableCellWithIdentifier:firstIdentify];

return cell;

}

if (model.type == 1) {

SecondTableViewCell *cell = [tableView

dequeueReusableCellWithIdentifier:secondIdentify];

return cell;

}

判断多种Cell二

//第一行显示第一种Cell

if (indexPath.row == 0) {

FirstTableViewCell *cell = [tableView

dequeueReusableCellWithIdentifier:firstIdentify];

return cell;

}

//第二行显示第二种Cell

if (indexPath.row == 1) {

SecondTableViewCell *cell = [tableView

dequeueReusableCellWithIdentifier:secondIdentify];

return cell;

}

图片自适应高度

UIImage *aImage = [UIImageimageNamed:@"1.png"];

//获得图片真实高度和宽度

CGFloat height = aImage.size.height;

CGFloat width = aImage.size.width;

//缩放后宽度固定为200

CGFloat scale = width / 200;

CGFloat realHeight = height / scale;

[self.myImageView setFrame:CGRectMake(0, 0,

200,realHeight)];

总结

• 自定义Cell

•Model类的创建和使用

• 多种Cell混合使用

•Cell的自适应高度

第十三节

视图控制器独有初始化方法:

- (instancetype)initWithNibName:(NSString*)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

•nibNameOrNil:当前控制器相关联的nib文件,如果写nil默认为同名文件

•nibBundleOrNil:当前应用程序包所在文件,如果写nil默认为mainBundle

•在我们使⽤用init初始化(或者new直接创建)控制器的时候,会自动执行

控制器的此方法,参数均以默认值执行,所以可不写。

自动布局

自动布局:autoLayout,不给View固定的位置,通过某些规则让View自己适应自己的位置。

iOS6.0之后推出,在iOS8.0自动布局被大幅度优化,iOS9中新增了许多功能。

总结

1.xib可视化编程方式。

2.基础控件的属性操作以及与代码的关联方式。

3.自定义单元格的创建和使用。

4.自动布局的使用。

第十四节

StoryBoard注意事项

• 在AppDelegate的

-application: didFinishLaunchingWithOptions:

方法中不要再用代码初始化一个window。

• 将创建好的Storyboard在应⽤用程序配置General中设置为MainInterface。

• 视图添加与控制和IB开发一样。

利用StoryBoard绘制⾃自定义单元格

StoryBoard绘制单元格的时候要注意以下几点:

1.创建⾃自定义cell时选中左侧TableViewCell。

2.绘制自定义UI界⾯面。

3.设置重用标识符。

4.将StoryBoard文件关联至对应的UITableViewController和

UITableViewCell子类(自己创建的类)。

5.在UITableViewController中完成代码书写:设置section和row数量,

设置cell,根据实际情况调整cell的高度。

注意:cell不再需要注册。

StoryBoard进行页面跳转

StoryBoard页面跳转分为两种。

•1、代码方式:使用代码通过控制器标识来跳转。比如在当前页

面的某一个事件中跳转到一个标识为“customVC”的控制器页面

中:[self performSegueWithIdentifier:@"customVC"sender:nil];

•2、连线方式:直接使用拖拽可以给按钮连线关联两个页面:选中按钮,按住control,从按钮向下一级页面连线。按钮不需要添加响应方法。

自定义segue

•步骤一:新建一个类继承自UIStoryboardSegue。

•步骤二:选中前一个控制器,按住control鼠标辅助完成连线,选择custom。

•步骤三:选中自定义segue,设置segue的identifier以及关联类。

•步骤四:在segue类里面重写perform方法(界面间跳转默认执行的方法),自定义跳转效果。

@implementation CustomSegue

//页面跳转时,自定义segue会自动触发此方法(重写的系统方法)

-(void)perform

{

//获取源控制器

UIViewController *v1 = (UIViewController

*)self.sourceViewController;

//获取目标控制器

UIViewController *v2 = (UIViewController

*)self.destinationViewController;

//自定义页面切换效果

[UIView transitionFromView:v1.view toView:v2.viewduration:

10 options:UIViewAnimationOptionTransitionCurlDown

completion:^(BOOL finished) {

//动画完成后执行的部分

}];

}

sizeClasses

•设备对应关系如下:

•iPhone4S,iPhone5/5s,iPhone6,iPhone6s

• 竖屏:(w:Compact h:Regular)

• 横屏:(w:Compact h:Compact)

•iPhone6 Plus/iPhone6s Plus

• 竖屏:(w:Compact h:Regular)

• 横屏:(w:Regular h:Compact)

•iPad

• 竖屏:(w:Regular h:Regular)

• 横屏:(w:Regular h:Regular)

总结

1.StoryBoard与xib在可视化编程中的对比。

2.可视化编程中页⾯面传值的方式。

3.自定义segue实现页面跳转动画。

4.sizeClass适配。

第十五节

创建UICollectionViewFlowLayout

UICollectionViewFlowLayout *flowLayout =[[UICollectionViewFlowLayout alloc] init];

//设置每个item的大小

flowLayout.itemSize = CGSizeMake(100, 100);

//设置每个item的最小列间距(默认是10)

flowLayout.minimumInteritemSpacing = 10;

//设置每个item的最小行间距(默认是10)

flowLayout.minimumLineSpacing = 10;

//设置分区间隔 (上,左,下,右)

flowLayout.sectionInset = UIEdgeInsetsMake(10, 10, 10,10);

//设置UICollectionView的滑动方向

flowLayout.scrollDirection =UICollectionViewScrollDirectionVertical;

//头部引用的尺寸

flowLayout.headerReferenceSize = CGSizeMake(100, 100);

//尾部引⽤用的尺寸

flowLayout.footerReferenceSize = CGSizeMake(100, 100);

设置代理

遵守代理协议:

@interface ViewController()

UICollectionViewDelegate>

@end

@implementation ViewController

指定代理人:

collectionView.delegate = self;

collectionView.dataSource = self;

创建item视图对象

//创建item视图对象

-(UICollectionViewCell *)collectionView: (UICollectionView*)collectionView

cellForItemAtIndexPath:(NSIndexPath *)indexPath

{

UICollectionViewCell *cell = [collectionView

dequeueReusableCellWithReuseIdentifier:@"collectionCELL"forIndexPath:indexPath];

cell.backgroundColor = [UIColor redColor];

return cell;

}

返回头部、尾部视图样式

UICollectionView不能像UITableView一样直接指定头部和尾部视

图,需要注册使用,最大的好处是添加了重用机制。

//注册头部视图

[collectionView registerClass:[UICollectionReusableViewclass]

forSupplementaryViewOfKind:UICollectionElementKindSectionHeaderwithReuseIdentifier:@"headerView"];

//注册尾部视图

[collectionViewregisterClass:[UICollectionReusableView class]

forSupplementaryViewOfKind:UICollectionElementKindSectionFooterwithReuseIdentifier:@"footerView"];

第十六节

单例模式

• 单例模式是一种设计模式

• 实现: 定义一个单例类,保证程序中这个类只能创建唯

一的实例对象,实现资源共享

单例代码展示

static DataHandle *handle = nil;

//单例类使用此方法,创建单例对象

+ (DataHandle *)shareInstance

{

if (nil == handle) {

//如果还没有创建过对象,使用handle指向新创建的对象

handle = [[DataHandle alloc] init];

}

//如果已经创建过对象,则直接返回已经创建的对象

return handle;

}

注意事项

•1)操作单例对象的变量存储在静态区程序关闭后由系统自动

回收。

•2)单例对象存储在堆区,不需要释放程序,关闭后由系统自

动回收。

•3)变量和单例对象的生命周期与程序同步。

优势

•1)在内存中只有一个对象,节省内存空间

•2)避免频繁的创建销毁对象,可以提高性能

•3)避免对共享资源的多重占用

•4)可以全局访问

•5)降低模块之间的耦合度,降低代码的复杂度

框架设置

项目页面框架步骤:

1、根据项目的页面个数创建相同个数的视图控制器

2、根据项目的页面逻辑创建每个视图控制器上的切换方法

3、根据项目的页面功能创建每个视图控制器上的功能方法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容

  • *7月8日上午 N:Block :跟一个函数块差不多,会对里面所有的内容的引用计数+1,想要解决就用__block...
    炙冰阅读 2,441评论 1 14
  • 概述在iOS开发中UITableView可以说是使用最广泛的控件,我们平时使用的软件中到处都可以看到它的影子,类似...
    liudhkk阅读 8,834评论 3 38
  • 天之骄子,国之利刃,远赴光明之塔,屠尽外域宵小,成千古佳话东都之枪,誓无冤魂蛮夷之地,寸草不生时过境迁,沧海桑田谄...
    JustEverOnce阅读 311评论 0 3
  • 标题送给我关注了有一段时间的公众号主人。 11.03 那天心情本来很好,阳光也很好,下午还在办公室和同事说说笑笑,...
    良人将至阅读 546评论 0 3
  • 2. 自学该怎么学?有没有入门书籍推荐? 首先,对于一个新手来说,最好的学习方法应该是系统学习(我觉得无论哪科知识...
    laozhao阅读 1,159评论 0 0