我正在尝试使用表单表格在iPad中加载UIViewController。问题是这个新视图的大小,我将大小值放在IBuilder中,但模态视图采用固定值。
我也试着在prepareForSegue中这样做:
HelpViewController *viewController = segue.destinationViewController;
viewController.view.superview.frame = CGRectMake(0, 0, 200, 200);
但是不工作,有什么帮助吗?谢谢!
答案 0 :(得分:74)
对于iOS 8,请使用:
self.preferredContentSize = CGSizeMake(width, height);
我已将其放在viewDidLoad
。
self.preferredContentSize = CGSize(width: 100, height: 100)
答案 1 :(得分:15)
答案 2 :(得分:5)
修改
使用preferredContentSize
。
<强>旧强>
您可以尝试在中心显示视图
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;
}];
答案 3 :(得分:4)
在iOS 11上设置preferredContentSize
对我不起作用,例如在展示EKEventEditViewController
时。
仅当我覆盖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
}
}
}
答案 4 :(得分:2)
我像@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;
}
答案 5 :(得分:2)
我的解决方案很大程度上依赖于此处发布的其他解决方案,但由于我必须尝试许多不同的东西才能让它实际工作我发布它。我的是适用于iOS 10的Swift 3.1,仅适用于纵向模式应用。 (在横向模式下未经测试)我的解决方案的目标是显示一个小于呈现视图的模态,以便我可以在后台看到呈现视图。
我必须在Interface Builder中正确配置UIViewController,否则我的代码将无法正常工作。这是我的设置。我发现我的解决方案适用于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
}
}
答案 6 :(得分:1)
我通过将我的内容放在模态vc中的视图中解决了这个问题。然后将vc背景设置为透明,并在viewWillAppear设置中将表单背景透明化。这意味着您只能看到内容。
// In Modal vc
- (void)viewWillAppear:(BOOL)animated
{
self.view.superview.backgroundColor = [UIColor clearColor];
[super viewWillAppear:animated];
}
我从故事板中设置了所有内容并使用了segue,如果使用代码,您也需要设置它。
parentViewController.modalPresentationStyle = UIModalPresentationPageSheet;
答案 7 :(得分:0)
我也有这个问题,你应该在呈现后重新调整superview的框架。
HelpViewController *viewController = segue.destinationViewController;
viewController.modalPresentationStyle = UIModalPresentationPageSheet;
[self presentViewController:viewController animated:YES completion:nil];
viewController.view.superview.frame = CGRectMake(0, 0, 200, 200);
答案 8 :(得分:0)
Erich的帖子为我工作,但在使用Swift 3的iOS 10上,我不得不使用:
self.preferredContentSize = CGSize(width, height)
我也把它放在viewdidload
另外,像avdyushin说的那样,我必须检查Use Preferred Explicit Size
框。
答案 9 :(得分:0)
如果在XIB中使用的视图被设置为视图控制器的模态呈现视图。解决此问题的一种非常简单的方法是将Size Metrics(尺寸指标)更改为 Freeform (参见图1.0),然后将视图调整为所需的大小。加载模式时,视图将随这些指标一起显示。
在我的情况下,设置首选内容大小没有帮助,但这解决了我的问题。
图1.0:
答案 10 :(得分:0)
一个非常简单的方法是在 SheetViewController 类中编辑这个属性
sheetController = SheetViewController(controller: paymentVC, sizes: [.fixed(400), .fixed(400)])