UIView 背景大小问题

Posted

技术标签:

【中文标题】UIView 背景大小问题【英文标题】:UIView background sizing issue 【发布时间】:2013-05-26 13:41:05 【问题描述】:

我像往常一样将 UIImageView 添加到 UIViewController 的 UIView 中,图像视图的框架与 self.view 相同,以确保图像将覆盖整个视图。但是,状态栏和 imageView 之间有大约 20 像素的填充,我似乎无法摆脱。

我已经尝试 NSLogging 不同的帧,并收到以下结果:

 NSLog(@"ImageView => %@", NSStringFromCGRect([imageView frame]));
 NSLog(@"self.view => %@", NSStringFromCGRect(self.view.frame));
 NSLog(@"Screen Bounds => %@", NSStringFromCGRect([[UIScreen mainScreen] bounds]));
 NSLog(@"App window => %@", NSStringFromCGRect([[[[UIApplication sharedApplication] delegate] window] frame]));

[LaunchViewController.m: line 26] ImageView => 0, 0, 320, 548 
[LaunchViewController.m: line 27] self.view => 0, 0, 320, 548 
[LaunchViewController.m: line 28] Screen Bounds => 0, 0, 320, 568   
[LaunchViewController.m: line 29] App window => 0, 0, 320, 568

结果表明,图像视图实际上应该覆盖self.view,并且在其自身和状态栏之间根本没有填充。

UIViewController 是 UINavigationController 的根视图控制器,我已将导航栏设置为隐藏。我认为这可能是导致问题的原因,但是在删除 UINavigationController 并将其替换为 UIViewController 后,填充仍然存在。

有没有人对删除填充有任何建议/以前遇到过这个问题并有解决办法?

这是显示正在发生的事情的图像 - 绿色区域是 UIView (self.view),橙色区域是 UIImageView。

[self.navigationController setNavigationBarHidden:YES];
[self.view setBackgroundColor:[UIColor greenColor]];

UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.frame];
[imageView setImage:[UIImage imageNamed:@"Orange-568h@2x.png"]];
[self.view addSubview:imageView];

【问题讨论】:

您是在 viewDidLoad 还是 viewDidAppear 上执行此操作? -viewDidLoad - 在调用super之前。 尝试将其移动到 viewDidAppear,在 viewDidLoad 上,如果您使用的是 xib,则视图大小基于 xib 的视图。 至少尝试将您的 nslog 移动到 viewDidAppear。您应该检测到变化。 NSLogs 显示 mainScreen 和 self.view 的框架之间实际上存在 20px 的差异 【参考方案1】:

在您的应用委托中,在将视图控制器设置为根视图控制器之前将 FullScreenLayout 设置为 YES:

ViewController *vc = [[ViewController alloc] init];
[vc setWantsFullScreenLayout:YES];
[[self window] setRootViewController:vc];

或者你可以在 viewDidLoad 中设置

[self setWantsFullScreenLayout:YES];

关于 setWantsFullScreenLayout 的总结: 当视图控制器呈现其视图时,它通常会缩小该视图,使其框架不会与设备的状态栏重叠。将此属性设置为 YES 会导致视图控制器调整其视图的大小,以便它填满整个屏幕,包括状态栏下方的区域。 (当然,要做到这一点,托管视图控制器的窗口本身必须调整大小以填满整个屏幕,包括状态栏下方的区域。)如果您具有半透明状态,通常会将此属性设置为 YES栏并希望您的视图内容在该视图后面可见。来自here

希望这会有所帮助。

【讨论】:

【参考方案2】:

我遇到了同样的问题,解决了这个问题:

UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];

当状态栏不是hiddenself.view.frame给你错误的xy

【讨论】:

如果你看一下我贴的代码,你会发现框架和那个一模一样。 self.view.frame 在状态栏不隐藏时给你错误的x和y,试试看【参考方案3】:

查看您的self.view,它在下方 20 点,如状态栏所示。 因此,self.view.frame(0,20,w,h)

您的图像视图采用相同的矩形(0,20,w,h) 并将其添加到self.view。对于self.view,图像视图将其框架设置为在self.view 的“y”位置下方20 点。

尝试将self.view.bounds 设置为图像视图框架。

希望这会有所帮助!

【讨论】:

【参考方案4】:

试试 UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.bounds]; 不是。使用bounds 而不是frame

【讨论】:

尽量不要设置图像,而是设置 imageView 的 backgroundColour,这样您就可以确定您正在使用的框架。【参考方案5】:

viewDidLoad 方法中,您的 UIViewController 的 xib 已加载,并且未检测到您的用户界面的更新值。

如果您的 UIView 完全相同(没有 UINavigationBar、UITabbar、状态栏或设备 - iPhone 3.5 英寸/4 英寸变化),这不会造成任何问题。但是,如果您在此过程中更改任何内容,您可能会在 viewDidLoad 上得到错误值。

检查这一点的最简单方法是在 UI 更新后在 viewDidAppear 上调试屏幕和视图边界。

请检查您的 xib/故事板。您当前的 UI 和设计的界面之间存在变化。

要解决这个问题,您可以在 viewDidAppear 上使用函数 updateUI 并再次更新相关视图。

[self.imageView setFrame:self.view.frame]

这将解决它。

【讨论】:

我没有使用笔尖或情节提要。【参考方案6】:

尝试移动 [self.navigationController setNavigationBarHidden:YES];到

- (void) viewWillAppear: (BOOL) animated

    [super viewWillAppear: animated];    

    [self.navigationController setNavigationBarHidden: YES
                                             animated: NO];

【讨论】:

【参考方案7】:

将imageView添加到self.view时尝试将self.view.frame改为self.view.bounce。

UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.frame];

或者只使用 CGRectMake(0,0,320,568)

【讨论】:

恐怕它需要是动态的。该应用程序不仅会在 iPhone 5 上运行。 这是强制使用 CGRect,而不是解决方案。我相信OP可以自己解决所有问题。然而,他正在寻找为什么会发生这种情况 ***.com/questions/1054539/…

以上是关于UIView 背景大小问题的主要内容,如果未能解决你的问题,请参考以下文章

背景图片中UIView和UITableView不一致

使用动画更改 UIView 背景颜色

将相机胶卷图像导入 UIView 背景

Circle UIView调整大小,动画保持圆形

调整 UIView 的大小,但 drawRect 完成的绘图也会改变大小

如何在 XCODE 中将 UIView 水平分成三个大小均匀的子视图?