在 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];
    }