自动布局忽略iOS7上的UITabBar(栏下的内容)

Posted

技术标签:

【中文标题】自动布局忽略iOS7上的UITabBar(栏下的内容)【英文标题】:Autolayout ignores UITabBar (content under the bar) on iOS7 【发布时间】:2013-09-23 09:34:36 【问题描述】:

我在 Storyboard 中将 UITabBar 设置为不透明,但我似乎仍然是半透明的。当我使用setBarStyle 设置我的自定义 UITabBarController 时,只有 OpaqueBlack 可用。

但这是最小的问题。无论我做什么,我的视图内容都会位于标签栏下方,就像 ayutolayout 忽略它一样。在 Storyboard 上,一切看起来都很好。运行时出现问题?

哦,最重要的是。该问题仅出现在 ios7 上!

这是我在情节提要中的 ViewController 设置:

这是有问题的内容 (UITableView),它位于 ios7 应用程序的 UITabBar 下。不过在情节提要中看起来不错:

最后是 UITableView 约束:

【问题讨论】:

【参考方案1】:

把这个放在viewDidLoad上,问题就解决了:

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) 
    [self setEdgesForExtendedLayout:UIRectEdgeNone];

【讨论】:

是的,它对我来说工作正常。但我的应用程序有 Tabbacontroller alos。视图控制器的其余部分工作正常。 Tabbar 视图控制器中的问题。假设我有 5 个标签。 1. 当我单击选项卡(打开列表屏幕)时,当我单击列表详细信息打开正常时,它工作正常。直到它工作正常 2. 当我点击选项卡 2(另一个列表)时打开。那个时候,当我点击 tab1 时,比细节屏幕主视图框架减少到 64px。我试图强行增加但没有工作..在这种情况下我该怎么办?? 与其检查特定版本,不如检查选择器是否存在:if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)])【参考方案2】:

xCode 还提供了编程能力:

[self setEdgesForExtendedLayout:UIRectEdgeNone];

在给定 ViewController 的情节提要中,通过 Extend Edges 部分:

只需禁用 Under Top BarsUnder bottom Bars 选项。它们默认开启。

【讨论】:

【参考方案3】:

在项目的<projectname>-Prefix.pch 文件中创建这些macros,以便它们可以在全球范围内工作:

#define SYSTEM_VERSION_EQUAL_TO(v)                  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
#define SYSTEM_VERSION_GREATER_THAN(v)              ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v)     ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)

然后将这个放在[super viewDidLoad] 之后的viewDidLoad 方法中,每个viewController 都有这个问题:

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) 

        [self setEdgesForExtendedLayout:UIRectEdgeNone];

【讨论】:

与其检查特定版本,不如检查选择器是否存在:if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)])【参考方案4】:

在 Swift 中 UIRectEdgeNone 不可用。您可以使用以下代码实现相同的目的:

edgesForExtendedLayout = []

【讨论】:

以上是关于自动布局忽略iOS7上的UITabBar(栏下的内容)的主要内容,如果未能解决你的问题,请参考以下文章

导航栏下的 UICollectionView,但标签栏下没有

一段时间后,ios7 UINavigationBar 在状态栏下停止扩展

iOS7中的UITabBar徽章位置

ios7 忽略任何大小类

UITabBar 在第一次 setViewControllers 调用上的状态

在 iOS7 中移除 UITabBar 水平分隔符