0

我正在尝试设置 GLKView 的初始大小(基本上,我希望它与屏幕的大小完全相同,尽管存在标签栏)。因为我使用的是故事板,所以 GLKView 是在 GLKViewController init 方法中自动创建的(不确定,它没有真正记录,但我认为是这样)。在 GLKViewController 我只有 viewDidLoad 方法,这里是:

- (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;
}

所以,如果我不使用故事板,我会写这样的东西:

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;

但是在使用情节提要时,我没有机会这样做:

GLKView *view = [[GLKView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

我试图更改现有视图的框架,创建一个新的 GLKView,然后将其分配给 viewController.view - 没有结果。

是否有可能以不同的方法设置或更改 GLKView 的大小等?

4

1 回答 1

0

找到了解决方案。

首先,我们应该将情节提要中 GLKViewController 的“想要全屏”属性更改为 true。这将允许有条件地隐藏状态栏而不调整 GLKView 的大小,如下所示:

 [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];

第二,我们应该将标签栏的子视图的框架更改为全屏框架。似乎这只是在标签栏下呈现内容的一种工作方法。此方法应放置在 TabViewController 子类中。

- (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);
        }
    }
}

同样,这将允许在需要时隐藏标签栏,使用这段简短的代码:

for (UIView *view in self.view.subviews)
{
    if ([view isKindOfClass:[UITabBar class]])
    {
        [UIView animateWithDuration:0.4f
                         animations:^{
                            [view setAlpha:0.f];
                         }
                         completion:nil];
        break;
    }
}    
于 2012-06-02T15:16:00.043 回答