UITableView部分索引针对iOS 7中的错误单元格,导航栏下的顶行隐藏

时间:2013-11-20 20:06:52

标签: ios cocoa-touch uitableview ios7 autolayout

我有一个带有UITableView的应用程序,它通过NSFetchedResultsController提供数据。表视图按字母顺序排序,并按第一个字母分为几个部分。

在手机上升级到iOS 7时,我注意到部分索引标题无效:

动作: 点击部分索引标题“M”将列表滚动到以字母M开头的项目。

预期结果: 表视图滚动到M部分的第一项,部分标题仍然可见。

实际结果 表格视图滚动到M部分中的第二个项目,部分标题不可见。第一个项目存在,但就在可见框的上方。

在iOS 6上,它都按预期工作。

另一方面,顶行和底行下方的橡皮筋效果也有一个奇怪的行为,通过'拉伸'橡皮筋,我可以看到第一行,但是一旦我发布它,第一行再次滚动屏幕。同样适用于底行。

更新

这很可能是由于从Xcode 4.6自动布局迁移到Xcode 5自动布局引起的,我听说这是不兼容的。也许有些约束变坏了?我仍然在努力找到原因。

Interface Builder中的场景包含一个UIView,它包含两个子视图 - 两个UITableViews位于彼此之上。可见的两个视图中的哪一个通过导航栏顶部的UISegmentedControl切换。在底部有一个标签栏。

我已经在IB中手动布局界面,因此它们都是全屏的,这是单独完成的,即没有约束指定相同的宽度/高度等。我使用的约束是无; Autolayout建议的约束;我也尝试在两个tableviews上制作contentInsets,如@ duci9y所示。

根据@Popara的建议,导航栏设置为不透明。

结束记录

如果我能理解如何将tableviews设置为全屏,除了收缩以确保它们不会低于导航栏和标签栏。

6 个答案:

答案 0 :(得分:2)

这对我来说听起来不像是一个自动布局问题。在包含表视图的视图控制器中,在self.automaticallyAdjustsScrollViewInsets = YES;中运行viewDidLoad

是否在导航控制器上按下了表视图控制器?那应该就是你需要做的一切。

如果没有,您需要阅读属性edgesForExtendedLayouttopLayoutGuide。如果您的视图控制器包含自己的导航栏,则需要覆盖后者。

topLayoutGuide告诉您的视图控制器插入任何滚动视图应该有多少顶级内容(这适用于表视图,因为它们从滚动视图继承)。因为在iOS7上,您的表格视图位于导航栏后面(因为它是半透明的),其顶部布局指南必须设置在导航栏的下方。

如果视图层次结构更复杂(表视图不是视图控制器视图的直接子视图),则可以手动设置内容插入:

tableView.contentInset = UIEdgeInsetsMake(CGRectGetMaxY(navigationBar.frame), 0, 0, 0);

答案 1 :(得分:1)

在iOS 7中将您的tableview frame delta y设置为20

试试这个。

答案 2 :(得分:1)

在ios7 y轴从顶部开始它可能是导航栏是否存在 如果你想让你的y轴从导航栏下面开始(导航栏后y轴== 0)  你需要在-viwDidLoad方法中编写一些代码,如: -

- (void)viewDidLoad
{
    [super viewDidLoad];
    if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;
    //here your initilization for table and others starts
}

答案 3 :(得分:1)

iOS 6和iOS 7的主要UI差异在于iOS 7中的视图控制器中包含状态栏。这意味着您的视图控制器比iOS6大20 px。你必须调整你的项目。首先根据iOS 6设计您的项目,这是更好的方法,您必须做很多练习,现在将每个项目的Δy设置为20。

或者根据iOS 7设计您的项目并将Δy设置为-20

有关详细信息,请参阅此Post

答案 4 :(得分:0)

是的,这是AutoLayout过渡问题。

似乎表视图边界的定位是不对的。

在iOS7中,视图控制器位于导航栏下方,即共享相同的起始视点(0,0),因此第一个单元格被导航栏+节标题覆盖。

更优选的路径是设置导航栏不是半透明的(可能是通过外观代理)。 另一个选项,以某种方式在loadView或viewDidLoad中偏移导航栏高度增量的tableview。

祝你好运。

答案 5 :(得分:0)

假设您的表视图位于导航控制器/标签栏控制器层次结构中的控制器中:

self.tableView.contentInset = UIEdgeInsetsMake(self.topLayoutGuide.length, 0, self.bottomLayoutGuide.length, 0);