UIViewController 没有填满屏幕

Posted

技术标签:

【中文标题】UIViewController 没有填满屏幕【英文标题】:UIViewController not filling screen 【发布时间】:2011-02-08 22:05:42 【问题描述】:

我有一个 UINavigationController 可以推动另一个 UIViewController。在这个 UIViewController 中,我将在纵向模式下显示一个 UITableView,在横向模式下显示另一个视图。

因此,在我的 viewDidLoad 中,我正在创建 UIView,然后向其中添加 2 个 ViewController。我的问题是,当它加载时,我在顶部得到以下白色边距。

我认为这是因为(在我下面的第 3 步中)

CGRect appFrame = [[UIScreen mainScreen] applicationFrame];
[[self view] setFrame:appFrame];

没有返回全屏,减去导航栏。这是正确的吗?如果是这样,我怎样才能让它返回完整尺寸,这样就没有白边了?

- (void)viewDidLoad 

    [super viewDidLoad];

    // Step 1 - Set up the tableDataView for vertical layout
TableDataViewController *tableController = [[TableDataViewController alloc] init];
self.tableDataViewController = tableController;
[tableController release];

// Step 2 - Set up the graphView for horizontal layout
GraphViewController *graphController = [[GraphViewController alloc] 
    initWithNibName:@"GraphViewController" bundle:nil];
self.graphViewController = graphController;
[graphController release];

// Step 3 - Get the screen size
CGRect appFrame = [[UIScreen mainScreen] applicationFrame];
[[self view] setFrame:appFrame];

// Step 4 - Add the vertical view to the containerView
//        and then add the containerView to this controller
containerView = [[[UIView alloc] initWithFrame:appFrame] autorelease]; 
[[self view] addSubview:containerView];                     
[containerView addSubview:[tableDataViewController view]];

// Step 5 - Add to the active view so we can test for it later
activeView = [tableDataViewController view];    
 

非常感谢

迈克

【问题讨论】:

【参考方案1】:

我认为您的帧偏移有问题。启用导航栏后,您在 appFrame 中获得的 rect 的 y 偏移量为 44.f(导航栏的高度) - 检查 NSLog 并查看是否属实。

因为您正在设置将放置在原点的视图框架,所以它应该将 x 和 y 原点设置为零。您可以通过检查以更安全的方式执行此操作

CGFloat navHeight = navController.navigationBarHidden ? 0 :
    navController.navigationBar.frame.size.height;

其实我认为使用 [UIScreen mainScreen] 的 bounds 属性可能是一个更好的整体解决方案。它会正确设置原点和大小,您不需要检查导航栏的存在。

检查发生了什么:

CGRect screenBounds = [[UIScreen mainScreen] bounds]
NSLog(@"%@", NSStringFromCGRect(screenBounds));
CGRect screenFrame = [[UIScreen mainScreen] applicationFrame]
NSLog(@"%@", NSStringFromCGRect(screenFrame));

【讨论】:

当我按照您上面的建议执行时,我得到以下信息:Screenbounds 0,0,320,480,Screenframe 0,20,320,460。所以理想情况下,我需要使用 [[UIScreen mainScreen] bounds] 来获得最大尺寸。但是,我这样做了,导航栏下方仍然有一个白边。就好像它完全无视它一样。迈克。 我一直在玩这个,它似乎完全忽略了我将 CGRect appFrame 设置为的内容。我刚刚做了 CGRectMake(0,0,20,20) 并没有区别。 tableController 和 graphController 以某种方式独立运行。【参考方案2】:

有几件事正在发生。最重要的是,frame 描述了视图的位置在其父视图的坐标系中

containerView 似乎被添加为自定义视图的子视图,其坐标系原点位于导航栏下方,而不是应用程序框架。

你想填充自定义视图,所以containerView的框架应该是这样的

CGRectMake(0.0, 0.0, self.view.bounds.width, self.view.bounds.height);

【讨论】:

以上是关于UIViewController 没有填满屏幕的主要内容,如果未能解决你的问题,请参考以下文章

具有自动布局的 UITableView 在横向模式下不会填满屏幕。为啥?

窗口没有填满整个屏幕

自定义视图没有填满屏幕?

怎么让电脑画面填满屏幕??

线性布局不会填满整个屏幕

如何使场景完全伸展到宽度。附上我的 Xcode 模拟器的屏幕截图,它没有填满屏幕