Ios UIView背景大小问题
我将像往常一样向UIViewController的UIView添加UIImageView,图像视图的框架与Ios UIView背景大小问题,ios,objective-c,uiview,uiimageview,Ios,Objective C,Uiview,Uiimageview,我将像往常一样向UIViewController的UIView添加UIImageView,图像视图的框架与self.view相同,以确保图像覆盖整个视图。然而,在状态栏和imageView之间有大约20px的填充,我似乎无法摆脱 我尝试记录不同的帧,并收到以下结果: NSLog(@"ImageView => %@", NSStringFromCGRect([imageView frame])); NSLog(@"self.view => %@", NSStringFromCGRe
self.view
相同,以确保图像覆盖整个视图。然而,在状态栏和imageView之间有大约20px的填充,我似乎无法摆脱
我尝试记录不同的帧,并收到以下结果:
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];
尝试UIImageView
*imageView=[[UIImageView alloc]initWithFrame:self.view.bounds]代码>isntead。当您将imageView添加到self.view中时,请使用bounds
而不是frame尝试将self.view.frame更改为self.view.bounce
UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.frame];
或者只需在viewDidLoad
方法上使用CGRectMake(0,0320568)即可加载UIViewController的xib,并且不会检测到有关用户界面的更新值
如果您的UIView完全相同(没有UINavigationBar、UITabbar、状态栏或设备-iPhone 3.5英寸/4英寸的更改),则不会出现问题。但是,如果您正在更改过程中的任何内容,则在viewDidLoad
上可能会得到错误的值
检查这一点的最简单方法是在UI更新后调试ViewDidDisplay上的屏幕和视图边界
请检查您的xib/故事板。您当前的UI和设计的界面之间有变化
要解决此问题,您可以在viewdide上使用函数updateUI
,然后再次更新相关视图
[self.imageView setFrame:self.view.frame]
这将解决它。我也遇到了同样的问题,它通过以下方法解决了:
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
self.view.frame
在状态栏未隐藏时给您错误的x
和y
尝试移动[self.navigationController setNavigationBarHidden:YES];到
- (void) viewWillAppear: (BOOL) animated
{
[super viewWillAppear: animated];
[self.navigationController setNavigationBarHidden: YES
animated: NO];
}
在应用程序代理中将FullScreenLayout设置为YES,然后将其设置为view controller根视图控制器:
ViewController *vc = [[ViewController alloc] init];
[vc setWantsFullScreenLayout:YES];
[[self window] setRootViewController:vc];
或者您可以在viewDidLoad中进行设置
[self setWantsFullScreenLayout:YES];
有关SetWantFullScreenLayout的摘要:
当视图控制器显示其视图时,它通常会收缩该视图,以便其帧不会与设备的状态栏重叠。将此属性设置为“是”会导致视图控制器调整其视图的大小,使其填充整个屏幕,包括状态栏下的区域。(当然,要实现这一点,承载视图控制器的窗口本身的大小必须能够填充整个屏幕,包括状态栏下方的区域。)如果您有半透明的状态栏,并且希望视图的内容在该视图后面可见,则通常会将此属性设置为“是”。从
希望这能有所帮助。查看您的自我。查看
,如状态栏所示,下面是20点。
因此,self.view.frame
是(0,20,w,h)
您的图像视图采用相同的矩形(0,20,w,h)
,并将其添加到self.view
。关于self.view
,图像视图将其帧设置为self.view
的“y”位置下方20点
尝试将self.view.bounds
设置为图像视图框
希望这有帮助 您是在viewDidLoad还是ViewDidDisplay上执行此操作?-viewDidLoad-在调用super之前。尝试将其移动到ViewDidDisplay,在viewDidLoad上,如果您使用的是xib,则视图大小基于xib的视图。至少尝试将nslog移动到ViewDidDisplay。你应该检测到一个变化。NSLogs显示,实际上主屏幕的框架和self.view之间有20像素的差异。恐怕它需要动态的。该应用程序将不仅在iPhone 5上运行。这是强制CGRect,而不是解决方案。我相信OP完全可以自己解决。然而,他正在寻找为什么会发生这种情况——不设置图像,而是设置imageView的背景色,这样你就可以确定你正在使用的框架。我没有使用笔尖或故事板。如果你看看我发布的代码,您会发现该帧与该帧完全相同。self.view.frame为您提供了错误的x和y当状态栏未隐藏时,请尝试并查看