Подтвердить что ты не робот

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

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

Также я попытался сделать это в prepareForSegue следующим образом:

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

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

4b9b3361

Ответ 1

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

self.preferredContentSize = CGSizeMake(width, height);

Я разместил это в viewDidLoad.

Swift 3

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

Ответ 2

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

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

Ответ 3

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

Используй 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;
}];

Ответ 4

Настройка 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
        }
    }
}

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

Ответ 5

Я решил это, как @Stuart Campbell и @Viruss mca.

Edited

После комментария @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;
}

Ответ 6

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

Мне нужно было настроить UIViewController правильно в Interface Builder, иначе мой код не сработает. Вот мои настройки. Я нашел свое решение для работы с стилями перехода Cross Dissolve и Cover Vertical. Я думаю, что ключ для меня в IB был Over Full Screen для презентации - он, похоже, не работал с некоторыми другими значениями для этого параметра.

Настройки IB

Вот код в 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
        }
    }

Ответ 7

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

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

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

parentViewController.modalPresentationStyle = UIModalPresentationPageSheet;

Ответ 8

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

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

Ответ 9

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

self.preferredContentSize = CGSize(width, height)

Я тоже разместил его в viewdidload

Кроме того, как сказал авдюшин, мне пришлось проверить поле Use Preferred Explicit Size.

Ответ 10

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

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

Рисунок 1.0:

enter image description here