web-dev-qa-db-ja.com

フォームシートプレゼンテーションで読み込まれるモーダルビューのカスタムサイズ

フォームシートプレゼンテーションでiPadにUIViewControllerをロードしようとしています。問題は、この新しいビューのサイズです。サイズの値をIBuilderに入れますが、モーダルビューは固定値を取ります。

また、私はこのようにprepareForSegueでこれを作ろうとしました:

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

しかし、動作しません、何か助けがありますか?ありがとう!

35
Fran Fox

IOS 8の場合:

self.preferredContentSize = CGSizeMake(width, height);

これをviewDidLoadに配置しました。

Swift

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

[属性インスペクター]チェックUse Preferred Explicit Size

enter image description here

16
avdyushin

編集

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;
}];
7
Toseef Khilji

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

enter image description hereenter image description here

4
Gleb Tarasov

@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;
}
2
orafaelreis

私のソリューションは、ここに投稿された他のソリューションに大きく基づいていますが、実際に機能させるためにさまざまなことを試さなければならなかったため、投稿しています。私はiOS 10でSwift 3.1をポートレートモード専用アプリで使用します。(ランドスケープモードでは未テスト)。私のソリューションの目標は、表示ビューよりも小さいモーダルを表示することでした。バックグラウンドで表示ビューを見ることができるように。

Interface BuilderでUIViewControllerを適切に設定する必要があります。そうしないと、コードが機能しません。ここに私の設定があります。 _Cross Dissolve_と_Cover Vertical_の両方の遷移スタイルで動作するソリューションが見つかりました。 IBで私にとって重要だったのは、プレゼンテーション用の_Over Full Screen_だったと思います。この設定では、他の値で動作するようには見えませんでした。

IB Settings

モーダルで表示したいUIViewControllerのコードを次に示します。次に、他の場所でpresent(_:animated:completion:)を使用して呼び出します。また、VC私はモーダルに提示します、私はブールを持っています、didLayoutfalseとして初期化されます:

_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
        }
    }
_
2
Jacob Davis

モーダルvcのビュー内にコンテンツを配置することで、この問題を回避しました。次に、vcの背景を透明に設定し、viewWillAppearでフォームシートの背景を透明に設定します。つまり、コンテンツのみが表示されます。

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

すべてをストーリーボードから設定し、セグエを使用しました。コードを使用する場合は、これも設定する必要があります。

parentViewController.modalPresentationStyle = UIModalPresentationPageSheet;
1
Stuart Campbell

私もこの問題を抱えていました。スーパービューのフレームを表示した後、サイズを変更する必要があります。

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

View Controller用のモーダル表示ビューとして設定されているXIBのビューを使用している場合。これを修正する非常に簡単な方法は、サイズメトリックスをFreeform(図1.0を参照)に変更し、ビューを希望するサイズに変更することです。 。モーダリーをロードすると、これらのメトリックとともにビューが表示されます。

私の場合、優先コンテンツサイズの設定は役に立ちませんでしたが、これで問題が解決しました。それ

図1.0:

enter image description here

0
Peter Suwara

Erichの投稿は私のために働いたが、iOS 10ではSwift 3を使用しなければならなかった:

self.preferredContentSize = CGSize(width, height)

私もviewdidloadに配置しました

また、avdyushinが言ったように、私はUse Preferred Explicit Sizeボックス。

0
SomeGuy