UIImageView 并不总是显示

Posted

技术标签:

【中文标题】UIImageView 并不总是显示【英文标题】:UIImageView is not always shown 【发布时间】:2013-09-09 08:33:01 【问题描述】:

我正在调试一个 imageView 不显示的问题。

imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:imageName]];
NSLog(@"imageView right after initialization is: %@", imageView);

imageView.frame = CGRectMake(2, 0, 316, 45);
imageView.layer.zPosition = zPos;
NSLog(@"imageView after running the setters: %@", imageView);

[self.view addSubview:imageView];

奇怪的是,有时会显示 imageView,有时则不会(大约 75% 的时间会显示)。

imageView 除了上面的代码外,在任何地方都不能访问。

我注意到当imageView没有显示时,第一条日志语句显示:

初始化后的imageView是:>

当图像视图显示时

imageView 初始化之后是:

编辑: 我进行了数十次测试,imageView 的行为始终相同:未显示时,初始帧为 (0 0; 0 0)。如果不是,则始终是其他值。

附:我没有使用 ARC。

【问题讨论】:

您在代码中使用 CGRectMake(2, 0, 316, 45) 设置框架,为什么在日志中显示 frame = (0 0; 644 88)? 以上代码在什么方法中?它在 viewDidLoad 中吗?这闻起来像一个自动布局问题... 您是否尝试过使用不同的图像名称运行相同的代码?你得到完全相同的结果吗?您是否测试过加载巨大的图像,非常小的图像?像这样的测试至少可以帮助隔离问题.. @Veelian,当框架尚未设置时,它在第一个日志语句中显示 frame = (0 0; 644 88)。 @DavidDoyle,是的,它在 viewDidLoad 中! 【参考方案1】:

在您的UIImageView 日志中显示frame = (0 0; 0 0); 这意味着视图不会显示,因为它的高度和宽度为0。这表明图像没有大小或者是nil

这很可能是因为找不到您尝试加载的图像: 您应该检查是否找到图像:

UIImage *image = [UIImage imageNamed:imageName];
if (!image) 
   NSLog(@"Image could not be found: %@", imageName);


imageView = [[UIImageView alloc] initWithImage:image];

意味着即使你改变了框架,你仍然看不到任何东西,因为没有加载图像。

【讨论】:

【参考方案2】:

为什么不先设置框架,然后设置图像?

 imageView = [UIImageView alloc]initWithFrame:CGRectMake(0,0,35,35)];
 [imageView setImage:[UIImage imageNamed:@"img.png"]];

【讨论】:

【参考方案3】:

除了rckoenesanswer,您必须始终首先检查图像是否存在于您的捆绑路径中:

NSFileManager *fileManager = [NSFileManager defaultManager];
    NSString *documentsDirectory 
        = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)
             objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:imageName];
    if([fileManager fileExistsAtPath:path])
    
       UIImage *image = [UIImage imageNamed:imageName];
       if (!image) 
          NSLog(@"Image could not be found: %@", imageName);
       

       imageView = [[UIImageView alloc] initWithImage:image];
     else 
       NSLog(@"%@ is not included in the app file bundle!", imageName);
    

这样你就会知道问题是 b/c 你一开始就没有文件。或者 b/c 文件有问题阻止 ios 加载它。

【讨论】:

UIImage imageNamed: 仅适用于应用程序包中的文件,不适用于文档目录中的文件。另外如果UIImage imageNamed:返回nil你可以只检查文件名看看有什么问题,不需要检查文件系统上的文件是否可用,

以上是关于UIImageView 并不总是显示的主要内容,如果未能解决你的问题,请参考以下文章

无法在 UIImageView 中显示 UIImage

UIImageView + UIImage vs CALayer + 内容效率

将大 UIImage 比例下载到 UIImageView

如何在 UIImageView 中显示 UIImage?

iPhone 编程:如何使 UIImageView 中的 UIImage 以实际大小显示?

UIImage 从 UIImageView 流出