iOS/Objective-C:加载本地图片的ViewController显示空白页问题
问题:UIImageView加载本地图片但页面空白(调试确认图片已加载)
尝试打开一个包含UIImageView的ViewController,该UIImageView加载本地图片,但页面显示为空白。调试器显示UIImageView中有图片,且返回按钮可见,请问为何页面显示空白?
相关代码
- (void) openIMAGE:(NSIndexPath *) indexPath { NSString *filePath = [menuPath stringByAppendingPathComponent:contentsList[indexPath.row]]; UIViewController* imageViewController = [UIViewController new]; imageViewController.view.backgroundColor = [UIColor whiteColor]; //0,21,73,30 UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; [button addTarget:self action:@selector(backBtn:) forControlEvents:UIControlEventTouchUpInside]; [button setTitle:@"Back" forState:UIControlStateNormal]; [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; button.frame = CGRectMake(0.0, 21.0, 73.0, 30.0); UIImageView *imageView= [UIImageView new]; imageView.image = [UIImage imageWithContentsOfFile: filePath]; // UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y + 48.0, self.view.frame.size.width, self.view.frame.size.height - 48.0)]; [imageViewController.view addSubview:imageView]; [imageViewController.view addSubview:button]; [self.navigationController pushViewController:imageViewController animated:YES]; }
问题原因
核心问题是UIImageView没有设置frame或自动布局约束:
- 通过
[UIImageView new]创建的视图,默认frame是CGRectZero(位置和尺寸均为0),即便图片加载成功,也没有可见的显示区域,因此页面呈现空白。 - 返回按钮手动设置了
frame,所以能正常显示;调试器能看到图片存在,说明本地图片路径正确,加载逻辑无问题。
解决方案
方案1:手动设置Frame
给UIImageView指定显示位置和大小,比如填充按钮下方的整个屏幕区域:
UIImageView *imageView= [UIImageView new]; imageView.image = [UIImage imageWithContentsOfFile: filePath]; // 设置frame,避开按钮区域 CGRect viewFrame = imageViewController.view.frame; imageView.frame = CGRectMake(0, 48, viewFrame.size.width, viewFrame.size.height - 48); // 适配安全区域(可选) // CGRect safeFrame = imageViewController.view.safeAreaLayoutGuide.layoutFrame; // imageView.frame = CGRectMake(safeFrame.origin.x, safeFrame.origin.y + 48, safeFrame.size.width, safeFrame.size.height - 48);
方案2:使用Auto Layout约束(推荐)
自动布局能更好适配不同尺寸屏幕,需先关闭translatesAutoresizingMaskIntoConstraints,再添加约束:
UIImageView *imageView= [UIImageView new]; imageView.image = [UIImage imageWithContentsOfFile: filePath]; imageView.translatesAutoresizingMaskIntoConstraints = NO; // 必须添加,关闭自动转换约束 [imageViewController.view addSubview:imageView]; // 添加约束:让imageView在按钮下方,左右和底部贴合父视图 [NSLayoutConstraint activateConstraints:@[ [imageView.topAnchor constraintEqualToAnchor:button.bottomAnchor constant:8], [imageView.leadingAnchor constraintEqualToAnchor:imageViewController.view.leadingAnchor], [imageView.trailingAnchor constraintEqualToAnchor:imageViewController.view.trailingAnchor], [imageView.bottomAnchor constraintEqualToAnchor:imageViewController.view.bottomAnchor] ]];
额外建议:可给UIImageView设置contentMode优化显示效果,比如imageView.contentMode = UIViewContentModeScaleAspectFit;,避免图片变形。
内容的提问来源于stack exchange,提问作者ΩlostA
相关产品推荐
相关产品推荐

