需求:

点击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;

}

ios cell展示可滑动的图片的更多相关文章

  1. iOS开发系列--无限循环的图片浏览器

    --UIKit之UIScrollView 概述 UIKit框架中有大量的控件供开发者使用,在iOS开发中不仅可以直接使用这些控件还可以在这些控件的基础上进行扩展打造自己的控件.在这个系列中如果每个控件 ...

  2. IOS 非常流畅的滑动tableView

    为什么要写这篇文章呢?之前写过一篇,因为手机打字不是很方便,还有之前同事用6splus 定下午茶时候,我滑动列表时候竟然误以为是安卓系统的手机.   tableview 流畅度可以用fps来测试,到6 ...

  3. ReactNative学习-滑动查看图片第三方组件react-native-swiper

    滑动查看图片第三方组件:react-native-swiper,现在的版本为:1.4.3,该版本还不支持Android. 下面介绍的是该组件的一些用法,可能总结的不完整,希望大家一起来共同完善. 官方 ...

  4. iOS开发项目实战——Swift实现图片轮播与浏览

    近期開始开发一个新的iOS应用,自己决定使用Swift.进行了几天之后,发现了一个非常严峻的问题.那就是无论是书籍,还是网络资源,关于Swift的实在是太少了,随便一搜全都是OC实现某某某功能.就算是 ...

  5. IOS的H5页面滑动不流畅的问题:

    IOS的H5页面滑动不流畅的问题: -webkit-overflow-scrolling : touch; 需要滑动的是哪块区域,就在哪里加上这段代码就OK

  6. H5+CSS3实现手指滑动切换图片

    包含3个文件:html.slider-H5.js.jquery.js(自行下载).在html中可配置滑动参数.具体代码如下: HTML代码: <!DOCTYPE HTML> <htm ...

  7. Android:使用ViewPager实现左右滑动切换图片(图上有点点)

    在以下实例的基础上加上点点 Android:使用ViewPager实现左右滑动切换图片 (简单版) 效果预览: 因为要把点点放图片上,所以修改布局为相对布局: <?xml version=&qu ...

  8. Android:使用ViewPager实现左右滑动切换图片 (简单版)

    ViewPager,它是google SDk中自带的一个附加包的一个类, 可以使视图滑动. 步骤: 1.引入android-support-v4.jar包,在主布局里加入 <android.su ...

  9. iOS WebView 加载本地资源(图片,文件等)

    https://www.cnblogs.com/dhui69/p/5596917.html iOS WebView 加载本地资源(图片,文件等) NSString *path = [[NSBundle ...

随机推荐

  1. UI第四节——UIImageView详解

    - (void)viewDidLoad { // super调用是必须的 [super viewDidLoad]; UIImage *image = [UIImage imageNamed:@&quo ...

  2. C++之map、list操作

    #include <iostream> #include "map_struct.h" #include <map> using namespace std ...

  3. iOS开发——多线程篇——RunLoop

    一.简介 1.什么是RunLoop从字面意思看运行循环跑圈 基本作用保持程序的持续运行处理App中的各种事件(比如触摸事件.定时器事件.Selector事件)节省CPU资源,提高程序性能:该做事时做事 ...

  4. BZOJ4610——[Wf2016]Ceiling Functi

    水题一道,不是很懂为啥没人做... 1.题意:纠正一下..bzoj的题意不是很对...注意不是堆,是不平衡的二叉树,就是非旋转的treap, 另外...插入的时候,小于插在左边..大于等于插在右边 2 ...

  5. Unity手游之路<十一>资源打包Assetbundle

    http://blog.csdn.net/janeky/article/details/17652021 在手游的运营过程中,更新资源是比不可少的.资源管理第一步是资源打包.传统的打包可以将所有物件制 ...

  6. 获取SHA1和MD5

    首先:1.我们进入到通过cmd打开控制台,进入cmd定位到.android文件夹下.如下图: 2.输入keytool -list -v -keystore debug.keystore得到三种指纹证书 ...

  7. servlet部分知识总结

    1.解决中文显示乱码问题: 对于servlet :servlet里面加入代码response.setContentType("text/html;chartset=utf-8"); ...

  8. 搭建高可用mongodb集群(四)—— 分片

    按照上一节中<搭建高可用mongodb集群(三)-- 深入副本集>搭建后还有两个问题没有解决: 从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的 ...

  9. centos 谷歌浏览器安装

    首先,这个是坑 http://www.tecmint.com/install-google-chrome-on-redhat-centos-fedora-linux/ 安装会报错,按照错误找到以下资源 ...

  10. spring ext 跨域

    read方法中调用的response对象是父类BaseController的一个成员变量. spring默认bean的生命周期Score为singleton单例模式. 当多线程并发使用同一bean, ...