問題描述
使用情節提要設置 GLKView 的初始大小 (Set an initial size of GLKView with storyboard)
I'm trying to set an initial size of GLKView (basically, I want it to be exactly the size of the screen, despite the presence of tabbar). Because I'm using storyboard, GLKView is created automatically within GLKViewController init method (not sure, it is not really documented, but I think so). In GLKViewController I have only viewDidLoad method, here it is:
- (void)viewDidLoad
{
[super viewDidLoad];
self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
if (!self.context) {
NSLog(@"Failed to create ES context");
}
GLKView *view = (GLKView *)self.view;
view.context = self.context;
}
So, if I don't use storyboard, I'd write something like this:
EAGLContext * context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
GLKView *view = [[GLKView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
view.context = context;
view.delegate = self;
GLKViewController * viewController = [[GLKViewController alloc] initWithNibName:nil bundle:nil];
viewController.view = view;
But when using storyboard, I don't have an opportunity to do this:
GLKView *view = [[GLKView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
I have tried to change the frame of the existing view, create a new GLKView and then assign it to viewController.view - with no result.
Is it maybe possible to set up or change the size of the GLKView in different method, etc.?
參考解法
方法 1:
Found the solution.
The first, we should change "Wants Full Screen" property for GLKViewController in storyboard to true. This will allow to conditionally hide status bar without resizing GLKView, like this:
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];
The second, we should change the frame of the tabbar's subview to fullscreen frame. It seems that this is only one working method to present something under the tab bar. This method should be placed in a TabViewController child class.
- (void)viewDidLoad
{
[super viewDidLoad];
CGRect tabbarFrame = CGRectZero;
for (UIView *view in self.view.subviews)
{
if ([view isKindOfClass:[UITabBar class]])
{
tabbarFrame = view.frame;
break;
}
}
for (UIView *view in self.view.subviews)
{
if (![view isKindOfClass:[UITabBar class]])
{
view.frame = CGRectMake(view.frame.origin.x, view.frame.origin.y,
view.frame.size.width, view.frame.size.height + tabbarFrame.size.height);
}
}
}
And again, this will allow to hide the tab bar when needed, with this short piece of code:
for (UIView *view in self.view.subviews)
{
if ([view isKindOfClass:[UITabBar class]])
{
[UIView animateWithDuration:0.4f
animations:^{
[view setAlpha:0.f];
}
completion:nil];
break;
}
}
(by dmirkitanov、dmirkitanov)