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 更新大小的主要内容,如果未能解决你的问题,请参考以下文章

同步关键字不使函数同步:Java [重复]

如何使 RelativeLayout 半透明但不使活动

CSS:对象覆盖不使图像居中

如何在不使项目变灰的情况下禁用 UITabBarItem

调整画布图像大小而不使其模糊

UISearchBar-更改范围而不使表格变灰?