ios cell展示可滑动的图片

需求:

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

ios cell展示可滑动的图片

点击图片实现效果:

ios cell展示可滑动的图片

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;

}

上一篇:Mysql的表级锁


下一篇:Kolmogorov–Smirnov test(KS)