Autolayout игнорирует UITabBar (содержимое под панелью) на iOS7

Я установил UITabBar как непрозрачный в раскадровке, но я все еще, кажется, преувеличиваю. Когда я устанавливаю свой пользовательский UITabBarController с setBarStyle, доступен только OpaqueBlack.

Но это наименьшая проблема. Независимо от того, что я делаю, содержимое моего представления позиционируется под панелью вкладок, как будто оно игнорируется ayutolayout. На раскадровке все выглядит отлично. что-то запутывается во время выполнения?

О, самое главное. Проблема возникает только на iOS7!

Вот мои настройки ViewController в раскадровке:

enter image description here

И вот проблемный контент (UITableView), который позиционируется под UITabBar в приложении ios7. Выглядит отлично в раскадровке, хотя:

enter image description here

И, наконец, ограничения UITableView:

enter image description here

Ответ 1

Полагая это на viewDidLoad, решает проблему:

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

Ответ 2

xCode также предоставляет программные возможности:

[self setEdgesForExtendedLayout:UIRectEdgeNone];

в вашем раскадровке для данного ViewController через раздел Расширить края:

enter image description here

Просто отключите параметры Under Top Bars и Under bottom Bars. По умолчанию они включены.

Ответ 3

создайте эти macros в файле проекта <projectname>-Prefix.pch, чтобы они работали глобально:

#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];
}

Ответ 4

В Swift UIRectEdgeNone недоступно. Вы можете сделать то же самое со следующим кодом:

edgesForExtendedLayout = []