在我的应用程序中,我使用自动布局将标签与 bottomLayoutGuide 的标准数量对齐。当应用程序第一次启动时,一切都按我想要的方式布置,但是当我切换标签并返回时,标签在标签栏控制器下消失了。
如果我旋转设备,横向视图会正确显示,当我将其旋转回纵向时,视图会恢复正常。我似乎无法弄清楚是什么导致了这种行为。谢谢你的帮助!
在我的应用程序中,我使用自动布局将标签与 bottomLayoutGuide 的标准数量对齐。当应用程序第一次启动时,一切都按我想要的方式布置,但是当我切换标签并返回时,标签在标签栏控制器下消失了。
如果我旋转设备,横向视图会正确显示,当我将其旋转回纵向时,视图会恢复正常。我似乎无法弄清楚是什么导致了这种行为。谢谢你的帮助!
发生这种情况是由于 iOS7 中的一个错误,其中底部布局指南错误地设置为高度 0 而不是标签栏的高度。旋转设备时,底部布局指南设置正确。
目前,您最好的选择是禁用底部扩展布局:
- (UIRectEdge)edgesForExtendedLayout
{
return [super edgesForExtendedLayout] ^ UIRectEdgeBottom;
}
对从标签栏控制器显示的每个视图控制器执行此操作。请记住将标签栏视图控制器的背景颜色设置为适合您的应用程序的任何颜色。
确保在https://bugreport.apple.com打开错误报告
更详细地说,它似乎viewDidLayoutSubviews
在切换视图控制器时被调用了两次。第一次,一切都设置正确,但第二次底部布局指南高度为0。从堆栈跟踪中可以看出,第一次来自标签栏布局,而第二次调用来自预定的CALayer布局,这是不正确的.
虽然 Leo 的回答显示了如何以编程方式执行此操作,但如果您想从界面构建器中执行此操作,请选择您的视图控制器并取消选中“扩展边缘”部分中的“底栏下方”:
只需调用 setNeedsLayout 即可。这基本上修补了框架错误。选择新视图时,需要在UitabbarController视图上调用它。为应用的标签栏控制器创建一个委托。并将其放入委托对象中:
@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
Leo 是对的,bottomLayoutGuide 返回错误。但是取消设置底栏(或覆盖)下的扩展边缘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;
}