32

我正在尝试将我的应用程序移植到iOS7,但我的自定义TableViewController显示在TabBar:(

我搜索了很多,但我没有找到任何解决方案。谁能帮我?

我的自定义表格视图类

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

截屏

谢谢。

4

16 回答 16

35

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

萨达索斯!(问候!)

于 2013-10-08T12:32:04.867 回答
31

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

标签栏覆盖 iOS7 中的 TableView 单元格

它对我很有用。

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

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

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.edgesForExtendedLayout = UIRectEdgeAll;
    self.tableView.contentInset = UIEdgeInsetsMake(0., 0., CGRectGetHeight(self.tabBarController.tabBar.frame), 0); 
} 
于 2013-10-24T22:16:27.230 回答
10

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

快速 3

self.edgesForExtendedLayout = []

对于目标-c

self.edgesForExtendedLayout = NO;
于 2017-02-12T18:44:05.820 回答
8

2行viewDidLoad,就是这样!

self.edgesForExtendedLayout = UIRectEdgeAll;
self.tableview.contentInset = UIEdgeInsetsMake(0.0f, 0.0f, CGRectGetHeight(self.tabBarController.tabBar.frame), 0.0f);
于 2014-10-28T23:44:04.063 回答
6

在 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;
于 2013-10-04T05:24:00.483 回答
5

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

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

  1. 确保选中“调整滚动视图插图”。
  2. 确保 tableView 是视图层次结构中的第一个子视图。(将其向上移动到所有其他元素之上)
于 2015-09-08T11:31:25.820 回答
2

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

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

于 2013-10-08T15:28:49.790 回答
1

UINavigationController并且UITabBarController两者都有一个透明度标志,可以通过编程方式或在情节提要中设置。

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

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

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

还有更多的新属性UIViewController,你会想看看。

于 2013-10-05T05:58:19.737 回答
1

尝试以下操作:

 if ([self respondsToSelector:@selector(edgesForExtendedLayout)])

 self.edgesForExtendedLayout = UIRectEdgeBottom;
于 2015-10-14T05:08:49.177 回答
1

我有同样的问题。一种解决方案是使工具栏不是半透明的。这是如何做到的:

希望这可以帮助。

谢谢。

于 2016-09-09T21:57:03.790 回答
0

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

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

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

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

我不知道解决方法。

于 2013-10-05T04:50:51.727 回答
0

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

就我而言,我喜欢半透明效果,所以我在表格中添加了页脚,并修改了 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);

}

你怎么看?

于 2013-10-18T15:14:38.267 回答
0

我有同样的问题,投票的答案并没有解决它。请参阅对类似问题的回答,Tab Bar 涵盖了 iOS7 中的 TableView 单元格

我通过在表格视图控制器的方法中手动将表格视图的框架设置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));
}

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

于 2014-02-19T02:50:17.750 回答
0

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

于 2014-10-17T07:52:33.263 回答
0

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

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

谢谢。

于 2013-10-05T13:24:27.813 回答
0

我对集合视图有类似的问题。更改下面的集合视图框架和内容插图为我修复了它...

    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

祝你好运!

于 2018-04-29T03:08:34.590 回答