2

私はしばらくの間、これについて壁に頭をぶつけてきました。Master-Detail SplitViewController をプレゼンテーション フレームワークとして使用する iPad アプリがあります。アプリが最初にロードされたときにログイン ダイアログを表示し、カスタム サイズにする必要があります。メイン ストーリーボードに UIViewController シーンを作成し、DetailController が最初に読み込まれるときに VC を読み込みます。

私が抱えている問題は、VC のサイズを完全に制御できないことです。ポートレートモードで表示するために、フォームシートとして定義しました。プレゼンテーションを FormSheet に設定しました。いくつかの異なる方法でサイズを明示的に設定しようとしましたが、まったく機能しません。

基本的な問題は、これらすべてが原因で、VCが常にフルスクリーンで縦向きに表示されることです。また、横向きに回転すると、縦向きモードのままで、左右に隙間が残り、ビューの上下が切り取られます。

これは信じられないほど苛立たしく、ここからどこへ行くべきか本当にわかりません. 興味深いのは、アプリが完全にロードされた後、タップを使用してまったく同じ種類の VC を表示することです。以下をセットアップとして使用すると、美しく表示されます。

MyViewController *itemDetails;

itemDetails = [Globals.storyboard   instantiateViewControllerWithIdentifier:@"MyViewController"];

itemDetails.itemImage.image = imageView.image;
itemDetails.jewelryObject = jewelryObject;

itemDetails.delegate = self;

itemDetails.modalPresentationStyle = UIModalPresentationPageSheet;
itemDetails.modalTransitionStyle = UIModalTransitionStyleCoverVertical;

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:itemDetails];

itemDetails.navigationItem.title = jewelryObject.itemDescription;

[navigationController setModalPresentationStyle:UIModalPresentationFormSheet];

[self presentViewController:navigationController animated:YES completion:nil];

navigationController.view.superview.autoresizingMask =
    UIViewAutoresizingFlexibleTopMargin |
    UIViewAutoresizingFlexibleBottomMargin;

navigationController.view.superview.frame = CGRectMake(
    itemDetails.view.superview.frame.origin.x,
    itemDetails.view.superview.frame.origin.y,
    540.0f,
    450.0f
    );
navigationController.view.superview.center = self.view.center;

self.itemDetails = itemDetails;

言葉に出来ないほどの悔しさです。私は iOS 向けのプログラミングが大好きですが、時折、世捨て人になりたいと思う瞬間があります。「あっ!」という人がいたら 彼らが私に投げかけることができる洞察、私は本当に感謝しています.

4

2 に答える 2

5

OK、そう...これは技術的にサポートされていません。特定のサイズで何かを提示する公式の方法はありません。したがって、この質問に対する本当の答えは、Appleにレーダーを提出することです。

しかし...それは可能です。ただし、以下のコードがわからない場合は、使用しないでください。こんなふうになります:

#import <objc/runtime.h>

UIViewController *viewControllerToPresent = /* ... */;
viewControllerToPresent.modalPresentationStyle = UIModalPresentationFormSheet;

Ivar instanceVar = class_getInstanceVariable([UIViewController class], "_formSheetSize");
if (instanceVar) {
    ptrdiff_t offset = ivar_getOffset(instanceVar);
    CGSize *offsetVCPtr = (CGSize*)(((uintptr_t)(__bridge void*)viewControllerToPresent) + offset);
    *offsetVCPtr = size;
}

// Present as usual with presentViewController:animated:completion:

それは醜いですが、それは動作します。App Storeアプリでこれを行うことは特にお勧めしません。これは、このようなものでレビューを通過できない可能性があるためです。自己責任!あなたの質問に対する本当の答えを覚えておいてください-それは既存のAPIではできません。

于 2013-01-18T22:39:12.673 に答える
1

さて、ついに UISplitViewController を正しく使用する方法を理解したので、カスタマイズされた VC を使ってこのように踊ることはすべて無駄でした。[UISplitViewController presentViewController:animated:completion] を呼び出すのは、すべての基本構造が Detail Controller に設定された後です。

私はしばらくの間、本当にいじっていました。しかし、それは今働いているので... 勝つ!;-)

ご協力いただきありがとうございます。本当に感謝しています。あなたは私の車輪を回してくれました。それが私が必要としていたものです。私自身の好奇心を満たし、矢筒に別の矢を追加するためだけに、別の時点であなたの提案を試してみます.

再度、感謝します!

于 2013-01-19T11:36:47.877 に答える