【问题标题】:iOS 7 Custom TableView Is Under TabBariOS 7 自定义 TableView 在 TabBar 下
【发布时间】:2013-10-11 00:05:21
【问题描述】:

我正在尝试将我的应用程序移植到iOS7,但我的自定义TableViewController 显示TabBar 下的最后一行(单元格):(

我正在寻找它,但我没有找到任何解决方案。谁能帮帮我?

My Custom Table View class

错误显示在截图中(仅显示上一个产品的一部分,因为我向上拖动以显示标签栏下的隐藏产品):

谢谢。

【问题讨论】:

    标签: ios objective-c uiview ios7 tableview


    【解决方案1】:

    我遇到了同样的问题并使用故事板解决了它。 在 Tab Bar Controller 中,转到属性检查器 Simulated Metrics,并将 Bottom Bar 设置为 Opaque Tab Bar。而已! 有关说明,请参见下图。

    Saudações! (您好!)

    【讨论】:

    • 不透明只是一种解决方法:不要使用它,它很难看。
    • 在我改成不透明标签栏后,我改回无,然后它仍然有效。
    • 你是英雄先生!
    【解决方案2】:

    我在另一篇由 dariaa 回答的帖子中找到了您问题的答案:

    Tab Bar covers TableView cells in iOS7

    它对我很有用。

    请不要相信我,因为我不是解决它的原始人。

    在您自定义的 TableViewController 中,在 [super viewDidLoad] 下添加这两行:

    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        self.edgesForExtendedLayout = UIRectEdgeAll;
        self.tableView.contentInset = UIEdgeInsetsMake(0., 0., CGRectGetHeight(self.tabBarController.tabBar.frame), 0); 
    } 
    

    【讨论】:

    • 谢谢,这解决了我的标签栏的问题。
    【解决方案3】:

    我的朋友们,我无法告诉你我在这方面的挣扎有多严重。故事板的任何一次重新配置都没有帮助过我。这个问题与原始帖子中的完全一样,我已经设法使用以下方法解决它:

    适用于 Swift 3

    self.edgesForExtendedLayout = []
    

    对于objective-c

    self.edgesForExtendedLayout = NO;
    

    【讨论】:

    • 难以置信,但这是我在标签栏下的视图问题的答案。
    【解决方案4】:

    viewDidLoad 中的 2 行,仅此而已!

    self.edgesForExtendedLayout = UIRectEdgeAll;
    self.tableview.contentInset = UIEdgeInsetsMake(0.0f, 0.0f, CGRectGetHeight(self.tabBarController.tabBar.frame), 0.0f);
    

    【讨论】:

    • UIRectEdgeAll 默认设置
    【解决方案5】:

    在 iOS 7 中,viewController 使用全高。有一个属性介绍为

    self.automaticallyAdjustsScrollViewInsets = NO;
    

    设置为否。然后检查,或者设置 UIEdgeInset 如果它后面没有设置。

    UIEdgeInsetsMake(top, left, bottom, right)
    

    看这里 https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/AppearanceCustomization.html

    编辑:也试试这个

    self.edgesForExtendedLayout = UIRectEdgeNone;
    

    【讨论】:

    • 我把它(如果你看到注释代码已经测试过)。但没有解决它:(
    【解决方案6】:

    这个问题的根本原因是automaticallyAdjustsScrollViewInsets只对VC的视图层次结构中的第一个滚动视图有效。 Apple 没有记录它,但它是 VC 检测需要修改的滚动视图的唯一方法,除非您使用的是 UITableViewController。

    因此,为了在不手动调整插图的情况下解决您的问题,请执行以下操作:

    1. 确保选中“调整滚动视图插图”。
    2. 确保 tableView 是视图层次结构中的第一个子视图。 (将其向上移动到所有其他元素之上)

    【讨论】:

    • 哇,这使得保持标签栏的半透明行为成为可能,并且仍然使滚动视图项目在其上方滚动。谢谢!
    【解决方案7】:

    UIViewController 有两个新属性可以帮助您:topLayoutGuidebottomLayoutGuide。它们返回您需要避免的父视图控制器控件的高度。在这种情况下,bottomLayoutGuide 将返回标签栏的偏移量。

    您的自定义视图控制器可能覆盖了一个方法,而不是调用 super 的实现,这将为您完成。我猜您正在安装 AutoLayout 约束或手动设置视图的框架以填充视图。您只需要将 [bottomLayoutGuide length] 中的值包含到您的布局计算中。如果您支持轮换,您应该更新 willAnimateRotationToInterfaceOrientation:duration: 中的值。

    【讨论】:

      【解决方案8】:

      UINavigationControllerUITabBarController 都有一个透明度标志,可以通过编程方式或在故事板中设置。

      UINavigationController 也有两个标志,用于控制内容是延伸到顶部栏还是底部栏之下。同样,您可以以编程方式或在情节提要中设置它们。这将适用于所有子视图。

      每个UIViewController 都可以在代码中设置自己的偏好。该属性名为edgesForExtendedLayout,您可以设置所有组合。

      使用这些属性将允许 AutoLayout 和 Springs'n'Struts 以您想要的方式调整视图,而不管设备如何。

      UIViewController 中有更多新属性,您会想看看。

      【讨论】:

        【解决方案9】:

        尝试以下方法:

         if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        
         self.edgesForExtendedLayout = UIRectEdgeBottom;
        

        【讨论】:

          【解决方案10】:

          我也遇到了同样的问题。一种解决方案是使工具栏半透明。操作方法如下:

          • 首先从文档查看器中选择工具栏 like here
          • 然后取消选中 半透明 like here

          希望这会有所帮助。

          谢谢。

          【讨论】:

            【解决方案11】:

            使用以下方法掩盖了问题:

            -(void)viewDidLayoutSubviews
            {
                [super viewDidLayoutSubviews];
                self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 112, 0);
            }
            

            但这并没有解决,因为在每个 iPhone 和每个应用程序表视图上,我在底部都有不同的空间。

            所以这是一个糟糕的解决方案。

            我不知道有什么办法解决。

            【讨论】:

              【解决方案12】:

              我现在解决了我的问题,将我的 BaseTableViewController 更改为从 UIViewController 继承到 UITableViewController。

              但是在 UIViewController 中使用 TableView 并没有解决 :(

              谢谢。

              【讨论】:

                【解决方案13】:

                也许不是一个正确的答案,也是出于这个原因,我发布了这个答案,所以你可以告诉我这个答案是否可能是一个可能的解决方案。

                就我而言,我喜欢半透明效果,所以我在表格中添加了页脚并修改了 scrollIndicators。

                - (void)viewDidLoad
                {
                    // Do any additional setup after loading the view.
                    [super viewDidLoad];
                    UIView *footer = [[UIView alloc]initWithFrame:CGRectMake(0, 0, self.agendaItemsTable.frame.size.width, self.tabBarController.tabBar.frame.size.height)];
                    self.agendaItemsTable.tableFooterView = footer;
                    self.agendaItemsTable.scrollIndicatorInsets = UIEdgeInsetsMake(0, 0, self.tabBarController.tabBar.frame.size.height, 0);
                
                }
                

                你怎么看?

                【讨论】:

                  【解决方案14】:

                  我遇到了同样的问题,但投票的答案并没有解决它。请参阅my answer 到类似的问题Tab Bar covers TableView cells in iOS7

                  我通过在表格视图控制器的viewWillAppear: 方法中手动将表格视图的框架设置为屏幕高度 -(状态栏高度 + 导航栏高度 + 标签栏高度)解决了这个问题。

                  - (void)viewWillAppear:(BOOL)animated
                  {
                      [super viewWillAppear:animated];
                  
                      // Adjust height of tableview (does not resize correctly in iOS 7)
                      CGRect tableViewFrame = self.tableView.frame;
                      tableViewFrame.size.height = [self heightForTableView];
                      self.tableView.frame = tableViewFrame;
                  }
                  
                  - (CGFloat)heightForTableView
                  {
                      return CGRectGetHeight([[UIScreen mainScreen] bounds]) -
                             (CGRectGetHeight([[UIApplication sharedApplication] statusBarFrame]) +
                              CGRectGetHeight(self.navigationController.navigationBar.frame) +
                              CGRectGetHeight(self.tabBarController.tabBar.frame));
                  }
                  

                  如果有人找到更好的解决这个问题的方法,请分享!

                  【讨论】:

                  • 您在这里的初学者使用 viewWillAppear 不正确。这是一个常见的错误。这应该在 viewWillLoad 中。每次视图出现时都会触发 viewWillAppear !您不希望每次出现视图时都会触发该方法中的视图设置代码。 viewWillAppear 中应仅包含更改的动态代码,例如动态更新的数据。如果它与数据更新相关,例如视图刷新,您可以调用视图逻辑。但是视图设置不应该进入 viewWillAppear。
                  • cocoanut:根据我的经验,某些视图的框架并不总是在 viewDidLoad 中设置,而是在 viewWillAppear 中设置,因此如果需要基于 viewDidLoad 计算几何图形,则会导致值不正确在笔尖上的意见。
                  • @Jeff 同意。我将这段代码放在viewWillAppear: 中,因为不能保证框架会设置在viewDidLoad 中。
                  【解决方案15】:

                  对于像 xarly 这样想要半透明效果的人,以及 Autolayout 解决方案(不设置框架),请在此处查看我的回答 https://stackoverflow.com/a/26419986/1158074

                  【讨论】:

                    【解决方案16】:

                    我在收藏视图中遇到了类似的问题。更改下面的集合视图框架和内容插图为我修复了它...

                        guard let cv = collectionView,
                            let tabBar = tabBarController?.tabBar else { return }
                    
                        // Resize collection view for tab bar
                        let adjustedFrame = CGRect(origin: cv.frame.origin,
                                                   size: CGSize(width: cv.frame.width, height: cv.frame.height - tabBar.frame.height))
                        cv.frame = adjustedFrame
                    
                        // Adjust content inset for tab bar
                        let adjustedContentInsets = UIEdgeInsetsMake(0, 0, tabBar.frame.height, 0)
                        cv.contentInset = adjustedContentInsets
                        cv.scrollIndicatorInsets = adjustedContentInsets
                    

                    祝你好运!

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2013-12-20
                      • 1970-01-01
                      • 1970-01-01
                      • 2023-03-24
                      • 2012-10-28
                      • 1970-01-01
                      相关资源
                      最近更新 更多