iOS 7自定义表格视图位于选项卡栏下
我正在尝试将我的应用程序移植到iOS 7自定义表格视图位于选项卡栏下,ios,objective-c,uiview,ios7,tableview,Ios,Objective C,Uiview,Ios7,Tableview,我正在尝试将我的应用程序移植到iOS7,但我的自定义TableViewController正在显示选项卡栏下的最后一行(单元格):( 我一直在寻找它,但我没有找到任何解决办法。有人能帮我吗 错误显示在屏幕截图中(仅显示上一个产品的一部分,因为我将拖动到up以在选项卡栏下显示隐藏的产品): 谢谢。在iOS 7中,viewController使用全高。引入了一个属性作为 self.automaticallyAdjustsScrollViewInsets = NO; 将其设置为“否”。然后检查,
iOS7
,但我的自定义TableViewController
正在显示选项卡栏下的最后一行(单元格):(
我一直在寻找它,但我没有找到任何解决办法。有人能帮我吗
错误显示在屏幕截图中(仅显示上一个产品的一部分,因为我将拖动到up以在选项卡栏下显示隐藏的产品):
谢谢。在iOS 7中,viewController使用全高。引入了一个属性作为
self.automaticallyAdjustsScrollViewInsets = NO;
将其设置为“否”。然后检查,如果未在其后面设置UIEdgeInset,则设置UIEdgeInset
UIEdgeInsetsMake(top, left, bottom, right)
看这里
编辑:也可以尝试此操作
self.edgesForExtendedLayout = UIRectEdgeNone;
使用以下方法掩盖了问题:
-(void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 112, 0);
}
但这并不能解决问题,因为在每个iPhone和每个应用程序tableview上,我的底部都有不同的空间
所以这是一个糟糕的解决方案
我不知道如何解决它。UINavigationController
和UITabBarController
都有一个透明标志,可以通过编程或在情节提要中设置
UINavigationController
还有两个标志,用于控制内容是否扩展到顶部或底部栏下。同样,您可以通过编程或在情节提要中设置它们。这将应用于所有子视图
每个UIViewController
都可以在代码中设置自己的首选项。该属性称为edgesForExtendedLayout
,您可以设置所有组合
使用这些属性将允许AutoLayout和Springs'n'Struts以您希望的方式调整视图,而不考虑设备
UIViewController
中还有很多新属性需要查看。我现在解决了问题,将我的BaseTableViewController更改为从UIViewController继承到UITableViewController
但在UIViewController中使用TableView并不能解决以下问题:(
谢谢。我遇到了同样的问题,并用情节提要解决了它。
在选项卡栏控制器,转到属性检查器,模拟度量,并将底部栏设置为不透明选项卡栏。就是这样!
有关说明,请参见下图。
Saudações!(问候!)UIViewController有两个新属性可以帮助您:topLayoutGuide
和bottomLayoutGuide
。它们返回您需要避免的父视图控制器控件的高度。在这种情况下,bottomLayoutGuide
将返回选项卡栏的偏移量
您的自定义视图控制器可能正在重写一个方法,而没有调用super
的实现,而这将为您完成。我猜您正在安装自动布局约束或手动设置视图框架以填充视图。您只需包含[bottomLayoutGuide length]中的值即可
到布局计算中。如果您支持旋转,您应该在WillAnimateRotationInterfaceOrientation:duration:
中更新该值,这可能不是一个正确的答案,也是出于这个原因,我发布了这个答案,以便您可以告诉我这个答案是否可能是一个可行的解决方案
在我的例子中,我喜欢半透明效果,因此我在表中添加了一个页脚,并修改了滚动指示器
- (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);
}
你觉得怎么样?我在另一篇由dariaa回答的帖子上找到了你问题的答案,这里:
这对我很有效
请不要相信我,因为我不是最初解决这个问题的人
在自定义TableViewController中,在[super viewDidLoad]下添加以下两行:
- (void)viewDidLoad
{
[super viewDidLoad];
self.edgesForExtendedLayout = UIRectEdgeAll;
self.tableView.contentInset = UIEdgeInsetsMake(0., 0., CGRectGetHeight(self.tabBarController.tabBar.frame), 0);
}
我也遇到了同样的问题,但投赞成票的答案并没有解决问题。请看一个类似的问题
我通过手动将表视图控制器的viewwilldisease:
method中的表视图框架设置为屏幕高度(状态栏高度+导航栏高度+选项卡栏高度)解决了这个问题
如果有人找到了更好的解决方案,请与大家分享!对于像xarly这样想要半透明效果的人,以及对于自动布局解决方案(不设置框架),请参阅我在这里的回答viewDidLoad
中的<2行,就这样
self.edgesForExtendedLayout = UIRectEdgeAll;
self.tableview.contentInset = UIEdgeInsetsMake(0.0f, 0.0f, CGRectGetHeight(self.tabBarController.tabBar.frame), 0.0f);
这个问题的根本原因是,自动调整滚动视图insets
仅对VC视图层次结构中的第一个滚动视图有效。苹果没有对此进行记录,但这是VC检测需要修改的滚动视图的唯一方法,除非您使用的是UITableViewController
因此,为了在不手动调整插图的情况下解决问题,请执行以下操作:
确保选中“调整滚动视图插入”
确保tableView是视图层次结构中的第一个子视图。
(将其向上移动到所有其他元素之上)
请尝试以下操作:
if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
self.edgesForExtendedLayout = UIRectEdgeBottom;
我也遇到了同样的问题。解决方法之一是使工具栏不半透明。以下是如何做到这一点:
- 首先从文档查看器中选择工具栏
- 然后取消选中半透明
希望这有帮助
谢谢。我的朋友们,我无法告诉你们我是多么的挣扎。没有一个故事板的重新配置对我没有任何帮助。这个问题与最初的帖子完全一样,我已经通过以下方式解决了它:
适用于swift 3
self.edgesForExtendedLayout = []
对于目标-c
self.edgesForExtendedLayout = NO;
我在集合视图中也遇到了类似的问题。更改集合视图框架和下面的内容插入为我修复了它
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
祝你好运!我把它放进去了(如果你看到有注释的代码,已经测试过了)。但是没有解决它:(谢谢,这解决了我的选项卡栏的问题。您在这里使用的ViewWillDisplay对于初学者来说是错误的。这是一个常见错误。这应该在viewWillLoad中进行。ViewWillDisplay在每次视图出现时都会触发!您不希望该方法中的视图设置代码在每次视图出现时都触发。只有动态代码才会更改。)
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