UI控件(2)

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时,指定scrollViewframe与当前控制器视图大小、位置一致。设定contentSize为整个imageView的大小。最后设定scrollViewautoresizingMaskUIViewAutoresizingFlexibleWidthUIViewAutoresizingFlexibleHeight,这样在屏幕旋转时,scrollView就可以自动调整布局。

进入viewDidLoad,把scrollView添加到控制器视图,把imageView添加到scrollView

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self.view addSubview:self.scrollView];
    [self.scrollView addSubview:self.imageView];
}

缩放

为支持缩放功能,定义的类必须遵守UIScrollViewDelegate协议,必须实现viewForZoomingInScrollView:代理方法,在该代理方法中返回要缩放的视图。另外,还需要使用maximumZoomScaleminimumZoomScale指定可应用于滚动视图的最大、最小缩放比。这两个属性的默认值均为1.0

@interface ViewController () <UIScrollViewDelegate>

scrollView的懒加载方法中,将当前控制器设置为scrollView的代理,scrollView的最小、最大缩放比分别为0.14.0,当前缩放比zoomScale1.0zoomScale默认值为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并把它赋值给UIViewControllerview属性。
    -
    [ViewController viewDidLoad]:
    此时整个视图层次(view hierarchy)已经放到内存中,可以移除一些视图,修改约束,加载数据等。
  • [ViewController viewWillAppear:]: 视图加载完成,并即将显示在屏幕上。还没设置动画,可以改变当前屏幕方向或状态栏的风格等。
  • **[ViewController viewWillLayoutSubviews]**即将开始子视图位置布局
  • **[ViewController viewDidLayoutSubviews]**用于通知视图的位置布局已经完成
  • **[ViewController viewDidAppear:]😗*视图已经展示在屏幕上,可以对视图做一些关于展示效果方面的修改。
  • **[ViewController viewWillDisappear:]😗*视图即将消失
  • **[ViewController viewDidDisappear:]😗*视图已经消失
  • **[ViewController dealloc:]😗*视图销毁的时候调用

3.2 注意点

  • 只有init系列的方法,如initWithNibName需要自己调用,其他方法如loadViewawakeFromNib则是系统自动调用。而viewWill/Did系列的方法则类似于回调和通知,也会被自动调用。
  • 纯代码写视图布局时需要注意,要手动调用loadView方法,而且不要调用父类的loadView方法。纯代码和用IB的区别仅存在于loadView方法及其之前,编程时需要注意的也就是loadView方法。
  • 除了initWithNibNameawakeFromNib方法是处理视图控制器外,其他方法都是处理视图。这两个方法在视图控制器的生命周期里只会调用一次。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值