【发布时间】:2015-08-12 01:46:03
【问题描述】:
问题
考虑以下控制器层次结构:
-
UINavigationController-
UIViewControllerUITableViewController
-
UIViewController 的存在影响了布局。没有它,UITableViewController 会占据UINavigationController 的整个边界:
但是,如果我在UINavigationController 和UITableViewController 之间添加一个香草UIViewController,则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;
}
上面的仍然显示UIView的顶部和UITableView的顶部之间有20px的间隙。
我对问题的理解
我了解 something 错误地为状态栏分配空间。使用 Reveal 我可以看到UITableViewController 的Frame 的Y 值为20。
我尝试过的事情
不成功
- 在
UIViewController、UITableViewController和两者上将WantsFullScreenLayout设置为true - 在
UIViewController和UITableViewController中使用EdgesForExtendedLayout和ExtendedLayoutIncludesOpaqueBars - 在
UIViewController上使用AutomaticallyAdjustsScrollViewInsets - 在
UITableView中使用PreservesSuperviewLayoutMargins - 尝试在
UIViewController和UITableViewController中覆盖PrefersStatusBarHidden并返回true
成功
因此在我的UITableViewController 中覆盖ViewDidLayoutSubviews:
public override void ViewDidLayoutSubviews()
{
base.ViewDidLayoutSubviews();
this.View.Frame = this.View.Superview.Bounds;
}
我想知道的事情
- 有没有更干净(更好)的方式来实现我的目标?
- 实际上是什么负责添加 20px 间隙?
UIViewController?UITableViewController? - 确保我的视图控制器在不同的上下文中保持可用的最佳实践是什么?大概覆盖
ViewDidLayoutSubviews将我的视图控制器与预期将在可视树中显示的位置结合起来。如果它被托管在控制器堆栈的更高位置,事情看起来就不对了。有没有办法避免这种耦合,从而提高可重用性?
【问题讨论】:
-
确保你没有半透明的导航栏
-
还要确保您没有意外设置 tableview inset
-
@KingBabar:即使是最简单的重现也证明了这个问题。请参阅我更新的问题中的代码。我没有设置 任何东西 - 我只是在使用 vanilla 视图控制器。
-
@KingBabar:就像我说的,我使用的是代码,而不是故事板。请参阅我的问题。
-
啊!我使用 c#,但在“iOS 模式”下我是盲目的,我使用 swift 复制了它,所以我可以排除 xamarin 的问题。虽然我还没有找到解决方案/原因
标签: ios layout uiviewcontroller xamarin