使用导航栏和视图控制器的自动布局(iOS 7)

18

我目前正在将我的应用过渡到iOS 7(希望它仍然兼容iOS 6)。这个问题不涉及苹果NDA,它是关于自动布局的问题(似乎iOS 7强制使用自动布局(编辑:错了,它并没有强制要求))。

我有一个导航控制器和一个根视图控制器(显而易见)。在iOS 6中,我没有使用自动布局,因此根视图控制器位于导航栏下方。在iOS 7中,框架原点不包括导航栏,因此我的内容顶部部分被隐藏了...

您有想法如何使用自动布局使整个视图位于导航栏上方吗?

谢谢!


我可能错了,但如果苹果“强制”开发者在iOS7中使用自动布局,我会感到惊讶。这是确定的吗?(这个信息可能受到保密协议的限制!) - bennythemink
自动布局在iOS 7中不是被强制的,而是得到了改进。 - Adrian P
它是被强制的。文档中没有提到。在viewDidLoad和viewDidAppear之前检查框架值。我不使用IB但仍然值不同..这意味着什么?! - Kunal Balani
请访问以下链接了解有关iOS 7.5自动布局增强的影响的详细信息:http://www.mobilityeffect.com/mobility-effect-s/the-impact-of-ios-7-5-increased-emphasis-on-auto-layout - Kunal Balani
这并不是强制的。关闭它非常容易。与iOS 6相同,在“Identity Inspector”中取消选中“使用自动布局”。 - Matt Foley
1个回答

22

iOS 7中有一个名为topLayoutGuide的元素,用于指定导航栏位置。您可以指定表格视图(tableview)约束与顶部布局指南(topLayoutGuide)相连而不是与父视图相连。

这将帮助您确定它是否为iOS7:

if ([self respondsToSelector:@selector(topLayoutGuide)])

所以它可以是这样的

NSString *verticalConstraint = @"V:|[v]|";
NSMutableDictionary *views = [NSMutableDictionary new];
views[@"v"] = self.tableview;
if ([self respondsToSelector:@selector(topLayoutGuide)]) {
    views[@"topLayoutGuide"] = self.topLayoutGuide;
    verticalConstraint = @"V:[topLayoutGuide][v]|";
}
[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:verticalConstraint options:0 metrics:nil views:views]];
[self.view addConstraints:constraints];

1
为了在iOS 6上编译,self.topLayoutGuide需要是[self valueForKey:@"topLayoutGuide"](已在iOS 7 GM上测试)。 - Red Mak
@kschaeffler,您能解释一下@"V:[topLayoutGuide][v]|"的语法吗?我正在学习有关视觉格式语言的文章,但仍然有点困惑。我认为它是说垂直与topLayoutGuide相关,但是...编辑:闪光-灯泡亮起来不用了,我想我明白了。起始的V:表示您正在设置垂直布局,然后[object1] [object2]表示对象1和2紧贴在一起。只是不确定|的作用是什么。 - RonLugge
@RonLugge,你可以在苹果文档中找到有关视觉格式的所有信息 :) https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/Articles/formatLanguage.html - kschaeffler
3
根据转换指南,您可以在界面构建器中为toplayout guide设置约束条件。知道如何实现吗? - shim
3
@shim,你只能在故事板中完成这个操作,而不能在XIB中。非常烦人! - Morgz
显示剩余4条评论

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