隐藏导航栏时,UIView不会调整为全屏。标签栏

时间:2009-07-10 14:59:44

标签: iphone iphone-sdk-3.0 uitextview

我的应用程序有一个标签栏&导航栏用于正常交互。我的一个屏幕是文本的很大一部分,所以我允许用户点击全屏(有点像Photos.app)。

导航栏&标签栏是隐藏的,我将文本视图的框架设置为全屏。问题是,标签栏曾经是大约50px的空白区域。你可以从这个屏幕截图中看到:

删除了死亡的ImageShack链接

我不确定是什么原因造成的。空白绝对不是文本视图背后的视图,因为我将它的背景颜色设置为红色只是为了确定。可能导致这种情况的原因是什么?

**更新**

我在UIWindow子类中做了一些命中测试,发现空白实际上是未记录/未发布的UILayoutContainerView。这是tabBar的父视图。我不认为建议直接操作此视图,那么如何隐藏标签栏?

**更新#2 **

我在&之前检查了self.view的框架。在动画之后,看起来父视图的大小不够。

全屏后,视图的框架只有411像素高。我已经尝试手动弄乱框架并且设置autoResizeMask没有运气。

****更新:这是最终结果****

- (void)toggleFullscreen {
    isFullScreen = !isFullScreen;  //ivar

    //hide status bar & navigation bar
    [[UIApplication sharedApplication] setStatusBarHidden:isFullScreen animated:YES];
    [self.navigationController setNavigationBarHidden:isFullScreen animated:YES];

    [UIView beginAnimations:@"fullscreen" context:nil];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:.3];

    //move tab bar up/down
    CGRect tabBarFrame = self.tabBarController.tabBar.frame;
    int tabBarHeight = tabBarFrame.size.height;
    int offset = isFullScreen ? tabBarHeight : -1 * tabBarHeight;
    int tabBarY = tabBarFrame.origin.y + offset;
    tabBarFrame.origin.y = tabBarY;
    self.tabBarController.tabBar.frame = tabBarFrame;

    //fade it in/out
    self.tabBarController.tabBar.alpha = isFullScreen ? 0 : 1;

    //resize webview to be full screen / normal
    [webView removeFromSuperview];
    if(isFullScreen) {
                //previousTabBarView is an ivar to hang on to the original view...
        previousTabBarView = self.tabBarController.view;
        [self.tabBarController.view addSubview:webView];

        webView.frame = [self getOrientationRect];  //checks orientation to provide the correct rect

    } else {
        [self.view addSubview:webView];
        self.tabBarController.view = previousTabBarView;
    }

    [UIView commitAnimations];
}

(请注意,我将textview切换为webview,但同样适用于原始文本视图)

15 个答案:

答案 0 :(得分:29)

我遇到了这个确切的问题,我分别在屏幕的底部和顶部设置了标签栏和导航栏的动画,在标签栏上留下了49px的高空白区域。

事实证明,我的新“全屏”视图实际上没有填充空间的原因是因为我将全屏视图添加为导航控制器视图的子视图,该视图本身是标签栏控制器的子视图。

为了解决这个问题,我只是添加了新的全屏视图(在你的情况下是带有所有文本的视图)作为UITabBarController视图的子视图。

[[[self tabBarController] view] addSubview:yourTextView];

然后您需要做的就是确保您的子视图的帧是480 x 320px并且它应该填满屏幕(包括以前神秘的空白区域)

答案 1 :(得分:5)

通过移动视图的框架,使标签栏不在屏幕上,你绝对可以做出看似正确的东西。我知道其他人提到尝试过这种情况,并且你说它不起作用,但我怀疑问题是当你尝试时你没有正确设置textviews resize mask。以下是应该有效的代码:

- (void)viewDidLoad {
  [super viewDidLoad];
  currentlyHidden = NO;
}

