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;

}

时间: 2024-08-03 12:42:31

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

IOS开发系列--无限循环的图片浏览器

--UIKit之UIScrollView 概述 UIKit框架中有大量的控件供开发者使用,在iOS开发中不仅可以直接使用这些控件还可以在这些控件的基础上进行扩展打造自己的控件.在这个系列中如果每个控件都介绍一遍确实没有必要,所谓授人以鱼不如授人以渔,这里会尽可能让大家明白其中的原理,找一些典型的控件进行说明,这样一来大家就可以触类旁通.今天我们主要来看一下UIScrollView的内容: UIView UIScrollView 实战--图片浏览器 UIView 在熟悉UIScrollView之前

iOS多线程自定义operation加载图片 不重复下载图片

摘要:1:ios通过抽象类NSOperation封装了gcd,让ios的多线程变得更为简单易用:   2:耗时的操作交给子线程来完成,主线程负责ui的处理,提示用户的体验   2:自定义operation继承自NSOperation,在子线程中下载图片: 3:保证图片只下载一次,还有保证下载任务不重复 ------------------------------------------------------------------------------------ 实现原理:1:图片缓存:用

IOS 非常流畅的滑动tableView

为什么要写这篇文章呢?之前写过一篇,因为手机打字不是很方便,还有之前同事用6splus 定下午茶时候,我滑动列表时候竟然误以为是安卓系统的手机. ? tableview 流畅度可以用fps来测试,到60帧说明你优化tableView 已经很有经验了. 如下图怎么测试 接下来从哪方面入手来优化呢? 优化tableView主要有两个思路.缓存操作和异步操作. ? 问题一: 新人写tableView ,在下面方法中 频繁的创建cell 上的子控件并且添加到cell 上,这是一个要注意的地方,因为这样频

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

最近开始开发一个新的iOS应用,自己决定使用Swift,进行了几天之后,发现了一个很严峻的问题,那就是不管是书籍,还是网络资源,关于Swift的实在是太少了,随便一搜全都是OC实现某某某功能.就算是找到Swift的资源,一看,大概是半年前的代码,或是一年前的代码,一运行,全都报错.这是由于毕竟Swift还是在不断发展完善当中,随着Swift2.0的开源以来,包括发布Swift这一年多以来,Swift的改动还是很大的,很多的接口或是语法前后有较大差异.有些功能只能自己硬生生看官方文档或挤破脑子想,

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

滑动查看图片第三方组件:react-native-swiper,现在的版本为:1.4.3,该版本还不支持Android. 下面介绍的是该组件的一些用法,可能总结的不完整,希望大家一起来共同完善. 官方文档:https://github.com/leecade/react-native-swiper 效果图: 安装 npm install --save react-native-swiper 基础用法 import React, {AppRegistry,Component,StyleSheet,

iOS-响应上下左右滑动手势

iOS-响应上下左右滑动手势 分类: iPhone开发2012-03-17 14:42 25489人阅读 评论(8) 收藏 举报 iosup -(void)viewDidLoad{ UISwipeGestureRecognizer *recognizer; recognizer = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(handleSwipeFrom:)]; [recognizer setDir

iOS获取app图标和启动图片名字(AppIcon and LaunchImage's name)

在某种场景下,可能我们需要获取app的图标名称和启动图片的名称.比如说app在前台时,收到了远程通知但是通知栏是不会有通知提醒的,这时我想做个模拟通知提示,需要用到icon名称:再比如在加载某个控制器时,想设置该控制器的背景图片为启动图片,需要用到启动图片名称. 而事实上icon图片放在系统AppIcon文件夹里,启动图片放在系统LaunchImage文件夹里,取这些图片的名称和其他一般资源图片名称不一样. 为了方便举例子,咱们先简单粗暴点 假设当前项目只支持iPhone设备,并且只支持竖屏:而

gallery左右滑动时图片淡入淡出

前几天,公司项目有一个功能要做成滑动图片的淡入淡出,要一边滑动一边改变,所以ViewFlipper左右滑动效果就不能了.网上找了很久,也找不到资料,所以自己写了一个,通过滑动改变imageView的透明度.当按下图片时,先记下imageView的位置,图片滑动时,位置发生变化,就可以算出移动的距离,从而可以算出alpha的值.当图片向左滑动时,设置imageView的Alpha即imageView.setAlpha(255-alpha),设置下一个nextView的Alpha即nextView.

IOS 获取网络图片的大小 改变 图片色值 灰度什么的方法集合

第一.复制对象的基本概念 复制一个对象为副本,开辟一块新的内存来存储副本对象. 第二.如果一个对象想具备复制的功能,必须实现<NSCopying>协议和<NSMutableCopying>协议 NSObject自带的常用的对象有:NSNumber.NSString.NSArray.NSDictionary.NSMutableArray.NSMutableDictionay.NSMutableString,copy产生的对象时不可变的,mutableCopy产生的对象时可变的 第三.