iOS 7中UITableView分区索引定位错误,顶部行隐藏在导航栏下面。

4
我有一个带有UITableView的应用程序,通过NSFetchedResultsController提供数据给它。表视图按字母顺序排序并由首字母分成多个部分。
在我的手机上升级到iOS 7后,我注意到选择器索引标题无法正常使用:
操作: 点击选择器索引标题“M”以滚动列表,查看以字母M开头的项目。
期望结果: 表格视图将滚动到M节的第一项,节标题保持可见。
实际结果: 表格视图滚动到M节的第二项,节标题不可见。第一项是存在的,但位于可见框的上面。
在iOS 6上,一切都正常。
另外,顶部行和底部行上方的橡胶条带效果也有一些奇怪的行为,通过'拉伸'橡皮筋,我可以看到第一行,但一旦我释放它,第一行又滚回屏幕之外。底部行亦然。
更新 这很可能是由于从Xcode 4.6自动布局迁移到Xcode 5自动布局导致的,我听说它们不兼容。也许有些约束出了问题?我仍在努力找到它的原因。
Interface Builder中的场景包含一个包含两个子视图的UIView - 两个UITableViews摆放在彼此之上。可通过顶部的UISegmentedControl在导航栏中切换两个视图之一。底部有一个标签栏。
我手动在IB中布置界面,使它们都全屏,这是单独完成的,即没有约束指定相同的宽度/高度等。我使用的约束为:无;Autolayout建议的约束;我还尝试过在两个tableview上制作contentInsets,如@duci9y所建议的那样。
导航栏设置为非透明,如@Popara所建议的那样。
结束语 如果我能理解如何将tableviews设置为全屏,以确保它们不会与导航栏和标签栏重叠,那将太好了。

检查一下你的TableView的Content Insets是否正确,请问它们是否出现了问题或有负值? - fguchelaar
不,我没有对contentInsets做任何操作,但是你让我想到了Autolayout这个方向,似乎比我的子类化更值得探究。 - Frost
你是如何设置表格视图的框架和约束条件的?并且你应用了哪些约束条件? - Wain
我已经更新了问题,提供了有关框架如何设置(手动在IB中)以及我尝试过哪些约束的信息。 - Frost
这个<a href="http://stackoverflow.com/questions/20345000/display-screen-for-ios6-and-ios7-in-simulator-is-different/20345195#20345195">帖子</a>可能对你有所帮助。看看问题和被接受的答案。 - AsifHabib
6个回答

2
这对我来说不像是一个自动布局问题。在包含表视图的视图控制器中,在viewDidLoad方法中运行self.automaticallyAdjustsScrollViewInsets = YES;
如果表视图控制器被推入导航控制器中,那么这就是你所需要做的一切。
如果不是,你需要了解属性edgesForExtendedLayouttopLayoutGuide。如果你的视图控制器包含自己的导航栏,后者是你需要覆盖的内容。 topLayoutGuide告诉你的视图控制器任何滚动视图应该具有多少顶部内容插入(这适用于表视图,因为它们继承自滚动视图)。自iOS7以来,由于表视图是半透明的,所以它会在导航栏后面(因为它是半透明的),因此它的顶部布局指南必须设置为刚好在导航栏下方。
如果你的视图层次结构更加复杂(表视图不是视图控制器视图的直接子视图),那么你可以手动设置内容插入。
tableView.contentInset = UIEdgeInsetsMake(CGRectGetMaxY(navigationBar.frame), 0, 0, 0);

这并没有完全解决问题(我无法将顶部插图对齐,只是差了状态栏的高度),但是它是最有帮助的且使我达到了最远的距离。 - Frost
是的,使用topLayoutGuide时状态栏会被考虑在内,但是手动操作时,您可以使用以下代码:CGRectGetMaxY(navigationBar.frame)。 - Accatyyc

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
}

1
将iOS 7中的表格视图框架向下移动20,尝试使用以下方法。

1
iOS 6和iOS 7中主要的UI差异在于iOS 7中状态栏包含在视图控制器中,这意味着你的视图控制器比iOS 6多20个像素。你需要调整你的项目。首先根据iOS 6设计你的项目,这是更好的方式,而且你必须有很多实践经验,现在为每个项目设置Δy为20。

或者按照iOS 7的设计来设计你的项目,并将Δy设置为-20。

请参阅帖子以获取更多详细信息。


0

是的,这是AutoLayout转换问题。

似乎表视图边界的定位不正确。

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

更可取的方法是设置您的导航栏不透明(可能通过外观代理)。另一种选择是在loadView或viewDidLoad中以某种方式偏移您的tableview以进行导航栏高度差。

祝你好运。


0
假设您的表视图位于导航控制器/选项卡控制器层次结构中的控制器中:
self.tableView.contentInset = UIEdgeInsetsMake(self.topLayoutGuide.length, 0, self.bottomLayoutGuide.length, 0);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接