模板视图自定义大小加载与表单表示

我试图加载一个UIViewController与表单表单呈现在iPad中。 问题是这个新视图的大小,我把尺寸值放在IBuilder中,但模态视图取一个固定的值。

另外我试图做这个在prepareForSegue像这样:

HelpViewController *viewController = segue.destinationViewController; viewController.view.superview.frame = CGRectMake(0, 0, 200, 200); 

但不工作,有任何帮助? 谢谢!

对于iOS 8,请使用:

 self.preferredContentSize = CGSizeMake(width, height); 

我把它放在viewDidLoad

Swift 3

 self.preferredContentSize = CGSize(width: 100, height: 100) 

在“属性”检查器中,选中“ Use Preferred Explicit Size

在这里输入图像说明

你可以尝试在中心显示视图

 HelpViewController * viewController = [[[HelpViewController alloc] init] autorelease]; viewController.modalPresentationStyle=UIModalPresentationFormSheet; viewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; [self presentViewController:viewController animated:YES completion:^{ viewController.view.superview.frame = CGRectMake(0, 0, 200, 200); viewController.view.superview.center = self.view.center; }]; 

我像@Stuart Campbell和@Viruss mca一样解决了这个问题。

编辑

在@ Erich的评论之后,我重写了它在iOS 8中的运行。 以下是代码:

  HelpViewController * viewController = [[[HelpViewController alloc] init]]; viewController.modalPresentationStyle=UIModalPresentationFormSheet; [self presentViewController:viewController animated:YES completion:nil]; 

 //HelpViewController.m - (void) viewWillLayoutSubviews{ [super viewWillLayoutSubviews]; if (!didLayout) { [self layout]; didLayout = YES; } } - (void) layout{ self.view.superview.backgroundColor = [UIColor clearColor]; CGRect screen = self.view.superview.bounds; CGRect frame = CGRectMake(0, 0, <width>, <height>); float x = (screen.size.width - frame.size.width)*.5f; float y = (screen.size.height - frame.size.height)*.5f; frame = CGRectMake(x, y, frame.size.width, frame.size.height); self.view.frame = frame; } 

通过将我的内容放入模态vc中的视图中,我解决了这个问题。 然后将vc背景设置为透明,并在viewWillAppear设置窗体背景透明。 这意味着你只能看到内容。

 // In Modal vc - (void)viewWillAppear:(BOOL)animated { self.view.superview.backgroundColor = [UIColor clearColor]; [super viewWillAppear:animated]; } 

我从故事板设置了所有的东西,并使用了一个segue,如果使用代码,你也需要设置这个。

 parentViewController.modalPresentationStyle = UIModalPresentationPageSheet; 

我也有这个问题,你应该在提交之后调整superview的框架。

 HelpViewController *viewController = segue.destinationViewController; viewController.modalPresentationStyle = UIModalPresentationPageSheet; [self presentViewController:viewController animated:YES completion:nil]; viewController.view.superview.frame = CGRectMake(0, 0, 200, 200); 

Erich的post为我工作,但在Swift 3的iOS 10上,我不得不使用:

 self.preferredContentSize = CGSize(width, height) 

我也把它放在viewdidload

此外,就像avdyushin说,我必须检查Use Preferred Explicit Size框。

我的解决scheme很大程度上依赖于在此发布的其他解决scheme,但是由于我不得不尝试许多不同的方式才能使其实际工作。 我的是在iOS 10和Swift 3.1中的仅限肖像模式的应用程序。 (在横向模式下未testing)我的解决scheme的目标是显示比呈现视图更小的模式,以便我可以在背景中看到呈现视图。

我不得不在界面生成器中正确configurationUIViewController,否则我的代码将无法工作。 这是我的设置。 我发现我的解决scheme可以使用Cross DissolveCover Vertical转换样式。 我认为我在IB的关键是Over Full Screen演示 – 它似乎没有与这个设置的其他值一起工作。

IB设置

这是我想要模态地呈现的UIViewController中的代码。 然后我在其他地方使用present(_:animated:completion:)来调用它。 另外,在VC中我将以模态方式呈现,我有一个bool, didLayout初始化为false

 override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() if !didLayout { let width:CGFloat = self.view.bounds.width * 0.95 //modify this constant to change the amount of the screen occupied by the modal let height:CGFloat = width * 1.618 //golden ratio self.view.superview!.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.15) //slightly dim the background to focus on the modal let screen = self.view.superview!.bounds let frame = CGRect(x: 0, y: 0, width: width, height: height) let x = (screen.size.width - frame.size.width) * 0.5 let y = (screen.size.height - frame.size.height) * 0.5 let mainFrame = CGRect(x: x, y: y, width: frame.size.width, height: frame.size.height) self.view.frame = mainFrame didLayout = true } } 

例如,在展示EKEventEditViewController时,设置preferredContentSize在iOS 11上不适用于我。

它只有在我重写preferredContentSize getter时才起作用。 像这样的东西:

 private class CLEventEditViewController: EKEventEditViewController { override var preferredContentSize: CGSize { get { if let fullSize = self.presentingViewController?.view.bounds.size { return CGSize(width: fullSize.width * 0.5, height: fullSize.height * 0.75) } return super.preferredContentSize } set { super.preferredContentSize = newValue } } } 

在这里输入图像说明 在这里输入图像说明