UIScrollView(二)

本文详细介绍如何使用UIScrollView实现图片浏览功能,包括图片缩放、单击与双击手势冲突解决及无限轮播效果实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先做个小补充,上一篇貌似忘记介绍UIScrollView的缩放功能了,这里正好要给大家介绍使用UIScrollView实现图片浏览,会涉及到缩放的操作,所以就在这里介绍一下吧,此外给图片添加单击双击和长按手势也有一些小问题需要注意,就是单击和双击手势冲突问题,请戳这里:OC同时添加单击和双击手势冲突

先说先缩放吧:

- (void)viewDidLoad {
    [super viewDidLoad];
    //创建滚动视图
    UIScrollView *scrollView = [[[UIScrollView alloc]initWithFrame:[UIScreen mainScreen].bounds]autorelease];
    
    scrollView.contentSize = CGSizeMake(1000, 1000);
    
    //缩小的最小比例
    scrollView.minimumZoomScale = 0.5;
    //放大的最大比例
    scrollView.maximumZoomScale = 2;
    //设置变化比例
    //scrollView.zoomScale = 1;
    //设置delegate
    scrollView.delegate = self;
    
    //添加图片到scrollView上
    UIImageView *imgView = [[[UIImageView alloc]initWithFrame:[UIScreen mainScreen].bounds]autorelease];
    imgView.image = [UIImage imageNamed:@"2.png"];
    imgView.userInteractionEnabled = YES;
    [scrollView addSubview:imgView];
    [self.view addSubview:scrollView];
}

//设定要缩放的视图
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{
    return [scrollView.subviews objectAtIndex:0];
}

//缩放时执行的方法
- (void)scrollViewDidZoom:(UIScrollView *)scrollView{
    
    UIImageView *imgView = (UIImageView *)[scrollView.subviews objectAtIndex:0];
    if (scrollView.zoomScale < 1) {
        imgView.center = self.view.center;
    }else{
        //放大后保证边缘无错误
        CGRect rect = imgView.frame;
        rect.origin = CGPointMake(0, 0);
        imgView.frame = rect;

    }
}

无限轮播在这里(到最后一张图片继续滑动到第一张):多图片无缝滚动组件封装与使用

下面是UIScrollView复用实现图片浏览(到最后一张图片继续滑动不到第一张):

#import "ViewController.h"
static int i;
@interface ViewController ()<UIScrollViewDelegate>
@property (nonatomic, strong) UIScrollView *scrollView;
@property (nonatomic, strong) NSMutableArray *imagesArray;
@property (nonatomic, strong) UIImageView *currentImageView;
@property (nonatomic, strong) UIImageView *nextImageView;
@property (nonatomic, strong) UIImageView *preImageView;
@property (nonatomic, strong) UIScrollView *currentScrollView;
@end

@implementation ViewController

- (void)viewDidLoad {

    [super viewDidLoad];
    self.view.backgroundColor = [UIColor blackColor];
    
    _imagesArray = [[NSMutableArray alloc]init];
    for (int i = 1; i <= 5; i++) {
        NSString *str = [NSString stringWithFormat:@"%d", i];
        UIImage *image = [UIImage imageNamed:str];
        [_imagesArray addObject:image];
    }
    
    CGFloat width = self.view.frame.size.width;
    CGFloat height = self.view.frame.size.height;
    
    self.scrollView = [[UIScrollView alloc]init];
    self.scrollView.frame = CGRectMake(0, 0, width, height);
    [self.view addSubview:_scrollView];
    if (_imagesArray.count > 1) {
        [self.scrollView setContentSize:CGSizeMake(width * 2, height)];
    }else{
        [self.scrollView setContentSize:CGSizeMake(width, height)];
    }
    self.scrollView.showsHorizontalScrollIndicator = NO;
    self.scrollView.pagingEnabled = YES;
    self.scrollView.delegate = self;
    self.scrollView.contentOffset = CGPointMake(0, 0);
    self.scrollView.bounces = NO;
    
    self.currentScrollView = [[UIScrollView alloc]init];
    self.currentScrollView.frame = CGRectMake(0, 0, width, height);
    [self.scrollView addSubview:_currentScrollView];
    [self.currentScrollView setContentSize:CGSizeMake(width, height)];
    self.currentScrollView.showsHorizontalScrollIndicator = NO;
    self.currentScrollView.showsVerticalScrollIndicator = NO;
    self.currentScrollView.bouncesZoom = YES;
    self.currentScrollView.backgroundColor = [UIColor clearColor];
    self.currentScrollView.delegate = self;
    self.currentScrollView.minimumZoomScale = 0.8;
    self.currentScrollView.maximumZoomScale = 2;
    self.currentScrollView.scrollEnabled = YES;
    self.currentScrollView.contentOffset = CGPointMake(0, 0);
    self.currentScrollView.bounces = NO;
    self.currentImageView = [[UIImageView alloc]init];
    self.currentImageView.image = [_imagesArray firstObject];
    self.currentImageView.frame = CGRectMake(0, 0, width, height);
    [_currentScrollView addSubview:_currentImageView];
    [self.scrollView addSubview:_currentScrollView];
    self.currentImageView.contentMode = UIViewContentModeScaleAspectFit;
    
    if (_imagesArray.count > 1) {
        self.nextImageView = [[UIImageView alloc]init];
        self.nextImageView.image = _imagesArray[1];
        self.nextImageView.frame = CGRectMake(width, 0, width, height);
        [self.scrollView addSubview:_nextImageView];
        self.nextImageView.contentMode = UIViewContentModeScaleAspectFit;
        
        self.preImageView = [[UIImageView alloc]init];
        self.preImageView.frame = CGRectMake(0, 0, 0, 0);
        [self.scrollView addSubview:_preImageView];
        self.preImageView.image = [_imagesArray firstObject];
        self.preImageView.contentMode =UIViewContentModeScaleAspectFit;
    }
}

