用表单工作表演示加载的模态视图的自定义大小

时间:2013-05-13 08:56:12

标签: ios objective-c ipad uipresentationcontroller

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

我也试着在prepareForSegue中这样做:

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

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

11 个答案:

答案 0 :(得分:74)

对于iOS 8,请使用:

self.preferredContentSize = CGSizeMake(width, height);

我已将其放在viewDidLoad

Swift 3

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

答案 1 :(得分:15)

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

enter image description here

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

enter image description here enter image description here

答案 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 DissolveCover Vertical转换样式。我认为IB中的关键是演示文稿的Over Full Screen - 它似乎不适用于此设置的其他一些值。

IB Settings

这是我希望以模态方式呈现的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:

enter image description here

答案 10 :(得分:0)

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

sheetController = SheetViewController(controller: paymentVC, sizes: [.fixed(400), .fixed(400)])