代码之家  ›  专栏  ›  技术社区  ›  TroutKing

取消iPad模态视图会弄乱UISplitView面板

  •  2
  • TroutKing  · 技术社区  · 14 年前

    视图层次结构是直截了当的:

                                                  /- TableViewController1
                         /- root:TabBarController -- TableViewController2
    SplitViewController -
                         \- detail:CustomViewController
    

    单击TableViewController1中的一个表格单元格时,会打开一个模式视图:

    - (void)tableView:(UITableView *)tv didSelectRowAtIndexPath:(NSIndexPath *)ip {
      UIViewController *vc = [[MyModalClass alloc] init];
      UINavigationController *nc = [[UINavigationController alloc]
                                    initWithRootViewController:vc];
      nc.modalPresentationStyle = UIModalPresentationFormSheet;
      nc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
      [self presentModalViewController:nc animated:true];
      [nc release];
      [vc release];
    }
    

    这样做很好:视图出现。当我试图在任何方向而不是风景中忽略它时,问题就开始了。

    在ModalViewController中,以下方法由导航栏中的UITabBarButton触发:

    - (void) closeButtonInNavBarWasClicked:(id)sender {
      [self dismissModalViewControllerAnimated:true];
    }
    

    问题就从这里开始。

    调用此代码时,模态视图将消失,但是:TabBarController(分割视图的根视图)会突然旋转并调整大小。内容突然横向移动,部分覆盖了细节视图。详细信息视图的大小没有调整为更小,它只是被根视图部分覆盖。

    • 转储选项卡栏,只需将TableViewController1显示为拆分视图的根控制器
    • 创建委托协议,以便父TableViewController1取消模式视图而不是MyModalClass视图本身。
    • 在TableViewController1.splitViewController上显示/取消模式视图实际上会让事情变得更糟:视图甚至没有出现。
    • 牺牲几只山羊也无济于事。

    我将非常感谢对这个问题的任何意见。

    2 回复  |  直到 14 年前
        1
  •  0
  •   TroutKing    14 年前

        2
  •  0
  •   Sajjon    11 年前

    我和你有同样的问题,我通过编程临时强制旋转我的视图控制器(一旦返回到它),在它的viewdideappear方法中任意旋转来解决它。当然没有动画。然后将其旋转回所需的方向(在旋转之前我保存了该方向)。

    因此,如果vc1以模式显示vc2,并且用户旋转vc2,则我通过调用以下命令,根据vc2的当前方向设置vc1的方向: UIInterfaceOrientation当前方向=自我界面定向;//存储vc2的当前方向(模态视图) [vc1将旋转接口或方向:当前方向持续时间:0];

    [super viewDidAppear:animated];
    
    /* Store wanted orientation */
    UIInterfaceOrientation currentOrientation = self.interfaceOrientation; 
    
    /* rotate to some arbitrary orientation, this solves the bug. */
    [[UIDevice currentDevice] setOrientation:UIInterfaceOrientationPortraitUpsideDown animated:NO]; 
    
    [[UIDevice currentDevice] setOrientation:currentOrientation animated:NO]; //restore wanted orientation.
    

    }