Как изменить размер UIModalPresentationFormSheet?

Я пытаюсь отобразить контроллер модального представления как UIPresentationFormSheet. Появится представление, но я не могу изменить его размер. Мой XIB имеет правильную высоту и ширину, но кажется, что он переопределяется, когда я называю это следующим образом:

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

Любые мысли? Я использую iPhone SDK 3.2 beta 4

Ответ 1

Вы можете настроить кадр модального представления после его представления:

Протестировано в 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];
}

Ответ 2

Здесь используется метод, который работает на 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);
    }
}

Ответ 3

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 position also, then:
composeTweetViewController.view.superview.frame = CGRectMake(0, 0, 320, 480);

Ответ 4

Начиная с iOS7 вы можете просто сделать

composeTweetController.preferredContentSize = CGSizeMake(380.0, 550.0);

Ответ 5

Протестировано и работает для iOS 6, используя XCode 4.5

Я наткнулся на свой ответ, прочитав здесь много советов:

  • В методе 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;
    

Я попытался добавить центрирующий код в том же месте, что и код изменения размера, но это не сработало. По какой-то причине он работает только после того, как представление появилось на экране.

Я предполагаю, что это имеет какое-то отношение к тому, как работает UIModalPresentationFormSheet, потому что когда я проходил через отладчик LLDB, я заметил, что существует переменная _formSheetSize, которая все еще {540, 620}. Наведите указатель мыши.

Ответ 6

Это будет работать с любым 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;
}

Ответ 7

Следующим первым кодом является представление диспетчера представлений модели

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

Ответ 8

iOS 7

Итак, подход установки рамки или границ супервизора больше не работает на iOS 7 (для UIModalTransitionStyleCoverVertical). Тем не менее, вы можете теперь установить цвет фона супервизора, чтобы очистить его, а затем измените кадр контроллера модального представления, как вы считаете нужным.

Итак, в iOS 7 вам нужно:

  • представляет контроллер представления (режим представления: UIModalPresentationFormSheet)
  • установить цвет подсветки контроллера супервизора для очистки.
  • измените рамку просмотра контроллера по желанию (возможно, уменьшив его, а затем центрируя его в режиме просмотра)

Ответ 9

Я получил полноэкранный модальный вид из UIPresentationFormSheet только с этой строкой:

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

Ответ 10

@bdrobert, к сожалению, ваше приятное решение больше не работает на iOS6 - контейнер сохраняет исходный размер, даже если новый контроллер представлений встроен с нестандартным размером.

Вероятно, вам нужно использовать API-интерфейс сдерживания, введенный в iOS5, но вам нужно добавить собственный тусклый фон, извлекая все события касания для этой области.

Ответ 11

При изменении ориентации этот код работает отлично.

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

Ответ 12

Размер вида фиксирован. Вам нужно будет реализовать вещи самостоятельно, если вы хотите что-то другое.