我的应用程序启动了一个主菜单,它是被UIViewController调用的自定义子类LVSMainViewController.它嵌入在UINavigationController故事板中设置为初始VC的a中.LVSMainViewController实施-viewDidLayoutSubviews.
点击按钮会将用户带到应用程序的不同部分(不同的VC).用户通过连接到推送segue的按钮返回主菜单.但是,当应用程序再次加载主菜单VC时,它会崩溃并显示以下消息:
2014-08-28 16:11:14.122*断言失败 - [UIView layoutSublayersOfLayer:],/ SourceCache/UIKit_Sim/UIKit-2935.137/UIView.m:8803
2014-08-28 16:11:14.257*由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'将-viewDidLayoutSubviews发送到视图控制器后仍需要自动布局.LVSMainViewController的实现需要将-layoutSubviews发送到视图以调用自动布局.
SO上的其他帖子在以编程方式设置自动布局约束时报告相同的错误(我没有这样做,虽然我在故事板中使用自动布局)和/或使用时UITableView(我在主菜单VC中没有使用)或者它所代表的VC,尽管我在应用程序的其他地方使用它).(见这里或这里.)
其他拼图:
我试着[self.view layoutSubviews];在最后添加-viewDidLayoutSubviews.当我这样做时它不会崩溃.但似乎是不明智的,因为苹果的文件说,
您不应该直接调用此方法.如果要强制进行布局更新,请在下次绘图更新之前调用setNeedsLayout方法.
如果我[self.view setNeedsLayout];在最后添加-viewDidLayoutSubviews,应用程序崩溃,首先加载主菜单VC,而不是当我离开它并返回.
可能是什么造成的?
我遇到了奇怪的行为.我正在使用我在控制器中设置的自定义样式按钮:
- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.signOutButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    [self.signOutButton setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
    CAGradientLayer *btnGradient = [CAGradientLayer layer];
    btnGradient.frame = self.signOutButton.bounds;
    btnGradient.colors = [NSArray arrayWithObjects:
                          (id)[[UIColor colorWithRed:102.0f / 255.0f green:102.0f / 255.0f blue:102.0f / 255.0f alpha:1.0f] CGColor],
                          (id)[[UIColor colorWithRed:51.0f / 255.0f green:51.0f / 255.0f blue:51.0f / 255.0f alpha:1.0f] CGColor],
                          nil];
    [self.signOutButton.layer insertSublayer:btnGradient atIndex:0];
}
Run Code Online (Sandbox Code Playgroud)
它在iOS 5中运行正常.但是如果我在iOS 6中使用启用的Autolayout for Storyboard构建这个,那么我的风格中的渐变消失/变得透明(但标题仍然可见).
如果我禁用自动布局 - 渐变回来了.有人可以用autolayout解释这种行为吗?