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)];
当状态栏不是hidden
时self.view.frame
给你错误的x
和y
【讨论】:
如果你看一下我贴的代码,你会发现框架和那个一模一样。 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 背景大小问题的主要内容,如果未能解决你的问题,请参考以下文章