- (void) hideStuff {
  SO2AppDelegate *appDelegate = (id)[[UIApplication sharedApplication] delegate];
  self.navigationController.navigationBarHidden = YES;

  CGRect newFrame = appDelegate.tabBarController.view.frame;
  newFrame.size.height += appDelegate.tabBarController.tabBar.frame.size.height;
  appDelegate.tabBarController.view.frame = newFrame;
}

- (void) showStuff {
  SO2AppDelegate *appDelegate = (id)[[UIApplication sharedApplication] delegate];

  CGRect newFrame = appDelegate.tabBarController.view.frame;
  newFrame.size.height -= appDelegate.tabBarController.tabBar.frame.size.height;
  appDelegate.tabBarController.view.frame = newFrame;

  self.navigationController.navigationBarHidden = NO;
}

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {  
  if (currentlyHidden) {
    [self showStuff];
    currentlyHidden = NO;
  } else {
    [self hideStuff];
    currentlyHidden = YES;
  }
}

此外,由于这对您的笔尖等设置非常敏感,我posting是一个在线项目,所以您可以下载它并查看它。这是一个非常小的演示,只是一个基于导航的项目,其中委托设置一个选项卡控制器并从主笔尖嵌入视图控制器。其余的是在RootViewController的nib和类中。只要触摸开始,就会切换条形,因此只需点击屏幕即可。显然,在真实的应用程序中,您可能需要调整滚动视图,以便内容看起来不会跳跃。

答案 2 :(得分:3)

您是否已将视图控制器的hidesBottomBarWhenPushed属性设置为YES?您需要在initWithNibName:bundle:initWithCoder:方法中进行设置。当它被推送到导航控制器时,这应该隐藏标签栏并使内容视图向下延伸到底部。

答案 3 :(得分:2)

也许还有另一个视图是标签栏区域的内置部分?也就是说,还有一些隐藏的东西。这将有助于您了解哪些视图。

for (UIView *viewy in [self.navigationController.view subviews])
{
    NSLog([viewy description]);
}

答案 4 :(得分:2)

我发现如果你标记新视图,你将推进导航堆栈,只要它在堆栈上,就会隐藏标签栏。

scrollViewController.hidesBottomBarWhenPushed = YES;

答案 5 :(得分:1)

我相信问题是你仍然在标签栏控制器中,我也遇到了一些问题,最后为我的app控件委托创建了两个视图,标签栏控制器,以及一个单独的uiview,它包含标签栏控制器试图控制的任何内容。您可以将视图传递给应用程序委托并在那里使用它吗?

答案 6 :(得分:1)

尝试使TabBarControllers视图大于屏幕,以便在屏幕上隐藏标签栏,只要在设置新的ViewController之前执行此操作,然后其视图将调整大小以填充新框架!

在我的测试中,我使用了tabBarController:shouldSelectViewController:delegate方法来检查哪个视图控制器即将变为当前,并相应地设置TabBarController.view.frame。例如:

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
{
    if( viewController == second)
        tabBarController.view.frame = CGRectMake( 0, 20, 320, 500);
    else
        tabBarController.view.frame = CGRectMake( 0, 20, 320, 460);
}

如果这仍然不是您需要的,请尝试查看UIViewController的hidesBottomBarWhenPushed属性。设置为yes时,如果将Controller推入导航堆栈,则会使底栏隐藏。

答案 7 :(得分:1)

当您选择全屏时,我会将视图移动到窗口。 e.g。

myView = [self.view retain];
self.view = nil;
[window addSubview:myView];

然后回去:

[myView removeFromSuperView];
self.view = myView;
[myView release];
myView = nil;

通过将视图添加为窗口的子视图,它可以是完全全屏的,并且将位于选项卡栏的顶部。

然后,您可以将其与

结合使用
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRotate:) name:@"UIDeviceOrientationDidChangeNotification" object:nil];

检测旋转。 (我认为你将它与view.transform = CGAffineTransformMakeRotation结合使其旋转......?)

答案 8 :(得分:1)

