iOS 7自定义TableView位于TabBar下

时间:2013-10-04 05:05:33

标签: ios objective-c uiview ios7 tableview

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

我正在寻找它,但我没有找到任何解决方案。任何人都可以帮助我吗?

My Custom Table View class

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

screenshot

感谢。

16 个答案:

答案 0 :(得分:34)

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

Saudações! (问候!)

答案 1 :(得分:29)

我在另一篇文章中找到了你的问题的答案,由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); 
} 

答案 2 :(得分:9)

我的朋友们,我不能告诉你我有多么糟糕。没有一个故事板的重新配置从来没有帮助过我。问题与原帖一样,我已设法使用以下方法解决问题:

for swift 3

self.edgesForExtendedLayout = []

for objective-c

self.edgesForExtendedLayout = NO;

答案 3 :(得分:8)

viewDidLoad中的2行,就是这样!

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

答案 4 :(得分: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;

答案 5 :(得分:5)

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

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

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

答案 6 :(得分:2)

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

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

中更新该值

答案 7 :(得分:1)

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

UINavigationController还有两个标志,用于控制内容是在顶部或底部栏下延伸。您可以再次以编程方式或在故事板中设置它们。这将适用于所有子视图。

每个UIViewController都可以在代码中设置自己的首选项。该属性称为edgesForExtendedLayout,您可以设置所有组合。

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

UIViewController中有很多新属性需要查看。

答案 8 :(得分:1)

尝试以下方法:

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

 self.edgesForExtendedLayout = UIRectEdgeBottom;

答案 9 :(得分:1)

我遇到了同样的问题。一个解决方案是使ToolBar 半透明。以下是如何做到这一点:

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

希望这有帮助。

感谢。

答案 10 :(得分:0)

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

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

但它没有解决,因为在每个iPhone和每个app tableview上我底部有不同的空间。

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

我不知道解决问题的方法。

答案 11 :(得分:0)

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

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

感谢。

答案 12 :(得分: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);

}

您怎么看?

答案 13 :(得分:0)

我遇到了同样的问题,而且投票的答案并没有解决。请参阅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));
}

如果有人找到更好的解决方案,请分享!

答案 14 :(得分:0)

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

答案 15 :(得分: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
祝你好运!