从另一个对象调用时 UIImage 不更新

Posted

技术标签:

【中文标题】从另一个对象调用时 UIImage 不更新【英文标题】:UIImage not updating when called from another object 【发布时间】:2012-02-16 17:46:36 【问题描述】:

我有一个 UIImageView,它有一个方法来改变它显示的图像。如果该方法是从 UIImageView 本身接收到的触摸事件触发的,则它可以正常工作,但是如果从另一个触发触摸事件的对象调用相同的方法,则无法更新 UIImageView。我在有问题的方法中有一个 NSLog 调用,因此可以看到,在这两种情况下都调用了该方法。但只有在一种情况下,我才能看到图像的实际变化,而在另一种情况下,视图没有更新。 当它工作时,我不需要 setNeedsDisplay 或 setNeedsLayout,但这就是我试图解决问题的方法。在 UIImageView 及其父视图中设置 needsDisplay 和 needsLayout。无济于事。我可以看到,如果我旋转设备会导致刷新并且我看到 UIImageView 确实发生了变化,那么图像实际上已经改变了。

superview 使用 makeObjectsPerformSelector:withObject: 在 OutletCollection 上调用方法 eventAtLocation:

在我看来,这确实是一个令人尴尬的错误,但几个小时以来我都想不通。我没有想法可以尝试什么:-(

这是有问题的代码:

- (void)eventAtLocation:(NSValue *)location

    CGPoint loc = [self.superview convertPoint:[location CGPointValue] toView:self];
    if ([self pointInside:loc withEvent:nil]) 
        if (!self.isAnimating) 
            [self autoSwapImage];
        
    
    else
        if (self.isAnimating) 
            [self cancelAnimation];
        
    


- (void)cancelAnimation

    self.isAnimating = NO;
    [NSObject cancelPreviousPerformRequestsWithTarget:self];


- (void) swapImage

    currentImage++;
    if (currentImage > numberOfImages)
        currentImage = 1;

    NSLog(@"set image to %i", currentImage);
    self.image = [UIImage imageNamed:[NSString stringWithFormat:@"img_%i.jpg", currentImage]];
    [self setNeedsDisplay];


- (void) autoSwapImage

    self.isAnimating = YES;
    [self swapImage];
    [self performSelector:@selector(autoSwapImage) withObject:self afterDelay:0.1];

// 下面的工作,但如果 eventAtLocation: 被称为 superview swapImage 被调用(-> NSLog 输出出现),但视图没有更新 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event //[自autoSwapImage];

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

    //[NSObject cancelPreviousPerformRequestsWithTarget:self];

@end

【问题讨论】:

【参考方案1】:

看起来你实际上并没有设置 UIImageView 的图像,你只是在设置 self.image。你需要做类似的事情

self.myImageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"img_%i.jpg", currentImage]];

您还需要检查 [UIImage imageNamed:] 实际上是在返回一个图像,并且它不是 nil。

UIImage* image = [UIImage imageNamed:@"someImage"];
if(!image)
  NSLog(@"%@",@"Image Not Found");

【讨论】:

对不起,我没有说清楚,我发布的代码是在 UIImageView 的子类中,所以 self.image 应该设置那个 UIImageView 的 image 属性,不是吗?跨度> 抱歉点击返回换行并错误地发送了评论... ...现在我不知道如何测试您的建议,因为 UIImageView 是此类中的“自我”,当然,它没有 UIImageView 属性......如果我从这个类中调用它,它也可以工作。如果我随后旋转强制重绘的设备,我可以看到图像确实发生了变化。所以这只是 UIImageView 没有更新的问题。除了 setNeedsDisplay 之外必须有其他东西来强制重绘。 你是否偶然覆盖了 setImage 或 drawRect? 嗯,您的实现有点令人困惑。你能发布你的 superView 的 eventAtLocation 吗?此外,您可能想在您的子类中尝试 [super setImage:yourImage] 看看是否有所作为。 哦!现在我找到了罪魁祸首!正如你提到的覆盖......不应该在 UIImageView 的子类中使用 isAnimating。如果此属性设置为 true,则忽略更新。谢谢你的帮助

以上是关于从另一个对象调用时 UIImage 不更新的主要内容,如果未能解决你的问题,请参考以下文章

当我从另一个类调用数组时,数组不会更新

从另一个屏幕调用函数时 useState 数组未更新

一旦从另一个线程获得结果,如何更新领域对象?

在运行时更改 UIImage 渲染模式

从另一个线程更新 excel 电子表格

应用启动时加载用户配置文件,选择视图时崩溃,将 PFFile 转换为 UIImage