我有类似的问题。正如Harry提到的那样,导航控制器是Tab Bar Controller内部控制器的原因。找到了另一种如何重绘视图并拥有正确框架的方法。在控制器中添加以下内容:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    // Here you can make your tabBarControlelr.view.hidde = true or use any animation that hides UITabBar. I made
    [TabBarController setTabBarHidden:YES];

    self.navigationController.view.frame = CGRectMake(self.navigationController.view.frame.origin.x, self.navigationController.view.frame.origin.y, self.navigationController.view.frame.size.width, self.navigationController.view.frame.size.height + 50);
    [self.navigationController.view setNeedsLayout];

 }

这就是我隐藏的方式。我可以直接调用TabBarControlelr的方法或类方法包装器:

+ (void)setTabBarHidden:(BOOL)hidden
{
    AppDelegate *delegate = [UIApplication sharedApplication].delegate;
    TabBarController *tabBarController = (TabBarController *) delegate.window.rootViewController;

    if ([tabBarController isKindOfClass:[TabBarController class]]) {
        [tabBarController setTabBarHidden:hidden];
    }
}


- (void)setTabBarHidden:(BOOL)hidden
{
    if (self.tabBar.hidden == hidden) {
        return;
    }

    if (hidden == NO) {
        self.tabBar.hidden = hidden;
    }

    [UIView animateWithDuration:0.15 animations:^{
        self.tabBar.frame = CGRectOffset(self.tabBar.frame, 0, ( hidden ? 50 : -50 ));
    } completion:^(BOOL finished) {
        self.tabBar.hidden = hidden;
    }];
}

答案 9 :(得分:0)

如果您使用的是Interface Builder,请确保在Size Inspector中正确设置了自动调整大小。 如果在代码中创建UITextView,请确保将框架设置得足够大,并且视图的父级(及其父级)也足够大。为简单起见,直接将视图添加到窗口,然后从那里向内移动。

将视图移动到其超级视图:

- (void)moveViewToSuperview:(UIView *)view
{
    UIView *newSuperview = [[view superview] superview];
    [view removeFromSuperview];
    [newSuperview addSubview:view];
    [newSuperview bringSubviewToFront:view];
}

答案 10 :(得分:0)

您是否尝试强制文本“重写”自身(重置您正在使用的任何对象的.text属性)?我有很多实例,其中视图根本不重新检查或重新绘制他们的数据,并且强制似乎是唯一的修复。如果从用户体验的角度来看这不是很好,您可以尝试在用户触摸之后,在它们消失之前使导航/标签栏透明。这通常会将视图扩展到屏幕的完整大小。

答案 11 :(得分:0)

如果由rootViewController(navigationController)推送UITabBarController。您可以尝试以下方法:

首先隐藏状态栏/标签栏;

[self.navigationController pushViewController:aBlankViewController animated:NO];
[self.navigationController popViewControllerAnimated:NO];

虽然在调整过程中屏幕会震动,但你应该可以收回白色空间......

答案 12 :(得分:0)

我遇到了类似的问题,这个讨论很有帮助:UIWebView on iPad size

Tony的回答帮助我发现,当您创建子视图时,设置与此类似的代码会很有帮助:

self.tabBarController.tabBar.frame = self.view.bounds;

答案 13 :(得分:0)

将代码放入这样的segue准备中,对我来说非常适合:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"ViewPhoto"]) {

    ImageView *vc = [segue destinationViewController];

    NSInteger selectedIndex = [[self.tableView indexPathForSelectedRow] row];

        NSString *Title = [photoNames objectAtIndex:selectedIndex];
        [vc setSelectedTitle:[NSString stringWithFormat:@"%@", Title]];

        vc.hidesBottomBarWhenPushed = YES;

        }
    }

答案 14 :(得分:-1)

将额外的空间amt添加到视图的维度,所以如果它是矩形CGRectMake(0,0,320,460)使它成为CGRectMake(0,0,320,480)......这发生在我身上,我不知道为什么,它可能与您将文本视图置于顶部的基础视图有关,但只是添加维度应该这样做