UIViews结束在标签栏下方

在我的应用程序中,我使用自动布局将bottomLayoutGuide的标准量与标签alignment。 当应用程序第一次启动时,一切都按照我想要的方式布置,但是当我切换标签并返回标签已经消失在标签栏控制器下。

如果我旋转设备,横向视图正确显示,当我旋转回肖像视图恢复正常。 我似乎无法弄清楚是什么导致了这种行为。 谢谢你的帮助!

发生这种情况是由于iOS7中的一个错误,其中底部布局指南错误地设置为高度0而不是标签栏的高度。 当您旋转设备时,底部布局指南设置正确。

目前,您最好的select是禁用底部扩展布局:

- (UIRectEdge)edgesForExtendedLayout { return [super edgesForExtendedLayout] ^ UIRectEdgeBottom; } 

为从标签栏控制器显示的每个视图控制器执行此操作。 请记住设置标签栏视图控制器的背景颜色,以适合您的应用程序。

确保在https://bugreport.apple.com打开一个错误报告

再详细一点, viewDidLayoutSubviews在切换视图控制器时被调用两次。 第一次,一切都设置正确,但第二次底部布局指导高度为0.您可以从堆栈轨迹中看到,第一个来自标签栏布局,而第二个调用是从计划的CALayer布局,这是不正确的。

虽然Leo的答案显示了如何以编程的方式做到这一点,但是如果您想从界面构build器中执行此操作,请select您的视图控制器,并从“扩展边缘”部分中取消选中“底部条形图”

图片

调用setNeedsLayout是所有需要做的事情。 这基本上补丁框架的错误。 当select新视图时,需要在UITabBarController视图上调用它。 为应用程序的标签栏控制器创build一个委托。 并把它放在委托对象中:

 @interface MyPatch : NSObject <UITabBarControllerDelegate> @end @implementation MyPatch -(void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { [tabBarController.view setNeedsLayout]; } @end 

并把它初始化,无论你想要的是这样的东西:

 @interface AppDelegate : UIResponder <UIApplicationDelegate> { MyPatch *patch; } @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { patch=[MyPatch new]; myTabBarController.delegate=patch; } @end 

狮子座是正确的,bottomLayoutGuide返回不正确。 但是edgesForExtendedLayout 底部条扩展边 (或者覆盖edgesForExtendedLayout )对我的其他子视图有太多不希望的效果。

如果您只想根据底部布局指南更改一个视图的约束,请实现viewWillLayoutSubviews并检查bottomLayoutGuide属性的值,并根据需要调整该约束,如下所示:

 - (void)viewWillLayoutSubviews { [self adaptBottomLayoutGuides]; } /// Workaround for iOS7 bug returning wrong bottomLayoutGuide length if this is 1st tab in TabViewController - (void)adaptBottomLayoutGuides { NSLog(@"%f", self.bottomLayoutGuide.length); CGFloat expectedHeight = 123; CGFloat adaptedSpacing = expectedHeight - self.bottomLayoutGuide.length; self.viewBottomLayoutSpacingConstrain.constant = adaptedSpacing; }