文章目录
1、UIScrollView
1、介绍
在iOS中,滚动视图UIScrollView
用于查看大于屏幕的内容。Scroll View有两个主要目的:
-
让用户拖动视图以显示更多内容区域。
-
让用户使用捏合手势放大或缩小所显示的内容。
2.语法
- (UIImageView *)imageView {
if (!_imageView) {
UIImage *image = [UIImage imageNamed:@"PC"];
// 1.初始化imageView 使用initWithImage:方法初始化imageView。用这种方法初始化的图片视图其大小与图片大小一致
_imageView = [[UIImageView alloc] initWithImage:image];
}
return _imageView;
}
- (UIScrollView *)scrollView {
if (!_scrollView) {
// 2.初始化、配置scrollView
_scrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds];
_scrollView.backgroundColor = [UIColor blackColor];
_scrollView.contentSize = self.imageView.frame.size;
_scrollView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
}
return _scrollView;
}
初始化scrollView
时,指定scrollView
的frame
与当前控制器视图大小、位置一致。设定contentSize
为整个imageView
的大小。最后设定scrollView
的autoresizingMask
为UIViewAutoresizingFlexibleWidth
和UIViewAutoresizingFlexibleHeight
,这样在屏幕旋转时,scrollView
就可以自动调整布局。
进入viewDidLoad
,把scrollView
添加到控制器视图,把imageView
添加到scrollView
- (void)viewDidLoad {
[super viewDidLoad];
[self.view addSubview:self.scrollView];
[self.scrollView addSubview:self.imageView];
}
缩放
为支持缩放功能,定义的类必须遵守UIScrollViewDelegate
协议,必须实现viewForZoomingInScrollView:
代理方法,在该代理方法中返回要缩放的视图。另外,还需要使用maximumZoomScale
和minimumZoomScale
指定可应用于滚动视图的最大、最小缩放比。这两个属性的默认值均为1.0
。
@interface ViewController () <UIScrollViewDelegate>
在scrollView
的懒加载方法中,将当前控制器设置为scrollView
的代理,scrollView
的最小、最大缩放比分别为0.1
、4.0
,当前缩放比zoomScale
为1.0
,zoomScale
默认值为1.0
。
- (UIScrollView *)scrollView {
if (!_scrollView) {
...
_scrollView.delegate = self;
_scrollView.minimumZoomScale = 0.1;
_scrollView.maximumZoomScale = 4.0;
_scrollView.zoomScale = 1.0;
}
return _scrollView;
}
更多细节操作请看
2、UITableViewController
2.1 介绍
iOS表格视图由单元格 (一般可重复使用) 组成,用于显示垂直滚动的视图。在iOS 中,表格视图用于显示数据列表,如联系人、待办事项或购物项列表。
UITableView对象要有数据源才能正常工作。UITableView对象会向数据源查询要显示的行数、显示表格行所需的数据和其他所需的数据。没有数据源的UITableView对象只是空壳。凡是遵守UITableViewDataSource协议的Objective-C对象,都可以成为UITableView对象的数据源(即dataSource属性所指向的对象)。
2.2 语法
关键是要实现UITableViewDelegate, UITableViewDataSource这两个协议
#import "ViewController.h"
@interface ViewController ()<UITableViewDelegate, UITableViewDataSource>
@property (strong, nonatomic) UITableView *tableView;
@property (copy, nonatomic) NSArray *dwarves;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.dwarves = [[NSMutableArray alloc]initWithObjects:
@"Data 1 in array",@"Data 2 in array",@"Data 3 in array",
@"Data 4 in array",@"Data 5 in array",@"Data 5 in array",
@"Data 6 in array",@"Data 7 in array",@"Data 8 in array",
@"Data 9 in array", nil];
_tableView = [[UITableView alloc] init];
_tableView.dataSource = self;
[_tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"UITableViewCell"];
[self.view addSubview:_tableView];
}
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
self.tableView.frame = self.view.bounds;
}
#pragma mark --UITableViewDataSource
// 1.告诉table实现几组数据
// 重写分组 原来默认1
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
// 2.告诉table每组显示几条
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return [self.dwarves count];
}
// 3.告诉table每一组每一行显示什么内容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"UITableViewCell"];
// 左边图标
UIImage *image = [UIImage imageNamed:@"y"];
cell.imageView.image =image;
// 点击后图标会发生变化
UIImage *highlightedImage = [UIImage imageNamed:@"z"];
cell.imageView.highlightedImage = highlightedImage;
cell.textLabel.text = self.dwarves[indexPath.row];
return cell;
}
//行高
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 244.0;
}
2.3注意点
一、UITableViewStylePlain(默认)
1.plain类型有多段时,段头停留(自带效果)
2.plain类型默认section之间没有中间的间距和头部间距(想让plain类型的section之间留有空白,需要在UITableView代理方法中return自定义的header和footer,并在自定义的UITableViewHeaderFooterView里面重写setFrame方法)
3.扩展:让plain类型的UITableView段头不停留(取消粘性效果)
二、UITableViewStyleGroup
注意:去掉Group类型的表section头部和中间间隔的方法:
1.设置标题tableHeaderView的高度为特小值,但不能为零,若为零的话,ios会取默认值18,就无法消除头部间距了。
UIView *view = [[UIView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 0.001)];
view.backgroundColor = [UIColor redColor];
self.tableView.tableHeaderView = view;
2.设置代理方法(中间的留白其实是段尾的高度,代理的作用设置段尾的高度,返回值也不能为0,否则系统启用默认值18)
-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
return 0.01f;
}
//特殊的处理方法也能实现该效果
self.tableView.contentInset = UIEdgeInsetsMake(-44, 0, 0, 0);
3.自定义类继承UITableViewHeaderFooterView,重写setFrame方法,在UITableView代理方法中return 自定义类创建的section的header和footer。
-(void)setFrame:(CGRect)frame{
frame.size.height+=10;
[super setFrame:frame];
}
注意:sectionHeaderHeight/sectionFooterHeight这2个属性只在Grouped类型,且未实现代理方法tableView:heightForHeaderInSection: 时有效,在plain风格下设置无效。故在使用UITableView过程中尽量使用代理方法设置sectionHeader和sectionFooter的高度。
3、 UIViewController的生命周期
3.1 视图的生命历程
[ViewController initWithCoder:]
或[ViewController initWithNibName:Bundle]
: 首先从归档文件中加载UIViewController
对象。即使是纯代码,也会把nil
作为参数传给后者。[UIView awakeFromNib]:
作为第一个方法的助手,方法处理一些额外的设置。[ViewController loadView]
:创建或加载一个view
并把它赋值给UIViewController
的view
属性。
-[ViewController viewDidLoad]
: 此时整个视图层次(view hierarchy)
已经放到内存中,可以移除一些视图,修改约束,加载数据等。[ViewController viewWillAppear:]
: 视图加载完成,并即将显示在屏幕上。还没设置动画,可以改变当前屏幕方向或状态栏的风格等。- **
[ViewController viewWillLayoutSubviews]
**即将开始子视图位置布局 - **
[ViewController viewDidLayoutSubviews]
**用于通知视图的位置布局已经完成 - **
[ViewController viewDidAppear:]
😗*视图已经展示在屏幕上,可以对视图做一些关于展示效果方面的修改。 - **
[ViewController viewWillDisappear:]
😗*视图即将消失 - **
[ViewController viewDidDisappear:]
😗*视图已经消失 - **
[ViewController dealloc:]
😗*视图销毁的时候调用
3.2 注意点
- 只有
init
系列的方法,如initWithNibName
需要自己调用,其他方法如loadView
和awakeFromNib
则是系统自动调用。而viewWill/Did
系列的方法则类似于回调和通知,也会被自动调用。 - 纯代码写视图布局时需要注意,要手动调用
loadView
方法,而且不要调用父类的loadView
方法。纯代码和用IB
的区别仅存在于loadView
方法及其之前,编程时需要注意的也就是loadView
方法。 - 除了
initWithNibName
和awakeFromNib
方法是处理视图控制器外,其他方法都是处理视图。这两个方法在视图控制器的生命周期里只会调用一次。