繁体   English   中英

iOS - 如何控制模态视图控制器的大小?

[英]iOS — how do you control the size of a modal view controller?

我提出了一个模态视图控制器。 如果重要的话,它会从底部向上滚动。 如何控制它占据的屏幕部分?

编辑:我在模态视图控制器中有以下内容。 它没有帮助。

- (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:方法,则一旦您的模态视图完成动画到屏幕上,后面的视图将被卸载(这假设您在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,所以想一想这个方向。

这很好,上面接受的答案解释了一个很好的黑客来呈现感觉像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.

我想补充一下@ 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;

虽然超级视图可能无法与iPad一起旋转,但它似乎做了正确的事情并且在显示模态视图后旋转iPad时保持模态视图居中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM