代码之家  ›  专栏  ›  技术社区  ›  William Jockusch

iOS—如何控制模式视图控制器的大小?

  •  30
  • William Jockusch  · 技术社区  · 14 年前

    我正在介绍一个模态视图控制器。如果重要的话,它是从底部向上滚动的。如何控制它占据屏幕的哪个部分?

    编辑:模态视图控制器中有以下内容。这没用。

    - (void)viewDidLoad {
        TestResultView *trv = [[TestResultView alloc]initWithTest: [Model m].currentTest];
        self.view = trv;
        trv.frame = CGRectMake(0, 320, 320, 160);
        [trv release];
        [super viewDidLoad];
    }
    
    3 回复  |  直到 14 年前
        1
  •  38
  •   atticus    12 年前

    您可以修改视图控制器的框架,但是如果您使用的是UIViewController的-presentModalViewController:animated:method,那么一旦您的模式视图在屏幕上完成动画设置(这假设您在iPhone上),并且您将看到一个白色屏幕,背景视图应该在其中。iOS假设您的模式视图控制器是一个全屏视图控制器,并转储另一个视图以节省内存。

    如果确实要在屏幕的一部分显示视图,则应将UIView(无UIViewController)作为子视图添加到当前UIViewController的视图中,然后在屏幕上自行设置动画。我认为这样的东西在您的UIViewController类中可以工作,该类将显示视图:

    // Add the view as a subview and position it offscreen just below the current view
    UIView *myHalfView = [[UIView alloc] initWithFrame:someAppropriateFrame];
    [self.view addSubview:myHalfView];
    CGRect offScreenFrame = myHalfView.bounds;
    offScreenFrame.origin = CGPointMake(0.0, CGRectGetMaxY(self.view.frame));
    
    // Now animate the view upwards
    [UIView beginAnimations:nil context:nil];
    // Move the view upwards the height of your sliding view so it's entirely onscreen
    myHalfView.center = CGPointMake(myHalfView.center.x, myHalfView.center.y - myHalfView.bounds.size.height);
    [UIView commitAnimations];
    [myHalfView release];
    

    对于加分,您可以通过设置

    myHalfView.alpha = 0.0;
    

    在UIView动画块之前,并设置

    myHalfView.alpha = 1.0;
    

    在设置中心属性的动画后在块内。

    完成后,您可以执行类似但相反的操作,将视图滑出屏幕。您可以将animationDidStop选择器添加到UIView动画块中,以便在视图滑出屏幕时得到通知,从而可以将其从视图层次结构中移除。

    从美学的角度来看,你也应该注意如何做到这一点,因为视图向上滑动是一种标准行为,如果你的视图看起来像正常视图,但中途停止,用户可能会感觉(甚至短暂地)应用程序已冻结。他们会解决的,但如果不小心处理,会给你的应用留下不好的感觉。主要地,我会避免使用标准的全屏提示,比如在视图顶部包含一个UINavigationController,以帮助用户了解发生了什么。半张纸往往是iPhone上的UIActionSheets,所以请往这个方向想。

        2
  •  26
  •   dsaw    10 年前

    这很好,上面接受的答案解释了一个不错的黑客来呈现子视图,感觉像ModalViews,但如果它是一个iPad,我真的可以给它一个modalViewController,不覆盖整个屏幕。

    如果是ipad,我不认为下面的视图会被卸载。(因为我们可以在ipad上展示modalView,但不能覆盖整个屏幕)

    ModalViewController在最后是一个控制器本身,和其他任何控制器一样,它有一个根视图,如果我们能掌握它的话,它的属性可以被编辑。

    以下是将为您提供定制的ModalView框架:

    MyViewController *viewController = [[MyViewController alloc] init];
    viewConroller.modalPresentationStyle = UIModalPresentationFormSheet;
    [self presentModalViewController:viewController animated:YES];
        //superView of viewController's view is modalViewController's view, which we were after
    viewController.view.superview.frame = CGRectMake(x,y,w,h);
        //x y w h - can have desired values.
    
        3
  •  20
  •   bugloaf    13 年前

    我要补充@dsaw的回答,模态视图的超视图似乎没有在横向模式下旋转其坐标系。以下是我在自己的应用程序中使用的代码:

    MyViewController* modalVC = [[MyViewController alloc] init];        
    modalVC.modalPresentationStyle = UIModalPresentationFormSheet;
    [self presentModalViewController:modalVC animated:NO];
    CGRect r = CGRectMake(self.view.bounds.size.width/2 - 236,
                          self.view.bounds.size.height/2 - 130,
                          472, 260);
    r = [self.view convertRect:r toView:modalVC.view.superview.superview];
    modalVC.view.superview.frame = r;
    

    虽然superview可能不会随iPad旋转,但如果我在显示模式视图后旋转iPad,它似乎做了正确的事情,并使模式视图居中。