iPad自定义大小的模式视图控制器

我有几个特定大小的模式视图控制器。 我试图避免使用自定义视图(在当前视图上创build全屏黑色半透明叠加,在视图上添加模态视图,animation等)来呈现它,因为没有适合我的大小的modalPresentationStyle控制器。

现在我正在使用UIModalPresentationPageSheet,但我的视图的高度较小,并且有一个难看的空白区域

期望的演示

_______________ | _______ | | | | | | | MyVC | | | | | | | ------- | --------------- 

实际演示

  _______________ | | | | | | MyVC | | | | | | | |-------| | | | blank | | --------------- 

如果我使用UIModalPresentationFormSheet容器宽度较小。

我试图弄清楚如何做,但我不知道是否有可能。 呈现比任何presentationStyles小的模态VC的问题的解决scheme是什么? 唯一的解决办法是安排一个“自定义模式视图控制器引擎”? Popovers不符合我的devise要求:(

和其他一些用户一样,我也有模态视图控制器的来源不正确的问题。 经过一些实验,我发现了一个解决scheme,为我工作:

 - (void)viewWillLayoutSubviews{ [super viewWillLayoutSubviews]; self.view.superview.bounds = CGRectMake(0, 0, <width>, <height>); } 

我通过使用下面的结果( 链接文本 )获得了:

 self.modalPresentationStyle = UIModalPresentationFormSheet; 

并通过呈现为模态视图控制器。 让我知道你是否需要进一步的帮助。

所有这些答案都不适用于ios8 SDK。

这将工作:

 AboutViewController * _aboutViewController = [[AboutViewController alloc] init]; _aboutViewController.modalPresentationStyle = UIModalPresentationFormSheet; if(IS_IOS8) { _aboutViewController.preferredContentSize = CGSizeMake(300, 300); } [self presentViewController:_aboutViewController animated:YES completion:nil]; 

在AboutViewController.m中

 - (void)viewWillLayoutSubviews{ [super viewWillLayoutSubviews]; if(!IS_IOS8) { self.view.superview.bounds = CGRectMake(0, 0, 300, 300); } } 

IS_IOS8

 #define IS_IOS8 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8) 

在iOS 8中,你也可以使用UIPresentationController,它给你更多的自定义选项。

这样做的最好方法是更改​​在表单中显示的视图的超级视图的边界属性。 当您以模态方式呈现视图时,呈现的视图会embedded到另一个视图中。

您应该将superview的bounds属性设置为与视图边界相同的矩形。 首先在你的class级里添加一个私人ivar:

 @implementation MySpecialFormsheet { CGRect _realBounds; } 

最好在viewWillAppear: 将以下代码添加到以模态方式呈现的视图控制器中:

 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; self.view.superview.bounds = _realBounds; } 

你需要在你的viewDidLoad方法中caching_realBounds

 - (void)viewDidLoad { _realBounds = self.view.bounds; [super viewDidLoad]; } 

我有一个问题,得到自定义大小的模式,直到我想出什么ViewController.view.superview.frame最初设置。 它是基于UIModalPresentationtypes确定的。 superview.center甚至不需要(据我的testing显示)。

此外,我使用[UIScreen mainScreen].applicationFramedynamic设置坐标,目前只支持横向。 您必须通过翻转X / Y和高度/宽度值来进行条件检查以支持纵向和横向。

