Пользовательский размер для модального представления, загруженного с презентацией листа формы

Я пытаюсь загрузить UIViewController в iPad с презентацией Form Sheet. Проблема заключается в размере этого нового представления, я помещаю значения размера в IBuilder, но модальное представление принимает фиксированное значение.

Также я пытался сделать это в prepareForSegue вот так:

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

Но не работает, помощь? Спасибо!


person Fran Fox    schedule 13.05.2013    source источник
comment
Привет, я установил нестандартный размер в методе viewWillAppear модального представления, используя: [self.view.superview setBounds: CGRectMake (0, 0, 200, 200)]; Но теперь окно не центрируется по макету.   -  person Fran Fox    schedule 13.05.2013
comment
прочтите это   -  person Mike Pollard    schedule 13.05.2013
comment
stackoverflow.com/questions/25787946/ Проверьте эту ссылку, чтобы получить решение   -  person iOSPrince    schedule 09.12.2014


Ответы (11)


Для iOS 8 используйте:

self.preferredContentSize = CGSizeMake(width, height);

Я поместил это в viewDidLoad.

Swift 3

self.preferredContentSize = CGSize(width: 100, height: 100)
person Erich    schedule 10.09.2014
comment
Как вы установите это в Интерфейсном Разработчике? - person Blip; 17.11.2014
comment
при миграции на iOS 8, как я могу изменить позицию? - person Vipin Vijay; 19.02.2015
comment
preferredContentSize представлен в iOS 7 - person Antoine; 14.03.2015
comment
Также работает для iOS9 + - person DevC; 25.05.2016
comment
Чтобы это сработало, мне пришлось использовать .modalPresentationStyle = .formSheet - person userx; 11.04.2018
comment
У меня не работает. После представления xib в виде таблицы форм я изменяю размер содержимого после ввода некоторых данных пользователем. Это не меняется, но если я поверну экран, он будет отражаться. Xcode 10 и iOS 12.1 - person Rajan Kambaliya; 20.03.2019
comment
Работал для меня (iOS 13), используя .modalPresentationStyle = .formSheet и контроллер представления в раскадровке с размером Freeform - person iosDev; 04.06.2020

В инспекторе атрибутов проверьте Use Preferred Explicit Size

введите описание изображения здесь

person avdyushin    schedule 13.07.2016
comment
Это работает, если вы устанавливаете презентацию на лист формы. - person Artur Friesen; 26.07.2017
comment
Как уменьшить прозрачность черного при представлении в виде листа формы? - person Satyam; 06.06.2020

Настройка preferredContentSize у меня не сработала на iOS 11, например, при презентации EKEventEditViewController.

Это работает, только если я переопределю геттер 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
        }
    }
}

введите здесь описание изображения  введите описание изображения здесь

person Gleb Tarasov    schedule 05.10.2017
comment
Избавьтесь от необязательного, используя let fullSize = super.preferredContentSize - person Grease; 14.03.2018

РЕДАКТИРОВАТЬ

Используйте 1_.

Старый

Вы можете попробовать это для просмотра в центре

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;
}];
person Toseef Khilji    schedule 14.08.2013
comment
По крайней мере, в iOS 7 это не работает - он показывает, что он отображается в полном размере, а затем сжимает его. Об этом свидетельствует блок «завершение». - person iOSProgrammingIsFun; 20.10.2013
comment
Чтобы выполнить это на iOS7, взгляните на этот stackoverflow.com/a/19026882/1363634 - person CoderPug; 16.01.2014

Я решил это как @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;
}
person orafaelreis    schedule 08.08.2014
comment
Создание проблемы при смене ориентации - person Vipin Vijay; 19.02.2015

Мое решение в значительной степени основано на других решениях, размещенных здесь, но поскольку мне пришлось попробовать много разных вещей, чтобы заставить его работать, я публикую его. Моя предназначена для iOS 10 с Swift 3.1 только в портретном режиме. (Не тестировалось в ландшафтном режиме) Целью моего решения было отобразить модальное окно, которое было меньше, чем представление представления, и чтобы я мог видеть представление представления в фоновом режиме.

Мне пришлось правильно настроить UIViewController в Интерфейсном Разработчике, иначе мой код не работал бы. Вот мои настройки. Я нашел свое решение для работы со стилями перехода Cross Dissolve и Cover 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
        }
    }
person Jacob F. Davis C-CISO    schedule 27.06.2017
comment
Важно отметить, что Over Full Screen - это стиль презентации, отличный от стиля Form Sheet, поэтому даже если ваш ответ может действительно помочь людям, которым лучше подходит Over Full Screen, вопрос конкретно касается последнего. Список всех параметров стиля модального представления см. На странице developer.apple.com/documentation/uikit / - person Magnus Lind Oxlund; 26.03.2018

Я обошел эту проблему, поместив свой контент в представление в модальном vc. Затем установите прозрачный фон vc и в настройках viewWillAppear прозрачный фон таблицы. Это означает, что вы видите только контент.

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

Я установил все это из раскадровки и использовал переход, если вы используете код, вам также нужно будет это установить.

parentViewController.modalPresentationStyle = UIModalPresentationPageSheet;
person Stuart Campbell    schedule 18.12.2013

Если вы используете представление в XIB, которое настроено как представление, представленное модально для контроллера представления. Очень простой способ исправить это - просто изменить метрики размера на Freeform (см. Рис. 1.0) и изменить размер представления так, как вы хотите. Представление будет отображаться с этими показателями при модальной загрузке.

Установка предпочтительного размера содержимого в моем случае не помогла, но это устранило мою проблему. Это

Рисунок 1.0:

введите здесь описание изображения

person Peter Suwara    schedule 11.07.2019

У меня также была эта проблема: вы должны изменить размер кадра супервизора после его представления.

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

Сообщение Эриха сработало для меня, но на iOS 10 с Swift 3 мне пришлось использовать:

self.preferredContentSize = CGSize(width, height)

Я тоже поместил это в viewdidload

Также, как сказал Авдюшин, я должен был поставить галочку Use Preferred Explicit Size.

person SomeGuy    schedule 15.01.2017

Очень простой способ - отредактировать это свойство в классе SheetViewController.

sheetController = SheetViewController(controller: paymentVC, sizes: [.fixed(400), .fixed(400)])
person Diego Salcedo    schedule 08.02.2021