UINavigationController 不使用自动布局 iOS 8 更新大小
Posted
技术标签:
【中文标题】UINavigationController 不使用自动布局 iOS 8 更新大小【英文标题】:UINavigationController not updating size with auto layout iOS 8 【发布时间】:2014-09-30 23:09:42 【问题描述】:我正在尝试更新我的应用程序以与 ios8 兼容当我将设备旋转到横向模式时,我在应用程序中发现了一些带有 UINavigationController
自动布局的错误,根视图更新但子视图不更新甚至Scrollview
的子视图。
该应用程序适用于 iPhone 和 iPad,因此我使用两个单独的故事板并使用此代码
- (void)viewDidLoad
[super viewDidLoad];
self.shouldAdjustChildViewHeightForStatusBar = NO;
[self setNeedsStatusBarAppearanceUpdate];
UIStoryboard *storyboard;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
storyboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil];
else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
storyboard = [UIStoryboard storyboardWithName:@"Main_iPad" bundle:nil];
self.topViewController = [storyboard instantiateViewControllerWithIdentifier:@"HomeController"];
图片
下面是您看到的处于横向模式的视图,由于 Scrollview 没有更新或其他原因,因此有一个很大的空白区域
我用来更新子视图但滚动不起作用。
-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
【问题讨论】:
什么是topViewController
?在 UINavigationController 中,这是一个只读属性,所以不能赋值。
我的 topViewController 是我用于此应用程序的菜单的 ECSlidingViewController 框架的一部分
【参考方案1】:
您的问题不清楚,但看起来您正在继承 ECSlidingViewController
。
If you look at the source for ECSlidingViewController,它只在其viewDidLoad
中布置了topViewController。
解决方案 1:
您希望在调用 viewDidLoad
之前设置 topViewController,他们在 awakeFromNib
中进行设置:
- (void)awakeFromNib
[super awakeFromNib];
UIStoryboard *storyboard;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
storyboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil];
else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
storyboard = [UIStoryboard storyboardWithName:@"Main_iPad" bundle:nil];
self.topViewController = [storyboard instantiateViewControllerWithIdentifier:@"HomeController"];
解决方案 2
他们似乎有一个很好的方便的方法来初始化滑动视图控制器。无论您在哪里创建 ECSlidingViewController,您都可以这样做:
UIStoryboard *storyboard;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
storyboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil];
else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
storyboard = [UIStoryboard storyboardWithName:@"Main_iPad" bundle:nil];
UIViewController *topViewController = [storyboard instantiateViewControllerWithIdentifier:@"HomeController"];
ECSlidingViewController *slidingViewController = [ECSlidingViewController slidingWithTopViewController:topViewController];
// ...
【讨论】:
谢谢你这工作正常,似乎我使用的是旧版本的 ECSlindingViewController 和项目,UIStoryboard *storyboard; if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) storyboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil]; else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) storyboard = [UIStoryboard storyboardWithName:@"Main_iPad" bundle:nil];
这部分代码是不必要的,因为在项目的部署信息选项卡中定义,如果您不想将 Size Classes 与 Storyboard 一起使用,这将很有用以上是关于UINavigationController 不使用自动布局 iOS 8 更新大小的主要内容,如果未能解决你的问题,请参考以下文章