如何将viewWillLayoutSubviews翻译为viewWillTransitionToSize

问题描述:

我使用viewWillLayoutSubviews来检测方向更改,但在iOS 8和Xcode 6中已弃用,我需要使用新的viewWillTransitionToSize。我的问题是我无法使用它。如何将viewWillLayoutSubviews翻译为viewWillTransitionToSize

我viewWillLayoutSubviews是:

- (void)viewWillLayoutSubviews{ 
    NSInteger maxQuantityForWidth = MAX(3, [self.barButtons count]); 
    CGFloat buttonWidth = (CGRectGetWidth(self.tabBar.bounds) - (kBarButtonSeparation * (maxQuantityForWidth - 1)))/maxQuantityForWidth; 
    for (NSInteger i = 0; i < [self.barButtons count]; i++) { 
     [self.barButtons[i] setFrame:CGRectMake(i * ((buttonWidth + kBarButtonSeparation)), 2.0, buttonWidth, CGRectGetHeight(self.tabBar.bounds) - 2.0)]; 
    } 
    if ([self isShowingTabBar]) { 
     self.functionalityContainer.frame = CGRectMake(0.0, CGRectGetHeight(self.tabBar.bounds), CGRectGetWidth(self.view.bounds), CGRectGetHeight(self.view.bounds) - CGRectGetHeight(self.tabBar.bounds)); 
    } else { 
     self.functionalityContainer.frame = self.view.bounds; 
    } 

    if (IS_IPAD){ 
     [self updateToolbar]; 
     CGRect frame = self.slidingViewController.topViewController.view.frame; 
     if (LANDSCAPE) { 
      frame.size.width = 700; 
     } else { 
      frame.size.width = 768; 
     } 
     [self.slidingViewController.topViewController.view setFrame:frame]; 
    } 
    } 

,它的使用ECSLidingViewController导航部分的一部分。

我试过如下:

- (void) viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { 
    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) { 
     [self updateToolbar]; 

    } completion:^(id<UIViewControllerTransitionCoordinatorContext> context) { 
     if (IS_IPAD){ 
      CGRect frame = self.slidingViewController.topViewController.view.frame; 

      if (LANDSCAPE) { 
       NSInteger maxQuantityForWidth = MAX(3, [self.barButtons count]); 
       CGFloat buttonWidth = (758 - (kBarButtonSeparation * (maxQuantityForWidth - 1)))/maxQuantityForWidth; 
       for (NSInteger i = 0; i < [self.barButtons count]; i++) { 
        [self.barButtons[i] setFrame:CGRectMake(i * ((buttonWidth + kBarButtonSeparation)), 2.0, buttonWidth, CGRectGetHeight(self.tabBar.bounds) - 2.0)]; 
       } 
       frame.size.width = 768; 
      } else { 
       NSInteger maxQuantityForWidth = MAX(3, [self.barButtons count]); 
       CGFloat buttonWidth = (758 - (kBarButtonSeparation * (maxQuantityForWidth - 1)))/maxQuantityForWidth; 
       for (NSInteger i = 0; i < [self.barButtons count]; i++) { 
        [self.barButtons[i] setFrame:CGRectMake(i * ((buttonWidth + kBarButtonSeparation)), 2.0, buttonWidth, CGRectGetHeight(self.tabBar.bounds) - 2.0)]; 
       } 
       frame.size.width = 768; 
      } 
      [self.slidingViewController.topViewController.view setFrame:frame]; 
     } 

     if([self isShowingTabBar]){ 
      [self showTabBar]; 
     }else{ 
      [self hideTabBar]; 
     } 
     if (IS_IPAD && LANDSCAPE) { 
      self.slidingViewController.resetStrategy = ECNone; 
      [self.navigationItem setLeftBarButtonItems:@[] animated:YES]; 
      if (!self.slidingViewController.underLeftShowing) { 
       [self.slidingViewController anchorTopViewTo:ECRight]; 
      } 
     } else { 
      self.slidingViewController.resetStrategy = ECTapping | ECPanning; 
      [self.navigationItem setLeftBarButtonItems:@[self.displayMenuBarButtonItem] animated:YES]; 
      [self.slidingViewController resetTopView]; 
     } 
     [self.slidingViewController.topViewController.view setNeedsDisplay]; 
     [self.functionalityNavigationController.view setNeedsDisplay]; 

     [self.view setNeedsDisplay]; 
    }]; 

    NSString *orientation = [[NSString alloc]initWithFormat:@"Larghezza: %f Altezza: %f", self.view.frame.size.width, self.view.frame.size.height]; 
    [self.view makeToast:orientation duration:3.0 position:@"bottom"]; 
    [super viewWillTransitionToSize: size withTransitionCoordinator: coordinator]; 
} 

,但它不工作,似乎并不“理解”时,它的横向或纵向。任何想法如何解决它?

***编辑:

这里的定义我用

#define LANDSCAPE UIInterfaceOrientationIsLandscape(self.interfaceOrientation) 
#define LANDSCAPE_RIGHT [UIDevice currentDevice].orientation == UIDeviceOrientationLandscapeLeft 
#define LANDSCAPE_LEFT [UIDevice currentDevice].orientation == UIDeviceOrientationLandscapeRight 
#define PORTRAIT UIInterfaceOrientationIsPortrait(self.interfaceOrientation) 
#define PORTRAIT_REVERSE [UIDevice currentDevice].orientation == UIDeviceOrientationPortraitUpsideDown 
+0

问题可能出现在您未包含的LANDSCAPE宏中。 – jrturton 2014-11-02 11:30:26

+0

请看看我的编辑 – Enzoses 2014-11-02 11:57:28

+0

不知道你在哪里捕获self.interfaceOrientation。使用'[UIApplication sharedApplication] .statusBarOrientation'。如果这不是定向,那么在我的最后没有测试,然后从UIDevice方向使用它。 – Srivathsa 2014-12-20 03:54:57

的问题似乎有点“老”,无论如何,至少引进iOS9(尤其是多任务处理),它是不建议根据设备方向得出关于当前屏幕格式的结论 - 相反,应该评估当前的屏幕尺寸。以下内容说明屏幕格式是纵向还是横向:

- (void) viewWillTransitionToSize : (CGSize) screenSize withTransitionCoordinator : (id<UIViewControllerTransitionCoordinator> _Nonnull) coordinator 
{ 
    BOOL isLandscapeOrientation = (screenSize.width > screenSize.height); 
    ... 
    ... 
} 

您应该使用特征收集方法,然后检查尺寸等级。

/* 
This method is called when the view controller's trait collection is changed by its parent. 

If you override this method, you should either call super to propagate the change to children or manually forward the change to children. 
*/ 
- (void)willTransitionToTraitCollection:(UITraitCollection *)newCollection withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coordinator NS_AVAILABLE_IOS(8_0);