Ответ 1
Для iOS 8 используйте:
self.preferredContentSize = CGSizeMake(width, height);
Я разместил это в viewDidLoad
.
Swift 3
self.preferredContentSize = CGSize(width: 100, height: 100)
Я пытаюсь загрузить UIViewController в iPad с презентацией формы листа. Проблема в размере этого нового представления, я ставлю значения размера в IBuilder, но модальное представление принимает фиксированное значение.
Также я попытался сделать это в prepareForSegue следующим образом:
HelpViewController *viewController = segue.destinationViewController;
viewController.view.superview.frame = CGRectMake(0, 0, 200, 200);
Но не работайте, никакой помощи? Спасибо!
Для iOS 8 используйте:
self.preferredContentSize = CGSizeMake(width, height);
Я разместил это в viewDidLoad
.
self.preferredContentSize = CGSize(width: 100, height: 100)
В тесте инспектора атрибутов Use Preferred Explicit Size
РЕДАКТИРОВАТЬ
Используй 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;
}];
Настройка 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
}
}
}
Я решил это, как @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;
}
Мое решение основано в основном на других решениях, размещенных здесь, но поскольку мне пришлось попробовать много разных вещей, чтобы заставить его фактически работать, я отправляю его. Mine для iOS 10 с Swift 3.1 в приложении только портретного режима. (Непроверенный в ландшафтном режиме) Цель моего решения заключалась в том, чтобы показать модальный, который был меньше, чем представление представления, и чтобы я мог видеть представление в фоновом режиме.
Мне нужно было настроить UIViewController правильно в Interface Builder, иначе мой код не сработает. Вот мои настройки. Я нашел свое решение для работы с стилями перехода 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
}
}
Я столкнулся с этой проблемой, поставив свой контент внутри представления в modal vc. Затем, устанавливая прозрачный фон vc и в настройках viewWillAppear, прозрачный фон формы. Это означает, что вы видите только контент.
// In Modal vc
- (void)viewWillAppear:(BOOL)animated
{
self.view.superview.backgroundColor = [UIColor clearColor];
[super viewWillAppear:animated];
}
Я установил все это из раскадровки и использовал segue, если вы используете код, вам также нужно установить это.
parentViewController.modalPresentationStyle = UIModalPresentationPageSheet;
У меня также была эта проблема, вы должны изменить размер рамки представления после ее представления.
HelpViewController *viewController = segue.destinationViewController;
viewController.modalPresentationStyle = UIModalPresentationPageSheet;
[self presentViewController:viewController animated:YES completion:nil];
viewController.view.superview.frame = CGRectMake(0, 0, 200, 200);
Сообщение Erich работало для меня, но на iOS 10 с Swift 3 мне пришлось использовать:
self.preferredContentSize = CGSize(width, height)
Я тоже разместил его в viewdidload
Кроме того, как сказал авдюшин, мне пришлось проверить поле Use Preferred Explicit Size
.
Если вы используете представление в XIB, которое установлено как модально представленное представление для контроллера представления. Очень простой способ исправить это - просто изменить метрику размера на Freeform (см. Рис. 1.0) и изменить размер представления так, как вы хотите. Представление будет отображаться с этими показателями при загрузке модально.
Установка предпочтительного размера контента не помогла в моем случае, но это устранило мою проблему. Это
Рисунок 1.0: