Отображение размера UIModalPresentationFormSheet
Мне интересно узнать, как я могу изменить размер представления при использовании UIModalPresentationFormSheet
modalPresentationStyle
, похоже, что он имеет фиксированный размер, поэтому мне было интересно, удалось ли кому-то из них управлять всплывающим представлением из определение размеров.
Таким образом, существует либо UIModalPresentationFormSheet
с фиксированным размером представления или полными представлениями, и я за чем-то между ними.
Ответы
Ответ 1
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);
Ответ 2
Вы можете настроить кадр модального представления после его представления:
Протестировано в 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 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
В 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
Для iOS 8 просто реализуйте метод делегата (CGSize) preferredContentSize на каждом контроллере представления. Он должен решить все проблемы с размером.
Ответ 5
Просто для решения Fatos (отличный)
Если вы создаете контроллер вида с использованием файла .xib после выделения initWithNibName, вы можете сохранить рамку представления:
CGRect myFrame = targetController.view.frame;
...
targetController.view.superview.bounds = myFrame;
И затем используйте его для superiew.bounds, поэтому размер представления в .xib будет использоваться, и вы можете изменить размер более визуально.
Ответ 6
Я помещаю этот код в контроллер представления вида листа:
-(void) viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.view.superview.bounds = CGRectMake(0, 0, 540, 500); // your size here
}
Обратите внимание, что изменение размера происходит достаточно рано, чтобы анимация презентации выглядела правильно.