如何将viewWillLayoutSubviews翻译为viewWillTransitionToSize

时间:2014-11-02 08:20:10

标签: ios ipad ecslidingviewcontroller

我正在使用viewWillLayoutSubviews来检测方向更改,但在iOS 8和Xcode 6中已弃用,我需要使用新的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

2 个答案:

答案 0 :(得分:1)

这个问题看起来有点“陈旧”,无论如何,至少在引入iOS9(特别是多任务处理)时,不建议根据设备方向得出有关当前屏幕格式的结论 - 相反,应该评估当前屏幕尺寸。以下表示屏幕格式是纵向还是横向:

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

答案 1 :(得分:0)

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

/* 
 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);