专业java、php、iOS、C++、网页设计、平面设计、网络营销、游戏开发、前端与移动开发培训机构

根据屏幕方向设置master控制器宽度

  • CZSplitViewControllerprepareSplitViewController 方法里面根据当前屏幕方向设置 master 控制器的宽度

      #pragma mark - 设置 UISplitViewController
      /// 设置master 控制器横竖屏显示以及宽度
      - (void)prepareSplitViewController {
          // 1. 一直显示master控制器
          self.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible;
    
          // 2. 获取屏幕方向
          BOOL isLandscape = UIInterfaceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation);
    
          // 3. 设置master控制器的宽度
          if (isLandscape) {
              self.maximumPrimaryColumnWidth = 280;
          } else {
              self.maximumPrimaryColumnWidth = 60;
          }
      }
    
  • 目前当程序运行的时候 横屏master 的宽度为 280, 竖屏master 的宽度为 60
  • 但是屏幕旋转的时候,宽度是不会发生变化的,需要监听屏幕改变事件,当屏幕发生改变时,重新设置 master 的宽度.

    • AppDelegate 中实现 application:willChangeStatusBarOrientation:duration: 代理方法:

        /**
         *  屏幕将要旋转
         *  @param newStatusBarOrientation 旋转后的屏幕方向
         *  @param duration                动画时间
         */
        - (void)application:(UIApplication *)application willChangeStatusBarOrientation:(UIInterfaceOrientation)newStatusBarOrientation duration:(NSTimeInterval)duration {
      
            // 1. 判断当前window的根控制器是否是CZSplitViewController
      
            // 2. 获取到CZSplitViewController
      
            // 3. 设置 master 的宽度
        }
      
    • 实现 application:willChangeStatusBarOrientation:duration: 方法

        /**
         *  屏幕将要旋转
         *  @param newStatusBarOrientation 旋转后的屏幕方向
         *  @param duration                动画时间
         */
        - (void)application:(UIApplication *)application willChangeStatusBarOrientation:(UIInterfaceOrientation)newStatusBarOrientation duration:(NSTimeInterval)duration {
      
            // 1. 判断当前window的根控制器是否是CZSplitViewController
            if (![self.window.rootViewController isKindOfClass:[UISplitViewController class]]) {
                return;
            }
      
            // 2. 获取到CZSplitViewController
            CZSplitViewController *splitVC = (CZSplitViewController *)self.window.rootViewController;
      
            // 3. 设置 master 的宽度
        }
      
    • CZSplitViewController.m 抽取 设置master控制器的宽度 setPrimaryColumnWidthWithOrientation:

        /**
         *  根据屏幕方向设置master的宽度
         *  @param orientation 屏幕方向
         */
        - (void)setPrimaryColumnWidthWithOrientation:(UIInterfaceOrientation)orientation {
            BOOL isLandscape = UIInterfaceOrientationIsLandscape(orientation);
      
            // 设置master控制器的宽度
            if (isLandscape) {
                self.maximumPrimaryColumnWidth = 280;
            } else {
                self.maximumPrimaryColumnWidth = 60;
            }
        }
      
    • CZSplitViewController.h 中声明 根据屏幕方向设置master的宽度方法 - (void)setPrimaryColumnWidthWithOrientation:(UIInterfaceOrientation)orientation;

        @interface CZSplitViewController : UISplitViewController
      
        /// 根据屏幕方向设置master的宽度
        - (void)setPrimaryColumnWidthWithOrientation:(UIInterfaceOrientation)orientation;
      
        @end
      
    • 修改 CZSplitViewController.mprepareSplitViewController 方法

        /// 设置master 控制器横竖屏显示以及宽度
        - (void)prepareSplitViewController {
            // 1. 一直显示master控制器
            self.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible;
      
            // 2. 设置master控制器的宽度
            [self setPrimaryColumnWidthWithOrientation:[UIApplication sharedApplication].statusBarOrientation];
        }
      
    • 完善 AppDelegateapplication:willChangeStatusBarOrientation:duration:

        /**
         *  屏幕将要旋转
         *  @param newStatusBarOrientation 旋转后的屏幕方向
         *  @param duration                动画时间
         */
        - (void)application:(UIApplication *)application willChangeStatusBarOrientation:(UIInterfaceOrientation)newStatusBarOrientation duration:(NSTimeInterval)duration {
      
            // 1. 判断当前window的根控制器是否是CZSplitViewController
            if (![self.window.rootViewController isKindOfClass:[UISplitViewController class]]) {
                return;
            }
      
            // 2. 获取到CZSplitViewController
            CZSplitViewController * splitVC = (CZSplitViewController *)self.window.rootViewController;
      
            // 3. 设置 master 的宽度
            [splitVC setPrimaryColumnWidthWithOrientation:newStatusBarOrientation];
        }