Проблема
Рассмотрим следующую иерархию контроллера:
-
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
связывает мой контроллер представления с ожиданиями относительно того, где он будет отображаться в визуальном дереве. Если бы он был размещен выше стека контроллера, все выглядело бы неправильно. Есть ли способ избежать этой связи и, следовательно, увеличить повторное использование?