ios cell展示可滑动的图片

需求:

点击cell上的图片.图片以原图显示出来,可以放大或缩小.再次点击图片移除图片显示原来界面.(和QQ空间看图片类似)

点击图片实现效果:

1. 自定义一个 UITableView (KDImageDetailTableView) 在方法(- (id)initWithFrame:(CGRect)frame style:(UITableViewStyle)style)里面设置代理对象手势,tableView的背景色,隐藏指示器等

- (id)initWithFrame:(CGRect)frame style:(UITableViewStyle)style

{

    self = [super initWithFrame:frame style:style];

    if (self) {

        // Initialization code

        //解决手势冲突(代理对象必须是UIScrollView类的对象)

        self.panGestureRecognizer.delegate = self;

        //设置代理对象

        self.dataSource = self;

        self.delegate = self;

        //设置背景颜色

        self.backgroundColor = [UIColor blackColor];

        self.backgroundView = nil;

        //去掉分割线

        self.separatorStyle = UITableViewCellSeparatorStyleNone;

        //设置横向

        //1.逆时针旋转

        self.transform = CGAffineTransformMakeRotation(-M_PI_2);

        //2.重新设置frame

        self.frame = frame;

        //3.隐藏滑动指示器

        self.showsHorizontalScrollIndicator = NO;

        self.showsVerticalScrollIndicator = NO;

        //4.设置单元格的高度

        self.rowHeight = kMainScreenWidth + 20;

        //开启翻页效果

        self.pagingEnabled = YES;

        //默认隐藏

        self.alpha = 0;

         self.queue = [NSOperationQueue mainQueue];

    }

    return self;

}

当视图的内容在屏幕上绘制的时候

- (void)drawRect:(CGRect)rect

{

    [super drawRect:rect];

    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:self.index inSection:0];

    [self scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];

}

实现数据源方法和代理方法

#pragma mark - UITableView DataSource

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{

    return self.dataList.count;

}

 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

    static NSString *identifier = @"imageDetailCellId";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];

    self.showIndexpath = indexPath;

    if (cell == nil) {

        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier] ;

        //去掉单元格的背景颜色

        cell.backgroundColor = [UIColor clearColor];

        cell.backgroundView = nil;

        //取消单元格的选中事件

        cell.selectionStyle = UITableViewCellSelectionStyleNone;

        //顺时针旋转单元格

        cell.contentView.transform = CGAffineTransformMakeRotation(M_PI_2);

        //--------------创建子视图------------

        //1.创建小的滑动视图(主要是为了缩放)

        UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(10, 0, kMainScreenWidth, kMainScreenHeight)];

        //tag

        scrollView.tag = 201;

        //取消弹性效果

        scrollView.bounces = NO;

        //设置缩放比例

        scrollView.minimumZoomScale = 1.0;

        scrollView.maximumZoomScale = 2.0;

        scrollView.delegate = self;

        scrollView.backgroundColor = [UIColor clearColor];

        [cell.contentView addSubview:scrollView];

        //--------------创建图片---------

        UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, kMainScreenWidth, kMainScreenHeight)];

                                  

//      CGRectMake((kMainScreenWidth - 150)/2.0, (kMainScreenHeight -150)/2.0,150 , 150)];

        //设置填充方式

        imageView.contentMode = UIViewContentModeScaleAspectFit;

        imageView.userInteractionEnabled = YES;

        UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(imageTapAction:)];

        tap.numberOfTouchesRequired = 1;

        tap.numberOfTapsRequired = 1;

        [imageView addGestureRecognizer:tap];

        //tag

        imageView.tag = 2014;

        [scrollView addSubview:imageView];

        

        UIActivityIndicatorView *aIndicatorView = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];

        aIndicatorView.center = CGPointMake(kMainScreenWidth/2.0, kMainScreenHeight/2.0);

        aIndicatorView.hidden = YES;

        aIndicatorView.tag = 2015;

        [cell.contentView addSubview:aIndicatorView];

    }

    return cell;

}

 

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{

 

    [self.queue cancelAllOperations];

 

    NSString * imageUrl =self.dataList[indexPath.row];

     NSURL * requestAddress  =  [[KDDataTools share] getThumbnailUrlWithPath:imageUrl size:CGSizeMake(960, 720)];

//    NSURL  * requestAddress = [NSURL URLWithString:imageUrl];

 

    UIImageView *imageView = (UIImageView *)[cell.contentView viewWithTag:2014];

    imageView.frame = CGRectMake((kMainScreenWidth - 150)/2.0, (kMainScreenHeight -150)/2.0,150 , 150);

    imageView.image = [self.thumbnailDic objectForKey:@(indexPath.row)];

    UIScrollView * scrollView = (UIScrollView *)[cell.contentView viewWithTag:201];

    UIActivityIndicatorView * aindicatorView =(UIActivityIndicatorView *) [cell.contentView viewWithTag:2015];

    [aindicatorView startAnimating];

    

    __weak UIImageView *weakImageView = imageView;    

    [imageView setImageWithURL:requestAddress placeholderImage:[self.thumbnailDic objectForKey:@(indexPath.row)] options:SDWebImageRetryFailed success:^(UIImage *image) {

       

        // 1.把高清图片现实上去

        weakImageView.image = image;

        // 计算图片视图的高度 height / kscreenWith = size.heiht / size.with

        float height = weakImageView.image.size.height /weakImageView.image.size.width  * kMainScreenWidth;

        height = MAX(height, kMainScreenHeight);

        weakImageView.frame = CGRectMake(0, 0, kMainScreenWidth, height);

        scrollView.contentSize = CGSizeMake(kMainScreenWidth, height);

        [aindicatorView stopAnimating];

        

    } failure:^(NSError *error) {

        

    }];

 

}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    

    [self colse];

}

- (void)colse{

    

    [UIView animateWithDuration:.35f animations:^{

        

        self.alpha = 0;

    }];

    [self performSelector:@selector(removeFromSuperview) withObject:nil afterDelay:.35f];

}

- (void)imageTapAction:(UITapGestureRecognizer *)tap{

    

    [self colse];

}

#pragma mark - UIGestureRecognizer Delegate

//下面的代理方法只要是YES所有的滑动手势都会响应

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer

{

    return YES;

}

- (void)showInWindowFromsuperView:(UIView *)superView{

    

    UIWindow *windown = [superView window];

    [windown addSubview:self];

   

    [UIView animateWithDuration:1 animations:^{

        self.alpha = 1;

    }];

    

}

 

#pragma mark - UIScrollView Delegate

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

{

    //如果滑动的事表示图(我不在执行下面代码)

    if ([scrollView isMemberOfClass:[self class]]) {

        

        return;

    }

    

    

    if (scrollView.contentOffset.x == 0 || scrollView.contentOffset.x + scrollView.width >= scrollView.contentSize.width) {

        

    } else {

        //获取滑动视图里面的手势对象,并获取位置

        CGPoint point = [scrollView.panGestureRecognizer locationInView:self];

        int index = point.y / 340;

        //固定表示图

        self.contentOffset = CGPointMake(0, index *  340);

    }

}

这个方法返回的控件就是需要进行缩放的控件

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView

{

    UIImageView *imageView = (UIImageView *)[scrollView viewWithTag:2014];

    return imageView;

}

原文地址:https://www.cnblogs.com/supersr/p/5413531.html