Проблема
Рассмотрим следующую иерархию контроллера:
-
UINavigationController-
UIViewController-
UITableViewController
-
-
Присутствие UIViewController влияет на макет. Без него UITableViewController занимает все границы UINavigationController:

Однако, если я добавлю ваниль UIViewController между UINavigationController и UITableViewController, между вершиной UIViewController и вершиной UITableViewController появится зазор 20px:

Даже если я уменьшу свой код до самой простой вещи, я все еще наблюдаю за этим поведением. Рассмотрим этот код делегирования приложения:
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
window = new UIWindow(UIScreen.MainScreen.Bounds);
var tableView = new UITableViewController();
var intermediateView = new UIViewController();
var navigation = new UINavigationController(intermediateView);
navigation.View.BackgroundColor = UIColor.Red;
intermediateView.View.BackgroundColor = UIColor.Green;
tableView.View.BackgroundColor = UIColor.Blue;
intermediateView.AddChildViewController(tableView);
intermediateView.View.AddSubview(tableView.View);
tableView.DidMoveToParentViewController(intermediateView);
window.RootViewController = navigation;
window.MakeKeyAndVisible();
return true;
}
Вышеприведенный выше показывает 20px зазор между вершиной UIView и вершиной UITableView.
Мое понимание проблемы
Я понимаю, что что-то ошибочно выделяет пространство для строки состояния. Используя Reveal, я вижу, что Frame для UITableViewController имеет значение Y 20.
Вещи, которые я пробовал
Неудачный
- Установите
WantsFullScreenLayoutвtrueнаUIViewController,UITableViewController, и оба - Игра с
EdgesForExtendedLayoutиExtendedLayoutIncludesOpaqueBarsдляUIViewControllerиUITableViewController - Играется с
AutomaticallyAdjustsScrollViewInsetsнаUIViewController - Играется с
PreservesSuperviewLayoutMarginsвUITableView - Исправлено переопределение
PrefersStatusBarHiddenи возвратtrueвUIViewControllerиUITableViewController
Успешные
Переопределение ViewDidLayoutSubviews в моем UITableViewController таким образом:
public override void ViewDidLayoutSubviews()
{
base.ViewDidLayoutSubviews();
this.View.Frame = this.View.Superview.Bounds;
}
Вещи, которые я хочу знать
- Есть ли чистый (er) способ достижения моей цели?
- что на самом деле отвечает за добавление 20px-пробелов?
UIViewController?UITableViewController? - Каковы наилучшие методы для обеспечения того, чтобы мои контроллеры отображались в разных контекстах? Предположительно переопределение
ViewDidLayoutSubviewsсвязывает мой контроллер представления с ожиданиями относительно того, где он будет отображаться в визуальном дереве. Если бы он был размещен выше стека контроллера, все выглядело бы неправильно. Есть ли способ избежать этой связи и, следовательно, увеличить повторное использование?