【问题标题】:Removing image from UIImageView从 UIImageView 中删除图像
【发布时间】:2010-12-31 19:31:49
【问题描述】:

我根据用户交互加载带有图像的UIImageView。最初显示父视图时,没有选择任何图像,并且图像视图是黑色的。如果用户离开该视图并返回,图像仍然存在。我试过了

myImageView.image = nil;

离开视图但图像仍然存在。如何删除图像以使UIImageView 再次显示为黑色?

UIImageView

通过 IB 连接。

【问题讨论】:

    标签: iphone cocoa-touch uiimageview uiimage


    【解决方案1】:

    UIImageView 设置为:

    myImageView.image = nil 
    

    是清除UIImageView 的正确方法。当您的调用函数返回时,您是否正在加载图像?您的 UIImageView 是否被声明和/或在您的主函数的其他地方使用?

    【讨论】:

    • 由于某种原因,它现在正在工作。我不知道我做了什么不同的事情。谢谢。
    • 同意;这就是您清除图像的方式。最可能的原因是实际上没有调用 nil 赋值。
    【解决方案2】:

    我也遇到了同样的问题,不管我用myImageView.image = nil还是[myImageView setImage:nil],图片还是显示在UIImageView上;假设其中任何一个都可以工作。我花了很多时间来调试并找出问题所在。最后,我用下面的代码做到了,

            [UIView beginAnimations:nil context:nil];
            [UIView animateWithDuration:1 animations:nil];
            myImageView.image = nil;
            [UIView commitAnimations];
    

    我不知道为什么,但是当我作为动画工作时,图像可以完美清晰。

    【讨论】:

      【解决方案3】:

      我的 UIButton 上的 UIImageView 也有类似的问题,我使用

      设置了图像
      [button setImage:image forState:UIControlStateNormal];
      

      将其设置为 nil 会删除图像,但再次调用 getter 会重置图像。我修复了它:

      [button setImage:nil forState:UIControlStateNormal];
      

      而不是

      [button.imageView.image = nil];
      

      【讨论】:

        【解决方案4】:

        您可以使用UITapGestureRecognizer 来删除给定点击次数的图片。

        UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onImageTapped:)];
        
        tapGesture.delegate = self;
        
        tapGesture.numberOfTapsRequired = 2; // no. of taps (clicks) on which you want to remove the image
        
        [myImageView addGestureRecognizer:tapGesture];
        

        并给出方法的定义:

        - (void)onImageTapped:(UITapGestureRecognizer*)recognizer
        {
        
            UIImageView *imgView = (UIImageView*) recognizer.view;
            [imgView removeFromSuperview];
        }
        

        【讨论】:

          【解决方案5】:

          尝试在您的图像设置为零后声明[self.imageView setNeedsDisplay];。我相信这将在下一个 runloop 循环中触发该元素的重绘。 Aka 您将此视图标记为“脏”,需要重绘。

          【讨论】:

          • 没有得到足够的提升,因为我认为在这种情况下它是正确的。
          • 在将 nil 设置为 image 后,有时 ImageView 仍然缓存图像而不是 reDraw,所以这是现在最好的解决方案。谢谢