这是我第一个iOS 6.0的工作解决scheme:

 ViewController.modalPresentationStyle = UIModalPresentationFormSheet; ViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; [self presentViewController:ViewController animated:YES completion:nil]; ViewController.view.superview.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin; ViewController.view.superview.frame = CGRectMake( // Calcuation based on landscape orientation (width=height) ([UIScreen mainScreen].applicationFrame.size.height/2)-(320/2),// X ([UIScreen mainScreen].applicationFrame.size.width/2)-(320/2),// Y 320,// Width 320// Height ); 

然后我看了一下以前的回答,脸上</s> </s>不安。 稍微缩短我的解决scheme,用最后一行代替:

 ViewController.view.superview.bounds = CGRectMake(0, 0, 320, 320); 

编辑最后的解决scheme和备注。

这是我的解决scheme的一个不自动布局视图(从来没有尝试自动布局),并符合iOS 7和iOS 8。

首先确保以这种方式调用模态视图:

 CloudSettingsViewController *cloudController = [[CloudSettingsViewController alloc] initWithNibName:@"CloudSettingsView" bundle:nil]; CGRect originalBounds = cloudController.view.bounds; cloudController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; cloudController.modalPresentationStyle = UIModalPresentationFormSheet; [self presentViewController:cloudController animated:YES completion:nil]; 

在iOS 8中,在模态视图的viewDidLoad方法中设置preferredContentSize。

 - (void)viewDidLoad { [super viewDidLoad]; // backup of the original size (selected in interface builder) height = self.view.frame.size.height; width = self.view.frame.size.width; if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8) // versioni successive ios 8 self.preferredContentSize = CGSizeMake(width, height); // this is necessary to get the correct size of the modal view } 

当模式视图需要在iPad上显示键盘时,这也可以工作

对于以前版本的iOS 8,您应该在presentViewController调用之后设置边界:

 [currentController presentViewController:controlPanelController animated:YES completion:nil]; if ([[[UIDevice currentDevice] systemVersion] floatValue] < 8) cloudController.view.superview.bounds = originalBounds;//it's important to do this after 

即使为了减less你可以使用的格式表高度和宽度

 [self.view.superview setBounds:CGRectMake(0, 0, 450, 480)]; 

上面介绍的方法需要针对iOS7进行调整:

 // set desired bounds, then call -presentFromViewController: @implementation PresentedViewController { CGRect _presentationBounds; } - (void)presentFromViewController:(UIViewController *)viewController { self.modalTransitionStyle = UIModalTransitionStyleCoverVertical; self.modalPresentationStyle = UIModalPresentationFormSheet; _presentationBounds = self.view.bounds; [viewController presentViewController:self animated:YES completion:nil]; } - (void)viewWillLayoutSubviews { [super viewWillLayoutSubviews]; if (!CGRectIsEmpty(_presentationBounds)) { self.view.superview.bounds = _presentationBounds; _presentationBounds = CGRectZero; } } 

(这个代码也适用于iOS6。)

即使我在同一个问题上挣扎了很长一段时间。 在给出了很多这里给出的答案的几个尝试之后,我想出了一个解决scheme,对我的工作很好。

展示视图控制器的代码如下。

  SomeViewController *sovcObj = [[SomeViewController alloc] initWithNibName:@"SyncOptionsViewController" bundle:nil]; someObj.modalPresentationStyle = UIModalPresentationFormSheet; someObj.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; [self presentViewController:someObj animated:YES completion:nil]; someObj.view.superview.bounds = CGRectMake(0, 0, 400, 400); // whatever width and height you want 

在“Simulated Metrics”部分的xib中(如果使用的话)select“Freeform”大小。

除此之外,您需要在您的视图控制器中编写下面的代码(例如,在本例中为SomeViewController)

 - (void)viewWillLayoutSubviews{ [super viewWillLayoutSubviews]; self.view.superview.bounds = CGRectMake(0, 0, 400, 400); // whatever width and height you want 

}

此代码也适用于iOS 7

一种解决scheme是使用UIModalPresentationPageSheet来呈现页面表格,然后立即调整模式视图的大小。 这在另一个问题的答案中得到了充分的解释。

使用presentModalViewController方法调整模态视图“之后”。请参阅此链接调整模态视图https://coderwall.com/p/vebqaq

你可以像这样使用MZFormSheetController :

 MZFormSheetController *formSheet = [[MZFormSheetController alloc] initWithSize:customSize viewController:presentedViewController]; [presentingViewController mz_presentFormSheetController:formSheet animated:YES completionHandler:nil]; 

这个解决scheme为我工作,因为我有同样的问题。

我的模态视图结构如下(我使用UIModalPresentationCurrentContext在呈现和呈现的控制器来实现透明度在提出的VC)

 ModalViewController > UIView (view) - resized to the same size as the presenting controller but has semi-translucent background - done automatically >> UIView (contentView) - the true view with the content of the popup - this is the one that got consistently placed at the top of the screen all the time 

在ModalViewController我覆盖了以下方法来解决定位问题:

 - (void) viewWillLayoutSubviews(){ [super viewWillLayoutSubviews]; CGRect r = self.view.bounds(); self.contentView.center = CGPointMake(r.size.width/2,r.size.height/2); } 

我实际上首先创build和调整内容视图的大小,但是方式不同。

希望这有助于某人。