在 UICollectionView 中点击时如何将图像展开为完整视图?
How do I expand image to full view when being tapped in a UICollectionView?
在我的项目中,我使用 UICollectionView
来显示图像,我还在 UICollectionViewCell
中使用 UIImageView
。
我想要的只是当我点击一张图片时它应该展开并全屏显示。
为此,我创建了一个新视图,在其上使用 UIImageView
并在 UICollectionViewCells
上应用 TapGesture。
展开的图像在下一个视图中打开,但没有出现在我给它的框架中。
而且当我点击它从 collection 视图中删除的任何图片时。请告诉我如何重新加载 UICollectionViewCells
请建议我如何将图像放在规定的框架上。
我正在分享我的代码
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell=[collectionView dequeueReusableCellWithReuseIdentifier:@"cellIdentifier" forIndexPath:indexPath];
imgview = (UIImageView *)[cell viewWithTag:100];
imgview = [[UIImageView alloc]initWithFrame:CGRectMake(0,0,160, 160)];
imgview.image = [UIImage imageNamed:[imagearray objectAtIndex:indexPath.row]];
//cell.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:[imagearray objectAtIndex:indexPath.row]]];
[cell.contentView addSubview:imgview];
UITapGestureRecognizer *tapped = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(expandImage:)];
tapped.numberOfTapsRequired = 1;
[imgview setUserInteractionEnabled:YES];
imgview.tag = indexPath.row;
[imgview addGestureRecognizer:tapped];
[cell.contentView addSubview:imgview];
return cell;
}
-(void)expandImage:(UITapGestureRecognizer*)recogniser
{
UIView *view1 = [[UIView alloc]initWithFrame:CGRectMake(0, 50, self.view.frame.size.width , self.view.frame.size.height)];
view1.backgroundColor = [UIColor greenColor];
[self.view addSubview:view1];
UIButton *closeButton = [[UIButton alloc]initWithFrame:CGRectMake(310, 10, 50, 40)];
[closeButton setTitle:@"Close" forState:UIControlStateNormal];
[closeButton addTarget:self action:@selector(Closetab) forControlEvents:UIControlEventTouchUpInside];
[view1 addSubview:closeButton];
UIImageView *photoView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 70, self.view.frame.size.width, self.view.frame.size.height-200)];
[photoView setBackgroundColor:[UIColor blueColor]];
[view1 addSubview:photoView];
photoView.accessibilityIdentifier = @"nature2.png";
UIImageView *photoView1 = (UIImageView*)recogniser.view;
photoView1.accessibilityIdentifier = @"nature2.png";
//photoView.clipsToBounds = YES;
// photoView.accessibilityIdentifier = @"apple1.png";
photoView1.contentMode = UIViewContentModeScaleAspectFill;
//photoView1.clipsToBounds = YES;
[view1 addSubview:photoView1];
}
实现此目的的一种更简单的方法是推送到显示全屏图片的新视图,而不是将其添加为子视图。
您还可以根据需要自定义导航控制器的过渡动画。
好的,不要想当然,因为我可以肯定的是,查看该代码让我感到困惑。但这是我的看法,出了什么问题:
UIImageView *photoView1 = (UIImageView*)recogniser.view;
[view1 addSubview:photoView1];
通过这两行,您可以从单元格中取出视图并将其放入新视图 1 中。
所以只需分配新的 UIImageVIew 并设置其图像即可解决它。
还有一些建议:
imgview = (UIImageView *)[cell viewWithTag:100];
imgview = [[UIImageView alloc]initWithFrame:CGRectMake(0,0,160, 160)];
第一行代码没有做任何事情。您设置对象,然后再次设置该对象。
接下来的事情是不要在 cellForItemAtIndexPath 中添加子视图而不删除之前添加的。将单元格出队时,您会一遍又一遍地使用相同的单元格,因此您会通过将视图堆叠在一起来造成内存泄漏。您甚至可以通过使用自己的 UIImageView 创建自定义单元格来省略所有添加内容。接下来就不用手势识别了,CollectionView有这个delegate:
-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
你可以用它替换你的 expandImage 方法,在里面你只需简单地从 imagearray 获取你的图像。
最后还有这个漂亮的图书馆可供您使用,MHFacebookImageViewer。
因此最好在 window.so 中添加视图,它会完整显示 screen.Use 以下代码。
UIView *view1 = [[UIView alloc]initWithFrame:CGRectMake(0, 50, self.view.frame.size.width , self.view.frame.size.height)];
view1.backgroundColor = [UIColor greenColor];
[self.view.window addSubview:view1];
在 navigationController.view
上添加 imageview
UIImageView *imgView =[[UIImageView alloc]initWithFrame:self.view.bounds];
[self.navigationController.view addSubview:imgView];
我用这段代码完成了上面的工作
首先添加点击手势
然后应用以下代码
-(void)expandImage:(UITapGestureRecognizer*)recogniser
{
view1.hidden = NO;
UIImageView *photoView1 = (UIImageView*)recogniser.view;
photoView1.frame = CGRectMake(0, 0, self.view.frame.size.width, 510);
photoView1.accessibilityIdentifier = @"nature2.png";
//photoView.clipsToBounds = YES;
// photoView.accessibilityIdentifier = @"apple1.png";
photoView1.contentMode = UIViewContentModeScaleAspectFill;
photoView1.clipsToBounds = YES;
[view1 addSubview:photoView1];
}
在我的项目中,我使用 UICollectionView
来显示图像,我还在 UICollectionViewCell
中使用 UIImageView
。
我想要的只是当我点击一张图片时它应该展开并全屏显示。
为此,我创建了一个新视图,在其上使用 UIImageView
并在 UICollectionViewCells
上应用 TapGesture。
展开的图像在下一个视图中打开,但没有出现在我给它的框架中。
而且当我点击它从 collection 视图中删除的任何图片时。请告诉我如何重新加载 UICollectionViewCells
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell=[collectionView dequeueReusableCellWithReuseIdentifier:@"cellIdentifier" forIndexPath:indexPath];
imgview = (UIImageView *)[cell viewWithTag:100];
imgview = [[UIImageView alloc]initWithFrame:CGRectMake(0,0,160, 160)];
imgview.image = [UIImage imageNamed:[imagearray objectAtIndex:indexPath.row]];
//cell.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:[imagearray objectAtIndex:indexPath.row]]];
[cell.contentView addSubview:imgview];
UITapGestureRecognizer *tapped = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(expandImage:)];
tapped.numberOfTapsRequired = 1;
[imgview setUserInteractionEnabled:YES];
imgview.tag = indexPath.row;
[imgview addGestureRecognizer:tapped];
[cell.contentView addSubview:imgview];
return cell;
}
-(void)expandImage:(UITapGestureRecognizer*)recogniser
{
UIView *view1 = [[UIView alloc]initWithFrame:CGRectMake(0, 50, self.view.frame.size.width , self.view.frame.size.height)];
view1.backgroundColor = [UIColor greenColor];
[self.view addSubview:view1];
UIButton *closeButton = [[UIButton alloc]initWithFrame:CGRectMake(310, 10, 50, 40)];
[closeButton setTitle:@"Close" forState:UIControlStateNormal];
[closeButton addTarget:self action:@selector(Closetab) forControlEvents:UIControlEventTouchUpInside];
[view1 addSubview:closeButton];
UIImageView *photoView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 70, self.view.frame.size.width, self.view.frame.size.height-200)];
[photoView setBackgroundColor:[UIColor blueColor]];
[view1 addSubview:photoView];
photoView.accessibilityIdentifier = @"nature2.png";
UIImageView *photoView1 = (UIImageView*)recogniser.view;
photoView1.accessibilityIdentifier = @"nature2.png";
//photoView.clipsToBounds = YES;
// photoView.accessibilityIdentifier = @"apple1.png";
photoView1.contentMode = UIViewContentModeScaleAspectFill;
//photoView1.clipsToBounds = YES;
[view1 addSubview:photoView1];
}
实现此目的的一种更简单的方法是推送到显示全屏图片的新视图,而不是将其添加为子视图。
您还可以根据需要自定义导航控制器的过渡动画。
好的,不要想当然,因为我可以肯定的是,查看该代码让我感到困惑。但这是我的看法,出了什么问题:
UIImageView *photoView1 = (UIImageView*)recogniser.view;
[view1 addSubview:photoView1];
通过这两行,您可以从单元格中取出视图并将其放入新视图 1 中。 所以只需分配新的 UIImageVIew 并设置其图像即可解决它。 还有一些建议:
imgview = (UIImageView *)[cell viewWithTag:100];
imgview = [[UIImageView alloc]initWithFrame:CGRectMake(0,0,160, 160)];
第一行代码没有做任何事情。您设置对象,然后再次设置该对象。 接下来的事情是不要在 cellForItemAtIndexPath 中添加子视图而不删除之前添加的。将单元格出队时,您会一遍又一遍地使用相同的单元格,因此您会通过将视图堆叠在一起来造成内存泄漏。您甚至可以通过使用自己的 UIImageView 创建自定义单元格来省略所有添加内容。接下来就不用手势识别了,CollectionView有这个delegate:
-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
你可以用它替换你的 expandImage 方法,在里面你只需简单地从 imagearray 获取你的图像。 最后还有这个漂亮的图书馆可供您使用,MHFacebookImageViewer。
因此最好在 window.so 中添加视图,它会完整显示 screen.Use 以下代码。
UIView *view1 = [[UIView alloc]initWithFrame:CGRectMake(0, 50, self.view.frame.size.width , self.view.frame.size.height)];
view1.backgroundColor = [UIColor greenColor];
[self.view.window addSubview:view1];
在 navigationController.view
imageview
UIImageView *imgView =[[UIImageView alloc]initWithFrame:self.view.bounds];
[self.navigationController.view addSubview:imgView];
我用这段代码完成了上面的工作 首先添加点击手势 然后应用以下代码
-(void)expandImage:(UITapGestureRecognizer*)recogniser
{
view1.hidden = NO;
UIImageView *photoView1 = (UIImageView*)recogniser.view;
photoView1.frame = CGRectMake(0, 0, self.view.frame.size.width, 510);
photoView1.accessibilityIdentifier = @"nature2.png";
//photoView.clipsToBounds = YES;
// photoView.accessibilityIdentifier = @"apple1.png";
photoView1.contentMode = UIViewContentModeScaleAspectFill;
photoView1.clipsToBounds = YES;
[view1 addSubview:photoView1];
}