Как изменить размер 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
Размер вида фиксирован. Вам нужно будет реализовать вещи самостоятельно, если вы хотите что-то другое.