Как resize UIModalPresentationFormSheet?

Я пытаюсь отобразить controller модального представления как 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); 

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

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

  1. В viewWillAppear:(BOOL)animated методе viewWillAppear:(BOOL)animated :

     [super viewWillAppear:animated]; //resize modal view self.view.superview.bounds = CGRectMake(0, 0, 432, 680); 
  2. В viewDidAppear:(BOOL)animated методе 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}. Идите фигуру.

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

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

  composeTweetController = [[ComposeTweet alloc] initWithNibName:@"ComposeTweet" bundle:nil]; composeTweetController.modalPresentationStyle = UIModalPresentationFormSheet; UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:composeTweetController]; navigationController.delegate = self; [self presentModalViewController:navigationController animated:YES]; 

И в classе controllerа ComposeTweet

 -(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; self.navigationController.view.superview.frame = CGRectMake(0, 0,500,400); } 

IOS 7

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

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

  1. представить controller представления (режим представления: UIModalPresentationFormSheet)
  2. установить цвет подсветки controllerа супервизора
  3. (если возможно, уменьшите его, а затем центрируйте его в режиме супервизора)

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

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

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

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

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

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

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

  • Переменные экземпляра для объектов Objective C
  • Круговые контрольные бары в IOS
  • Сохранить фотографии в пользовательский альбом в iPhones Photo Library
  • Как проверить локальный Wi-Fi (не только сотовую связь) с помощью iPhone SDK?
  • iOS: конвертировать UTC NSDate в локальный часовой пояс
  • UIScrollView - показывает полосу прокрутки
  • Объектив-C Категория Причинение непризнанного селектора
  • Автоматически запускать локальные уведомления ежедневно в динамическое время, заданное в массивах. objective ios
  • Сериализация и десериализация объектов Objective-C в JSON
  • UIDatePicker, устанавливающий максимальные и минимальные даты на основе сегодняшней даты
  • Как получить счетчик ссылок NSObject?
  • Давайте будем гением компьютера.