iOS 7 TableView中ViewController和NavigationBar的模糊效果
我开始在故事板中使用TableViewController在应用程序中构buildTableView。 当你这样做的时候,当你向下滚动你的列表时,你会有非常酷的效果:在导航栏后面移动的单元格变得模糊。
一段时间后,我不得不从这个TableViewController移动到一个带有TableView的ViewController(我不得不在表格底部添加其他视图)。
为了避免将第一个单元格隐藏在导航栏上(在其上方),我在顶部和底部布局指南以及视图的左侧和右侧边缘添加了约束条件。
这工作正常,但我失去了冷静模糊的滚动效果:单元格似乎是消失之前,导航栏后面。
我已经看到人们不使用约束并在界面构build器中添加幻数的解决方法。 我不能这样做,首先是因为我不喜欢它,其次是因为我必须与iOS 6兼容。
我错过了什么,能够从模糊的导航栏效果再次受益?
您必须手动调整表视图的contentInset
,并确保表视图框的原点为0,0。这样,表视图将在导航栏下方,但内容和滚动视图之间会有一些空白边缘(内容下移)。
我build议你使用视图控制器的topLayoutGuide
属性来设置正确的contentInsets
,而不是硬编码64(状态栏+导航栏)。 还有bottomLayoutGuide
,在UITapBar
的情况下你应该使用它。
这里是一些示例代码( viewDidLoad
应该没问题):
// Set edge insets CGFloat topLayoutGuide = self.topLayoutGuide.length; tableView.contentInset = UIEdgeInsetsMake(topLayoutGuide, 0, 0, 0);
顺便说一下, UIViewController
这个属性可能会帮助你(你不需要改变它们的默认值,但是我不知道你的视图层次是什么):
-
automaticallyAdjustsScrollViewInsets
-
edgesForExtendedLayout
-
extendedLayoutIncludesOpaqueBars
tableView需要全屏。 这是在顶部和底部的酒吧。 请注意,不要使用顶部和底部布局指南,因为它们用于相对于不在下方的钢筋进行定位。
然后你需要手动设置tableview的内容。 这将初始滚动位置设置在顶部栏下方。
就像是:
CGSize statusBarSize = [[UIApplication sharedApplication] statusBarFrame].size; CGFloat h=MIN(statusBarSize.width, statusBarSize.height); UIEdgeInsets e = UIEdgeInsetsMake(self.navigationController.navigationBar.bounds.size.height + h, 0.0f, 0.0f, 0.0f); self.tableView.contentInset = e;
当使用tableView控制器和“自动调整内容插入”设置时,不会获得此function
您的tableView
的坐标可能没有设置为(0, 0)
以映射到viewController.view.frame
或viewController.view.bounds
。 如果你已经这样做,尝试设置
self.navigationController.navigationBar.translucent = YES;
UIViewController属性edgesForExtendedLayout
做到这一点。 如果您正在使用故事板,请确保Extended Edges Under Top Bars
处于打开状态(并且是默认情况下)。 如果您以编程方式创build视图控制器,请尝试以下操作:
- (void)viewDidLoad { [super viewDidLoad]; self.edgesForExtendedLayout = UIRectEdgeAll; }
当然,你的表视图需要有适当的自动调整掩码/布局约束
edgesForExtendedLayout不是你想要的,因为这将限制导航栏下的表格视图。 在iOS 7中,视图控制器默认情况下使用全屏,并且控制tableview内容启动的属性是自动调整ScrollViewInsets。 这应该是默认情况下,所以检查是否设置为否,或尝试明确设置。
检查这个答案是如何工作的一个很好的解释: https : //stackoverflow.com/a/19585104/1485715