iOS导航视图背景图像UIViewContentModeScaleAspectFill不起作用

Posted

技术标签:

【中文标题】iOS导航视图背景图像UIViewContentModeScaleAspectFill不起作用【英文标题】:iOS navigation view background image UIViewContentModeScaleAspectFill not working 【发布时间】:2016-03-31 14:12:00 【问题描述】:

使用下面的代码,我向 UINavigationController(视图,而不是导航栏)添加了背景图像,并且我正在尝试缩放图像以填充视图,因为我不知道用户的设备和方向。 (注意:我不想创建特定于设备或方向的尺寸/分辨率,因为我的背景图像可能会改变,所以这会花费太多时间。

- (void)viewDidLoad

    [super viewDidLoad];

    NSLog(@"%@", NSStringFromCGRect(self.navigationController.view.frame));

    // Set background image
    NSString *filename = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"assets/images/wallpaper.jpg"];
    self.background = [[UIImageView alloc] initWithImage:[UIImage imageWithContentsOfFile:filename]];
    self.background.contentMode = UIViewContentModeScaleAspectFill;
    self.background.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    self.background.center = CGPointMake(CGRectGetMidX(self.navigationController.view.frame), CGRectGetMidY(self.navigationController.view.frame));
    [self.navigationController.view insertSubview:self.background atIndex:0];

UIViewContentModeScaleAspectFill 和 UIViewAutoresizingFlexibleHeight/Width 旨在使图像缩放以填充屏幕,而不管屏幕大小和方向如何。但是,我需要关于模拟器的一个问题的帮助:ios 的行为会因模拟器是否以纵向/横向模式启动而有所不同。

下图显示了当应用以纵向模式启动然后旋转为横向时会发生什么。在纵向中,图像不会缩放以填充视图(图像上方/下方有黑条)。在横向中,图像会正确缩放以填充视图。

下图显示了当应用以横向启动然后旋转为纵向时会发生什么。在横向中,图像不会缩放以填充视图(图像两侧有黑条)。纵向时,图像会正确缩放以填满视图。

为什么 iOS 处理这两种情况的方式不同,为什么图像不能正确缩放以填充视图以及如何让 UIViewContentModeScaleAspectFill 正常工作?

【问题讨论】:

您没有设置UIImageView 的初始frame。试试self.background.frame = self.navigationController.view.bounds; 不要忘记在viewDidLayoutSubviews'方法中设置框架 汤姆,成功了,谢谢。我假设我不需要手动设置框架,因为这应该在 insertSubview:self.background 期间自动发生。 Nikita,谢谢你的建议,但不清楚我为什么需要这样做?我遵循了 Tom 的建议,现在它在两个方向以及旋转设备时都可以正常工作。 viewdidLayoutSubviews 还能做什么? 【参考方案1】:

将我的评论重新发布为答案,以便您将此问题标记为已解决。

您没有设置UIImageView 的初始frame。尝试类似

- (void)viewDidLoad

    [super viewDidLoad];

    ...

    self.background.frame = self.navigationController.view.bounds;
    [self.navigationController.view insertSubview:self.background atIndex:0];

【讨论】:

以上是关于iOS导航视图背景图像UIViewContentModeScaleAspectFill不起作用的主要内容,如果未能解决你的问题,请参考以下文章

更改导航栏背景图像导致视图向上移动

在选项卡式应用程序的导航视图中为表格添加背景图像

如何为特定视图的导航栏设置自定义背景图像

导航栏和视图的整个图像

弹出视图时不恢复自定义导航栏背景

背景图像/导航栏图像 iOS 的正确尺寸