Как изменить размер UIModalPresentationFormSheet? - PullRequest
44 голосов
/ 16 марта 2010

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

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

Есть мысли? Я использую iPhone SDK 3.2 beta 4

Ответы [ 12 ]

91 голосов
/ 24 ноября 2010

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

Протестировано в 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];
}
13 голосов
/ 10 декабря 2013

Вот метод, который работает на 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);
    }
}
12 голосов
/ 17 февраля 2011

<code>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);
9 голосов
/ 01 апреля 2015

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

composeTweetController.preferredContentSize = CGSizeMake(380.0, 550.0);
4 голосов
/ 09 октября 2013

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

 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 голосов
/ 08 октября 2013

Это будет работать с любым 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 голосов
/ 03 октября 2012

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

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

  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;
    

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

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

3 голосов
/ 21 сентября 2013

iOS 7

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

Итак, в iOS 7 вы захотите:

  1. представить контроллер представления (режим представления: UIModalPresentationFormSheet)
  2. установить цвет фона Superview контроллера представления, чтобы очистить
  3. изменить контроллер фрейма по желанию (возможно, уменьшив его, а затем отцентрировав его в суперпредставлении)
2 голосов
/ 24 сентября 2012

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

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

2 голосов
/ 20 июня 2012

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

modalViewController.view.superview.bounds = CGRectMake(0, 0, 1024, 748);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...