UIScrollView

UIScrollView是一个能够在上下左右四个方向滚动的控件,UITableView、UICollectionView也是继承自UIScrollView。

UIScrollView用于显示超出屏幕大小的内容,一般需要配合其他控件来使用,如添加一个UIImageView子控件,可以用来显示更大的图片。UITableView、UICollectionView以及UITextView这些可以滑动显示更多内容的控件都是UIScrollView的子类。

UIScrollView在使用过程中有如下3个核心属性。
// contentSize:表示UIScrollView内容的尺寸(即可滚动区域),一般会大于屏幕大小
@property(nonatomic) CGSize contentSize;    // 默认大小为0
// contentOffset:当前屏幕显示区域的原点(即左上角原点),在UIScrollView的位置
@property(nonatomic) CGPoint contentOffset;  // 默认从原点开始
// contentInset:可以在UIScrollView内容的四周增加额外的滚动区域(设置的值为:上、左、下、右)
@property(nonatomic) UIEdgeInsets contentInset;
除此之外,UIScrollView还有以下几个常用的属性。
bounces:当UIScrollView滚动到边界时,再继续滚动会有个反弹的效果(通常设置为YES)。
// 注意:如果不设置contentSize,bounces的效果是显现不出来的,除非将alwaysBounceVertical和alwaysBounceHorizontal属性设置为YES。
showsHorizontalScrollIndicator:显示水平指示器(YES为显示)。
showsVerticalScrollIndicator:显示垂直指示器。
pagingEnabled:分页效果(是否整页翻动)。
scrollEnabled:UIScrollView是否可以滚动。

-(void)viewDidLoad {
    [super viewDidLoad];
    UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image"]];
    // 创建一个与屏幕等高等宽的滚动视图
    UIScrollView *myScrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds];
    // 设置滚动区域
    myScrollView.contentSize = imageView.bounds.size;
    // 其他属性
    myScrollView.backgroundColor = [UIColor redColor];
    myScrollView.contentOffset = CGPointMake(0, 2);
    myScrollView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0);
    
    [myScrollView adSSubview:imageView];
    [self.view addSubview:myScrollView];
}

2. UIScrollView常用代理方法的实现

UIScrollViewDelegate是UIScrollView的代理协议,通过其中定义的代理方法,即可监听在用户交互过程中的不同动作。在调用UIScrollViewDelegate中的方法前,需要提前将UIScrollView对象的代理设置完成,系统会在特定的时机自动调用代理对象的响应方法,即发送特定的消息给代理,代理来完成相应工作。

目前UIScrollView共有13个代理方法,但是在实际开发中并不会都用到,这里主要讲其中3个方法。
// 当滚动时不断调用。
-(void)scrollViewDidScroll:(UIScrollView *)scrollView;
// 即将开始滚动时调用。
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;
// 手指离开屏幕,停止滚动时调用。
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;

UIScrollViewDelegate的实现方法与其他代理协议的实现方法是完全一致的,主要包括以下3个步骤。

遵守代理协议。谁遵守了这个协议,谁就是UIScrollView的代理,一般情况下,会设置控制器类作为滚动视图的代理。
设置代理属性。
根据程序功能的需要,实现相应的代理方法。

@interface ViewController() <UIScrollViewDelegate>

-(void)viewDidLoad {
    [super viewDidLoad];
    // ...
    myScrollView.delegate = self;
    // ...
}

-(void)scrollViewDidScroll:(UIScrollView *)scrollView {
    NSLog(@" 滚动调用 ");
}

3. 视图的缩放功能

UIScrollView提供了对子控件(如图片)的放大和缩小功能,该项功能需要通过UIScrollView的代理方法来实现。需要注意的是缩放功能会修改UIScrollView的contentSize值。
// UIScrollView中定义的与图片放大缩小相关的属性。
@property(nonatomic) CGFloat minimumZoomScale;  // 最小放大比例,取值0.0-1.0。默认1.0
@property(nonatomic) CGFloat maximumZoomScale;  // 最大放大比例。默认1.0

// UIScrollViewDelegate中定义的与图片放大缩小相关的代理方法。
// 返回需要放大的控件,必须实现改方法
-(nullable UIView *)viewForZoomInScrollView:(UIScrollView *)scrollVIew;
// 即将开始缩放时调用
-(void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(nullable UIView *)view;
// 结束缩放时调用
-(void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(nullable UIView *)view atScale:(CGFloat)scale;
// 缩放过程中不断调用该方法
-(void)scrollViewDidZoom:(UIScrollView *)scrollView;
添加一个用于缩放的UIImageView图片属性,并且对其进行懒加载设置属性。
@interface ViewController ()<UIScrollViewDelegate>
@property (nonatomic, strong) UIImageView *imageView;
@end
-(UIImageView *)imageView {
    if (_imageView == nil) {
        _imageView = [[UIImageView alloc] initWithIamge:[UIImage imageNamed:@"image"]];
    }
    return _imageView;
}
-(void)viewDidLoad {
    // ...
    myScrollView.delegate = self;
    myScrollView.minimumZoomScale = 0.3;
    myScrollView.maximumZoomScale = 3;
    // ...
}
// 实现viewForZoomingInScrollView:方法,返回需要被缩放的图片对象。
-(void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(nullable UIView *)view {
    NSLog(@"  缩放开始  ");
}
// 监控用户缩放的行为动作。
-(UIView *)viewForZoomInScrollView:(UIScrollVIew *)scrollView {
    return self.imageView;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值