我有一个带有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设置为全屏,除了收缩以确保它们不会低于导航栏和标签栏。
答案 0 :(得分:2)
这对我来说听起来不像是一个自动布局问题。在包含表视图的视图控制器中,在self.automaticallyAdjustsScrollViewInsets = YES;
中运行viewDidLoad
。
是否在导航控制器上按下了表视图控制器?那应该就是你需要做的一切。
如果没有,您需要阅读属性edgesForExtendedLayout
和topLayoutGuide
。如果您的视图控制器包含自己的导航栏,则需要覆盖后者。
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);