Con*_*nor 12 xcode ios autolayout ios7
在我的应用程序中,我使用autolayout将标签量与bottomLayoutGuide对齐.当应用程序第一次启动时,所有内容都按照我的要求进行了布局,但是当我切换标签并返回时,标签已经消失在标签栏控制器下面.
如果我旋转设备,横向视图会正确显示,当我将其旋转回纵向时,视图将恢复正常.我似乎无法弄清楚导致这种行为的原因.谢谢你的帮助!
Leo*_*ica 18
这是因为iOS7中的错误导致底部布局指南错误地设置为高度0而不是标签栏的高度.旋转设备时,底部布局指南已正确设置.
目前,您最好的选择是禁用底部扩展布局:
- (UIRectEdge)edgesForExtendedLayout
{
return [super edgesForExtendedLayout] ^ UIRectEdgeBottom;
}
Run Code Online (Sandbox Code Playgroud)
对从标签栏控制器显示的每个视图控制器执行此操作.请记住将标签栏视图控制器的背景颜色设置为适合您应用的颜色.
请务必在https://bugreport.apple.com上打开错误报告
为了详细说明,viewDidLayoutSubviews在切换视图控制器时似乎被调用了两次.第一次,一切都设置正确,但第二次底部布局指南高度为0.您可以从堆栈跟踪中看到第一个来自标签栏布局,而第二个调用来自计划的CALayer布局,这是不正确的.
ste*_*eve 14
虽然Leo的答案显示了如何以编程方式执行此操作,但如果要从界面构建器执行此操作,请选择View Controller并从"Extend Edges"部分取消选中"Under bottom bars":

调用setNeedsLayout就是所有需要完成的事情.这基本上修补了框架错误.当选择新视图时,需要在UITabBarController视图上调用它.为应用程序的标签栏控制器创建一个委托.并将其放在委托对象中:
@interface MyPatch : NSObject <UITabBarControllerDelegate>
@end
@implementation MyPatch
-(void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
[tabBarController.view setNeedsLayout];
}
@end
Run Code Online (Sandbox Code Playgroud)
并在任何地方初始化它......这样的事情:
@interface AppDelegate : UIResponder <UIApplicationDelegate>
{
MyPatch *patch;
}
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
patch=[MyPatch new];
myTabBarController.delegate=patch;
}
@end
Run Code Online (Sandbox Code Playgroud)