51

我正在尝试通过表单演示在 iPad 中加载 UIViewController。问题是这个新视图的大小,我将大小值放在 IBuilder 中,但模态视图采用固定值。

我也尝试像这样在 prepareForSegue 中进行此操作:

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

但是不工作,有什么帮助吗?谢谢!

4

11 回答 11

84

对于 iOS 8,请使用:

self.preferredContentSize = CGSizeMake(width, height);

我把这个放在viewDidLoad.

斯威夫特 3

self.preferredContentSize = CGSize(width: 100, height: 100)
于 2014-09-10T13:58:13.283 回答
23

在属性检查器中检查Use Preferred Explicit Size

在此处输入图像描述

于 2016-07-13T13:06:08.960 回答
12

例如在演示时,设置preferredContentSize对我在 iOS 11 上不起作用EKEventEditViewController

只有当我覆盖 getter 时它才有效preferredContentSize。像这样的东西:

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
        }
    }
}

在此处输入图像描述 在此处输入图像描述

于 2017-10-05T20:29:13.293 回答
9

编辑

使用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;
}];
于 2013-08-14T06:57:06.103 回答
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;
}
于 2014-08-08T20:04:40.193 回答
2

我的解决方案很大程度上基于此处发布的其他解决方案,但由于我必须尝试许多不同的方法才能使其真正发挥作用,所以我将其发布。我的适用于带有 Swift 3.1 的 iOS 10,只有纵向模式的应用程序。(未在横向模式下测试)我的解决方案的目标是显示一个比呈现视图小的模式,这样我就可以在背景中看到呈现视图。

我必须在 Interface Builder 中正确配置 UIViewController,否则我的代码将无法正常工作。这是我的设置。我发现我的解决方案可以同时使用Cross DissolveCover Vertical过渡样式。我认为 IB 中我的关键是Over Full Screen演示文稿 - 它似乎不适用于此设置的其他一些值。

IB设置

这是我想以模态方式呈现的 UIViewController 中的代码。然后我只是在present(_:animated:completion:)其他地方使用它。此外,在我将以模态方式呈现的 VC 中,我有一个布尔值,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
        }
    }
于 2017-06-27T17:55:26.847 回答
1

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

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

我从情节提要中设置了所有内容并使用了 segue,如果使用代码,您也需要设置它。

parentViewController.modalPresentationStyle = UIModalPresentationPageSheet;
于 2013-12-18T11:14:56.813 回答
1

如果您在 XIB 中使用设置为视图控制器的模态呈现视图的视图。解决此问题的一个非常简单的方法是简单地将 Size Metrics 更改为Freeform(参见图 1.0)并将视图调整为您想要的任何大小。加载模式时,视图将显示这些指标。

设置首选内容大小对我来说没有帮助,但这解决了我的问题。它

图 1.0:

在此处输入图像描述

于 2019-07-11T07:34:27.447 回答
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);
于 2013-08-14T06:44:18.323 回答
0

一个非常简单的方法是在 SheetViewController 类中编辑这个属性

sheetController = SheetViewController(controller: paymentVC, sizes: [.fixed(400), .fixed(400)])
于 2021-02-08T22:42:28.900 回答
0

Erich 的帖子对我有用,但在带有 Swift 3 的 iOS 10 上,我不得不使用:

self.preferredContentSize = CGSize(width, height)

我也把它放在viewdidload

此外,就像 avdyushin 所说,我必须选中该Use Preferred Explicit Size框。

于 2017-01-15T14:10:55.543 回答