web-dev-qa-db-ja.com

UIModalPresentationFormSheetのサイズを変更する方法は?

モーダルビューコントローラーをUIPresentationFormSheetとして表示しようとしています。ビューは表示されますが、サイズを変更することはできません。私のXIBには適切な高さと幅がありますが、次のように呼び出すとオーバーライドされるようです:

composeTweetController = [[ComposeTweet alloc] initWithNibName:@"ComposeTweet" bundle:nil];
composeTweetController.modalPresentationStyle = UIModalPresentationFormSheet;
[self presentModalViewController:composeTweetController animated:TRUE];

何かご意見は? iPhone SDK 3.2 beta 4を使用しています

44
Sheehan Alam

モーダルビューのフレームは、表示後に調整できます。

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];
}
91
Brody Robertson

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);
    }
}
13
psy
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);
12
Skullhouseapps

IOS7の時点で、あなたは単にできる

composeTweetController.preferredContentSize = CGSizeMake(380.0, 550.0);
9
Ed Filowat

最初のコードに従って、モデルビューコントローラーを表示する方法を示します

 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);
}
4
Chathurka

これはどの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;
}
4
john07

XCode 4.5を使用してiOS 6でテストおよび動作

ここでヒントの多くを読んだ後、私は答えにつまずいた:

  1. viewWillAppear:(BOOL)animatedメソッド内:

    _[super viewWillAppear:animated];
    
     //resize modal view
     self.view.superview.bounds = CGRectMake(0, 0, 432, 680);
    _
  2. 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の動作方法と関係があると思います。図を移動します。

4
Jon

iOS 7

したがって、スーパービューのフレームまたは境界を設定するアプローチは、iOS 7では動作しません(UIModalTransitionStyleCoverVerticalの場合)。ただし、スーパービューの背景色をクリアするように設定し、モーダルビューコントローラのフレームを適切に表示する方法を変更できます。

したがって、iOS 7では次のことが必要になります。

  1. view Controllerを提示します(提示モード:UIModalPresentationFormSheet)
  2. view Controllerのスーパービューの背景色をクリアに設定します
  3. 必要に応じてView Controllerのフレームを変更します(おそらく、小さくしてからスーパービューの中央に配置します)
3
Spencer Hall

@bdrobert残念ながら、あなたのNiceソリューションはiOS6では動作しません-新しいviewcontrollerがカスタムサイズで埋め込まれていても、コンテナは元のサイズを維持します。

おそらくiOS5で導入された包含APIを使用する必要がありますが、淡色の背景を自分で追加して、そのエリアのすべてのタッチイベントを取得する必要があります。

2
Oliver Michalak

UIPresentationFormSheetから次の行だけで全画面のモーダルビューを取得しました。

modalViewController.view.superview.bounds = CGRectMake(0, 0, 1024, 748);
2
miguel.rodelas

向きを変えると、このコードは完璧に機能します。

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;
    }
0
Anand Mishra