免费开源的iOS开发学习平台

UIScrollView滚动视图:3-视图的缩放功能

UIScrollView中与控件缩放相关的方法与属性

UIScrollView提供了对子控件(如图片)的放大和缩小功能,该项功能需要通过UIScrollView的代理方法来实现。需要注意的是缩放功能会修改UIScrollView的contentSize值。

  • UIScrollView中定义的与图片放大缩小相关的属性:
@property(nonatomic) CGFloat minimumZoomScale;     // 最小放大比例,取值范围0.0~1.0,默认1.0
@property(nonatomic) CGFloat maximumZoomScale;    //最大放大比例,默认1.0
  • UIScrollViewDelegate中定义的与图片放大缩小相关的代理方法:
- (nullable UIView *)viewForZoomingInScrollView:(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对象实现缩放的操作。

  • 创建一个Single View Application工程,并导入一张名为image的图片,图片的大小尽量大一些

  • 设置ViewController类遵守UIScrollViewDelegate协议

@interface ViewController () <UIScrollViewDelegate>
  • 添加一个用于缩放的UIImageView图片属性,并且对其进行懒加载设置属性
@interface ViewController ()<UIScrollViewDelegate>
@property (nonatomic,strong) UIImageView * imageView;
@end
-(UIImageView *)imageView{
    if (_imageView == nil) {
        _imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image"]];
    }
    return _imageView;
}
  • 在ViewDidLoad中添加如下代码,设置UIScrollView的属性并且指定其缩放的比例
- (void)viewDidLoad {
    [super viewDidLoad];
    //创建一个与屏幕等宽等高的滚动视图
    UIScrollView *myScrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds];
    //设置滚动区域的大小
    myScrollView.contentSize = self.imageView.bounds.size;
    //指定其代理对象
    myScrollView.delegate = self;
    //设置最小和最大缩放倍数
    myScrollView.minimumZoomScale = 0.3;
    myScrollView.maximumZoomScale = 3;
    //添加子视图
    [myScrollView addSubview:self.imageView];
    [self.view addSubview:myScrollView];
}
  • 实现viewForZoomingInScrollView:方法,返回需要被缩放的图片对象
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
    return self.imageView;
}
  • 监控用户缩放的行为动作
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(nullable UIView *)view{
    NSLog(@"图片即将开始被缩放。");
}

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(nullable UIView *)view atScale:(CGFloat)scale{
    NSLog(@"图片缩放完成。");
}

- (void)scrollViewDidZoom:(UIScrollView *)scrollView{
    NSLog(@"图片缩放过程中。");
}

运行结果如下。

示例代码

https://github.com/99ios/8.1.3