フォームシートプレゼンテーションでiPadにUIViewControllerをロードしようとしています。問題は、この新しいビューのサイズです。サイズの値を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)
編集
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
の設定は機能しませんでした。
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
}
}
}
@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;
}
私のソリューションは、ここに投稿された他のソリューションに大きく基づいていますが、実際に機能させるためにさまざまなことを試さなければならなかったため、投稿しています。私はiOS 10でSwift 3.1をポートレートモード専用アプリで使用します。(ランドスケープモードでは未テスト)。私のソリューションの目標は、表示ビューよりも小さいモーダルを表示することでした。バックグラウンドで表示ビューを見ることができるように。
Interface BuilderでUIViewControllerを適切に設定する必要があります。そうしないと、コードが機能しません。ここに私の設定があります。 _Cross Dissolve
_と_Cover Vertical
_の両方の遷移スタイルで動作するソリューションが見つかりました。 IBで私にとって重要だったのは、プレゼンテーション用の_Over Full Screen
_だったと思います。この設定では、他の値で動作するようには見えませんでした。
モーダルで表示したい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
}
}
_
モーダルvcのビュー内にコンテンツを配置することで、この問題を回避しました。次に、vcの背景を透明に設定し、viewWillAppearでフォームシートの背景を透明に設定します。つまり、コンテンツのみが表示されます。
// In Modal vc
- (void)viewWillAppear:(BOOL)animated
{
self.view.superview.backgroundColor = [UIColor clearColor];
[super viewWillAppear:animated];
}
すべてをストーリーボードから設定し、セグエを使用しました。コードを使用する場合は、これも設定する必要があります。
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
に配置しました
また、avdyushinが言ったように、私はUse Preferred Explicit Size
ボックス。