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 没有填满屏幕的主要内容,如果未能解决你的问题,请参考以下文章