モーダルビューコントローラーをUIPresentationFormSheetとして表示しようとしています。ビューは表示されますが、サイズを変更することはできません。私のXIBには適切な高さと幅がありますが、次のように呼び出すとオーバーライドされるようです:
composeTweetController = [[ComposeTweet alloc] initWithNibName:@"ComposeTweet" bundle:nil];
composeTweetController.modalPresentationStyle = UIModalPresentationFormSheet;
[self presentModalViewController:composeTweetController animated:TRUE];
何かご意見は? iPhone SDK 3.2 beta 4を使用しています
モーダルビューのフレームは、表示後に調整できます。
iOS 5.1-7.1でテスト済み
MyModalViewController *targetController = [[[MyModalViewController alloc] init] autorelease];
targetController.modalPresentationStyle = UIModalPresentationFormSheet;
targetController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; //transition shouldn't matter
[self presentViewController:targetController animated:YES completion:nil];
if(floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1){
targetController.view.superview.frame = CGRectInset(targetController.view.superview.frame, 100, 50);
}else{
targetController.view.frame = CGRectInset(targetController.view.frame, 100, 50);
targetController.view.superview.backgroundColor = [UIColor clearColor];
}
iOS7およびiOS5およびiOS6で機能するメソッドは次のとおりです。(arc)
-(void)presentController:(UIViewController*)controller fromRootController:(UIViewController*)rootController withSize:(CGSize)size
{
UINavigationController* nav = [[UINavigationController alloc] initWithRootViewController:controller];
nav.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
nav.modalPresentationStyle = UIModalPresentationFormSheet;
[rootController presentModalViewController:nav animated:YES];
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
{
nav.view.superview.backgroundColor = [UIColor clearColor];
nav.view.bounds = CGRectMake(0, 0, size.width, size.height);
}
else
{
nav.view.superview.bounds = CGRectMake(0, 0, size.width, size.height);
}
}
composeTweetController = [[ComposeTweet alloc] initWithNibName:@"ComposeTweet" bundle:nil];
composeTweetController.modalPresentationStyle = UIModalPresentationFormSheet;
[self presentModalViewController:composeTweetController animated:TRUE];
//if you want to change its size but the view will remain centerd on the screen in both portrait and landscape then:
composeTweetViewController.view.superview.bounds = CGRectMake(0, 0, 320, 480);
//or if you want to change it's position also, then:
composeTweetViewController.view.superview.frame = CGRectMake(0, 0, 320, 480);
IOS7の時点で、あなたは単にできる
composeTweetController.preferredContentSize = CGSizeMake(380.0, 550.0);
最初のコードに従って、モデルビューコントローラーを表示する方法を示します
composeTweetController = [[ComposeTweet alloc] initWithNibName:@"ComposeTweet" bundle:nil];
composeTweetController.modalPresentationStyle = UIModalPresentationFormSheet;
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:composeTweetController];
navigationController.delegate = self;
[self presentModalViewController:navigationController animated:YES];
そして、ComposeTweetコントローラークラスで
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.navigationController.view.superview.frame = CGRectMake(0, 0,500,400);
}
これはどのUIModalTransitionStyle
でも動作します
@interface BaseDialog ()
@property(nonatomic,assign) CGRect origFrame;
@end
@implementation BaseDialog
-(void)viewDidLoad{
[super viewDidLoad];
self.origFrame=self.view.frame;
}
-(CGSize)formSheetSize{
return self.origFrame.size;
}
XCode 4.5を使用してiOS 6でテストおよび動作
ここでヒントの多くを読んだ後、私は答えにつまずいた:
viewWillAppear:(BOOL)animated
メソッド内:
_[super viewWillAppear:animated];
//resize modal view
self.view.superview.bounds = CGRectMake(0, 0, 432, 680);
_
viewDidAppear:(BOOL)animated
メソッド内:
_CGPoint centerPoint = CGPointMake([[UIScreen mainScreen] bounds].size.width/2, [[UIScreen mainScreen] bounds].size.height/2);
self.view.superview.center = centerPoint;
_
サイズ変更コードと同じ場所にセンタリングコードを追加しようとしましたが、うまくいきませんでした。何らかの理由で、ビューが画面に表示された後にのみ機能します。
LLDBデバッガーをステップスルーしているときに、まだ{540、620}の変数_formSheetSizeがあることに気付いたので、UIModalPresentationFormSheetの動作方法と関係があると思います。図を移動します。
iOS 7
したがって、スーパービューのフレームまたは境界を設定するアプローチは、iOS 7では動作しません(UIModalTransitionStyleCoverVerticalの場合)。ただし、スーパービューの背景色をクリアするように設定し、モーダルビューコントローラのフレームを適切に表示する方法を変更できます。
したがって、iOS 7では次のことが必要になります。
@bdrobert残念ながら、あなたのNiceソリューションはiOS6では動作しません-新しいviewcontrollerがカスタムサイズで埋め込まれていても、コンテナは元のサイズを維持します。
おそらくiOS5で導入された包含APIを使用する必要がありますが、淡色の背景を自分で追加して、そのエリアのすべてのタッチイベントを取得する必要があります。
UIPresentationFormSheet
から次の行だけで全画面のモーダルビューを取得しました。
modalViewController.view.superview.bounds = CGRectMake(0, 0, 1024, 748);
向きを変えると、このコードは完璧に機能します。
settingViewController.modalPresentationStyle = UIModalPresentationFormSheet;
[self presentViewController:settingViewController animated:YES completion:nil];
settingViewController.view.superview.frame = CGRectMake(0, 0, 700, 700);
UIInterfaceOrientation currentOrientation = [self getDeviceOrientation];
if(currentOrientation == UIInterfaceOrientationPortrait || currentOrientation == UIInterfaceOrientationPortraitUpsideDown)
{
CGPoint centerPoint = CGPointMake([[UIScreen mainScreen] bounds].size.width/2, [[UIScreen mainScreen] bounds].size.height/2);
settingViewController.view.superview.center = centerPoint;
}
else
{
CGPoint centerPoint = CGPointMake([[UIScreen mainScreen] bounds].size.height/2, [[UIScreen mainScreen] bounds].size.width/2);
settingViewController.view.superview.center = centerPoint;
}