- (void)reload{
    CGFloat width = self.view.frame.size.width;
    CGFloat height = self.view.frame.size.height;
    
    if (i == 0) {
        [self.scrollView setContentSize:CGSizeMake(width * 2, height)];
        self.scrollView.contentOffset = CGPointMake(0, 0);
        self.currentScrollView.frame = CGRectMake(0, 0, width, height);
        self.nextImageView.frame = CGRectMake(width, 0, width, height);
        self.preImageView.frame = CGRectMake(0, 0, 0, 0);
    }else if (i == _imagesArray.count - 1){
        [self.scrollView setContentSize:CGSizeMake(width * 2, height)];
        self.scrollView.contentOffset = CGPointMake(width, 0);
        self.currentScrollView.frame = CGRectMake(width, 0, width, height);
        self.nextImageView.frame = CGRectMake(width, 0, 0, 0);
        self.preImageView.frame = CGRectMake(0, 0, width, height);
    }else{
        [self.scrollView setContentSize:CGSizeMake(width * 3, height)];
        self.scrollView.contentOffset = CGPointMake(width, 0);
        self.currentScrollView.frame = CGRectMake(width, 0, width, height);
        self.nextImageView.frame = CGRectMake(width*2, 0, width, height);
        self.preImageView.frame = CGRectMake(0, 0, width, height);
    }
}

#pragma mark - scroll delegate

- (void) scrollViewDidScroll:(UIScrollView *)scrollView{
    int page = i;
    float offset = self.scrollView.contentOffset.x;
    
    if (self.nextImageView.image == nil || self.preImageView.image == nil) {
        //下一张
        if (i <= _imagesArray.count - 1) {
            _nextImageView.image = [self getNextImageByIndex:i];
        }
        //上一张
        if (i >= 0) {
            _preImageView.image = [self getPreImageIndex:i];
        }
    }
    
    if(offset == 0){
        _currentImageView.image = _preImageView.image;
        _preImageView.image = nil;
        i = i - 1;
        if (i <= 0) {
            i = 0;
        }
    }

    if ((offset == scrollView.bounds.size.width * 2) || (offset == scrollView.bounds.size.width && i == 0)) {
        _currentImageView.image = _nextImageView.image;
        _nextImageView.image = nil;
        i = i + 1;
        if (i >= _imagesArray.count) {
            i = (int)_imagesArray.count;
        }
    }
    
    if (i == 0) {
        _currentImageView.image = [_imagesArray firstObject];
    }
    
    if (i != page) {
        [self reload];
    }
}

- (UIImage *)getNextImageByIndex:(NSInteger)index{
    if (index < _imagesArray.count - 1) {
        UIImage *image = _imagesArray[index+1];
        return image;
    }
    return nil;
}

- (UIImage *)getPreImageIndex:(NSInteger)index{
    if (index > 0) {
        UIImage *image = _imagesArray[index-1];
        return image;
    }
    return nil;
}


- (UIView *) viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return _currentImageView;
}

- (void)scrollViewDidZoom:(UIScrollView *)scrollView
{
    
    CGSize boundsSize = scrollView.bounds.size;
    CGRect imgFrame = _currentImageView.frame;
    CGSize contentSize = scrollView.contentSize;
    
    CGPoint centerPoint = CGPointMake(contentSize.width/2, contentSize.height/2);
    
    if (imgFrame.size.width <= boundsSize.width)
    {
        centerPoint.x = boundsSize.width/2;
    }
    
    if (imgFrame.size.height <= boundsSize.height)
    {
        centerPoint.y = boundsSize.height/2;
    }
    
    _currentImageView.center = centerPoint;
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
    _currentScrollView.zoomScale = 1.0;
}

@end


最后强调一个开发中常遇到的问题,那就是scrollView上的子button或者其他带点击事件的控件的触摸互有一定的延迟,解决办法    scrollView.delaysContentTouches = NO;即可。
防止scrollView手势覆盖侧滑手势:

[[UIBarButtonItemappearance]setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60)forBarMetrics:UIBarMetricsDefault];

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值