UIModalPresentationFormSheet представление изменения размера - PullRequest
43 голосов
/ 24 ноября 2010

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

Так что есть либо UIModalPresentationFormSheet с фиксированным размером просмотра или полным просмотром, и я за чем-то промежуточным.

Ответы [ 6 ]

71 голосов
/ 31 января 2011
MyModalViewController *targetController = [[[MyModalViewController alloc] init] autorelease]; 

targetController.modalPresentationStyle = UIModalPresentationFormSheet;

targetController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;

[self presentModalViewController:targetController animated:YES];

// it is important to do this after presentModalViewController:animated:
targetController.view.superview.bounds = CGRectMake(0, 0, 200, 200);
4 голосов
/ 22 сентября 2014

В ios8 и более ранних работах:

AboutViewController * _aboutViewController = [[AboutViewController alloc] init];
    _aboutViewController.modalPresentationStyle = UIModalPresentationFormSheet;
    if(IS_IOS8)
    {
        _aboutViewController.preferredContentSize = CGSizeMake(300, 300);
    }
    [self presentViewController:_aboutViewController animated:YES completion:nil];

В AboutViewController.m

- (void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];

    if(!IS_IOS8)
    {
        self.view.superview.bounds = CGRectMake(0, 0, 300, 300);
    }
}

IS_IOS8

#define IS_IOS8 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8)

В iOS 8 вы также можете использовать UIPresentationController, который дает вам больше возможностей для настройки.

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

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

Протестировано в iOS 5.1 - 6.1, с использованием XCode 4.62

MyModalViewController *targetController = [[[MyModalViewController alloc] init] autorelease];
targetController.modalPresentationStyle = UIModalPresentationFormSheet;
targetController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;  //transition shouldn't matter
[self presentModalViewController:targetController animated:YES];
targetController.view.superview.frame = CGRectMake(0, 0, 200, 200);//it's important to do this after presentModalViewController
targetController.view.superview.center = GPointMake(roundf(self.view.center.x), roundf(self.view.center.y));//self.view assumes the base view is doing the launching, if not you might need self.view.superview.center etc.

Обновление Предпочтительный метод представления контроллера представления iOS 6.0 также работает правильно:

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion
3 голосов
/ 26 сентября 2014

Для iOS 8, просто внедрите метод делегата (CGSize) prefeContentSize на каждом контроллере представления.Это должно решить все проблемы с размером.

2 голосов
/ 18 октября 2011

Просто в меру решение Fatos (отличное решение) Если вы создаете контроллер представления, используя файл .xib после alloc initWithNibName, вы можете сохранить рамку вида:

CGRect myFrame = targetController.view.frame;
...
targetController.view.superview.bounds = myFrame;

А затем используйте его для superview.bounds, так что будет использоваться размер представления в .xib, и вы сможете изменить размер более визуально.

0 голосов
/ 23 июля 2012

Я поместил этот код в контроллер вида листа:

-(void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    self.view.superview.bounds = CGRectMake(0, 0, 540, 500);  // your size here
}

Обратите внимание, что изменение размера происходит достаточно рано, чтобы анимация презентации выглядела правильно.

...