【问题标题】:How to shift all the views down except for the tab bar in tabViewController?除了表格视图控制器中的标签栏,如何向下移动所有视图?
【发布时间】:2015-08-15 22:21:44
【问题描述】:

为了修复 iOS 7+ 中状态栏和导航栏的重叠问题,我在 didFinishLaunchingWithOptions 中使用了这段代码 AppDelegate.m :

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    //some codes
    //.
    //.

    if([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
    {
        UIView *FakeNavBar = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 20)];
        FakeNavBar.backgroundColor = UIColorFromRGB(0x55BCAFF);

        float navBarHeight = 20.0;
        for (UIView *subView in self.window.subviews) {

            if ([subView isKindOfClass:[UIScrollView class]]) {
                subView.frame = CGRectMake(subView.frame.origin.x, subView.frame.origin.y + navBarHeight, subView.frame.size.width, subView.frame.size.height - navBarHeight);
            } else {
                subView.frame = CGRectMake(subView.frame.origin.x, subView.frame.origin.y + navBarHeight, subView.frame.size.width, subView.frame.size.height);
            }
        }
        [self.window addSubview:FakeNavBar];
    }
}

它将我所有的控制器和视图向下推 20 像素,并且重叠问题得到修复,但是当我到达我的选项卡视图控制器场景时,底部的选项卡栏会消失 20 像素。

那么如何在将其他所有内容向下移动的同时将标签栏保持在原位?

如果我只能将标签栏向上移动 20 像素,它也可以工作。

【问题讨论】:

    标签: ios objective-c uitabbarcontroller uinavigationbar


    【解决方案1】:

    我假设您没有使用导航控制器,并且您已经在视图中手动添加了导航栏。对吗?

    您应该能够通过在情节提要中视图控制器的视图顶部添加一个状态栏大小的视图来实现您的目标。

    您是否使用自动布局约束?您可以使用它们使这些视图粘在视图的顶部,具有 20 像素的固定高度和等于视图控制器视图宽度的宽度。

    【讨论】:

      【解决方案2】:

      我只能将标签栏向上移动 20 像素,但这可能会将一些视图放在标签栏后面,这是不需要的。

      这是写在我的 UITabBarController 类的viewDidAppear 中的代码:

      -(void)viewDidAppear:(BOOL)animated{
          CGRect newFrame = self.tabBar.frame;
          newFrame.origin.y -= 20;
          self.tabBar.frame = newFrame;
      }
      

      【讨论】:

        【解决方案3】:

        请使用下面的代码-

        if([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
            {
                UIView *FakeNavBar = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 20)];
                FakeNavBar.backgroundColor = UIColorFromRGB(0x55BCAFF);
        
                float navBarHeight = 20.0;
                for (UIView *subView in self.window.subviews) {
        
                    for (int index=0; index<[tabBarController.viewControllers count]; index++)
                    {
        
                         if ([subView isKindOfClass:[[(UIViewController*)[tabBarController.viewControllers objectAtIndex:index] view] class]])
                         {
                             continue;
                         }
                    }
        
                    if ([subView isKindOfClass:[UIScrollView class]]) {
                        subView.frame = CGRectMake(subView.frame.origin.x, subView.frame.origin.y + navBarHeight, subView.frame.size.width, subView.frame.size.height - navBarHeight);
                    } else {
                        subView.frame = CGRectMake(subView.frame.origin.x, subView.frame.origin.y + navBarHeight, subView.frame.size.width, subView.frame.size.height);
                    }
                }
                [self.window addSubview:FakeNavBar];
            }
        

        【讨论】:

        • 这是否在 AppDelegate.m 中的相同 didFinishLaunchingWithOptions 中实现?因为编译器无法识别tabBarController。
        • 那么我应该用什么替换 tabBarController 呢?它不被编译器识别?我应该用我的 TabBarController 类的实例替换吗?
        • 你是从 storyboard 添加 tabBarController 吗?是的然后尝试这种方式 UITabBarController * tabBarController = (UITabBarController *)self.window.rootViewController;
        • 是的,它是从情节提要中添加的,它不是我的 rootViewController。
        • 那么您是如何以及在何处添加了 UITabBarController 的?尝试创建该 Tabbarcontroler 的出口
        猜你喜欢
        • 2011-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-24
        相关资源
        最近更新 更多