模板视图自定义大小加载与表单表示
我试图加载一个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 Dissolve
和Cover Vertical
转换样式。 我认为我在IB的关键是Over Full Screen
演示 – 它似乎没有与这个设置的其他值一起工作。
这是我想要模态地呈现的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 } } }