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

我正在展示一个模态视图控制器。 如果重要的话,它从底部滚动。 我怎样才能控制它占据屏幕的哪一部分?

编辑:我有以下在模式视图控制器。 这没有帮助。

- (void)viewDidLoad { TestResultView *trv = [[TestResultView alloc]initWithTest: [Model m].currentTest]; self.view = trv; trv.frame = CGRectMake(0, 320, 320, 160); [trv release]; [super viewDidLoad]; } 

你可以修改视图控制器的框架,但是如果你使用的是UIViewController的-presentModalViewController:animated:方法,当你的模态视图完成animation到屏幕上时,后面的视图将被卸载(假定你是在iPhone上)你会看到你的背景视图应该是一个白色的屏幕。 iOS假设你的模式视图控制器将是一个全屏视图控制器,并转储另一个视图来节省内存。

如果你真的想在屏幕上显示一个视图,你应该把UIView(没有UIViewController)作为子视图添加到你当前的UIViewController视图中,然后在屏幕上自己animation。 我认为这样的东西可以在你的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; 

在UIViewanimation块之前,进行设置

 myHalfView.alpha = 1.0; 

animation中心属性后,在块内。

完成后,可以执行类似的操作,但是反过来将视图从屏幕上滑下。 您可以将animationDidStopselect器添加到UIViewanimation块,以便在视图滑出屏幕时通知您,以便您可以从视图层次结构中将其删除。

从美学的angular度来看,你应该小心如何做到这一点,因为视图向上滑动是一种标准的行为,如果你的视图看起来像一个正常的视图,但中途停下来,用户可能会感觉到(甚至短暂)已冻结。 他们会弄清楚,但如果处理不当,会给你的应用留下不好的印象。 主要是,我会避免使用标准的全屏幕提示,例如在视图顶部包含一个UINavigationController,以帮助用户理解正在发生的事情。 半张通常是iPhone上的UIActionSheets,所以在这个方向思考。

这很好,上面接受的答案解释了一个很好的黑客来介绍像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); //xywh - can have desired values. 

我会添加@ 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后显示模态视图。