iOS - как вы контролируете размер контроллера модального вида? - PullRequest
30 голосов
/ 20 ноября 2010

Я представляю модальный контроллер вида.Если это имеет значение, оно прокручивается снизу вверх.Как я могу контролировать, какую часть экрана он занимает?

РЕДАКТИРОВАТЬ: У меня есть следующее в модальном контроллере представления.Это не помогает.

- (void)viewDidLoad {
    TestResultView *trv = [[TestResultView alloc]initWithTest: [Model m].currentTest];
    self.view = trv;
    trv.frame = CGRectMake(0, 320, 320, 160);
    [trv release];
    [super viewDidLoad];
}

Ответы [ 3 ]

38 голосов
/ 20 ноября 2010

Вы можете изменить фрейм контроллера представления, но если вы используете -presentModalViewController UIViewController: animated: метод, представление позади будет выгружено, как только ваше модальное представление завершит анимацию на экране (Предполагается, что вы включены iPhone), и вы увидите белый экран, где ваш фоновый вид должен быть. iOS предполагает, что ваш контроллер модального представления будет контроллером полноэкранного просмотра, и сбрасывает другое представление для экономии памяти.

Если вы действительно хотите показать вид на части экрана, вам следует вместо этого добавить UIView (без UIViewController) к текущему представлению UIViewController в качестве подпредставления, а затем анимировать его на экране самостоятельно. Я думаю, что-то вроде этого будет работать в вашем классе UIViewController, который представит представление:

// Add the view as a subview and position it offscreen just below the current view
UIView *myHalfView = [[UIView alloc] initWithFrame:someAppropriateFrame];
[self.view addSubview:myHalfView];
CGRect offScreenFrame = myHalfView.bounds;
offScreenFrame.origin = CGPointMake(0.0, CGRectGetMaxY(self.view.frame));

// Now animate the view upwards
[UIView beginAnimations:nil context:nil];
// Move the view upwards the height of your sliding view so it's entirely onscreen
myHalfView.center = CGPointMake(myHalfView.center.x, myHalfView.center.y - myHalfView.bounds.size.height);
[UIView commitAnimations];
[myHalfView release];

Для получения бонусных баллов вы можете постепенно увеличить изображение, установив

myHalfView.alpha = 0.0;

перед блоком анимации UIView и настройка

myHalfView.alpha = 1.0;

внутри блока после анимации свойства center.

Когда вы закончите, вы можете сделать что-то похожее, но в обратном порядке, чтобы переместить вид за экран. Вы можете добавить селектор animationDidStop в блок анимации UIView, чтобы получать уведомления, когда представление сдвинулось с экрана, чтобы вы могли удалить его из иерархии представления.

С эстетической точки зрения, вы также должны быть осторожны, как вы это делаете, поскольку скольжение вида вверх является стандартным поведением, и если ваш вид выглядит как обычный вид, но останавливается на полпути, пользователи могут чувствовать (даже кратко) что приложение заморожено. Они поймут это, но это оставит плохое предчувствие по поводу вашего приложения, если не обращаться с ним осторожно. Главным образом, я бы не использовал стандартные полноэкранные подсказки, такие как UINavigationController вверху вашего обзора, чтобы помочь пользователям понять, что происходит. Половинные листы, как правило, являются UIActionSheets на iPhone, так что подумайте в этом направлении.

26 голосов
/ 15 июля 2011

Это хорошо, вышеупомянутый принятый ответ объясняет хороший способ представить subViews, которые похожи на ModalView, но что, если это iPad, и я действительно могу дать ему modalViewController, который не покрывает весь экран.

В случае iPad, я не думаю, что нижнее представление будет выгружено.(потому что есть варианты, где мы можем представить modalView на iPad, который не покрывает весь экран)

В конце концов, ModalViewController - это сам контроллер, и, как и любой другой контроллер, имеет корневой вид, свойства которогоотредактировано, если мы можем получить это.

Вот что даст вам пользовательский кадр ModalView:

MyViewController *viewController = [[MyViewController alloc] init];
viewConroller.modalPresentationStyle = UIModalPresentationFormSheet;
[self presentModalViewController:viewController animated:YES];
    //superView of viewController's view is modalViewController's view, which we were after
viewController.view.superview.frame = CGRectMake(x,y,w,h);
    //x y w h - can have desired values.
20 голосов
/ 16 ноября 2011

Я бы добавил к ответу @ dsaw, что суперпредставление модального вида, похоже, не вращает свою систему координат в ландшафтном режиме. Вот код, который я использовал в своем собственном приложении:

MyViewController* modalVC = [[MyViewController alloc] init];        
modalVC.modalPresentationStyle = UIModalPresentationFormSheet;
[self presentModalViewController:modalVC animated:NO];
CGRect r = CGRectMake(self.view.bounds.size.width/2 - 236,
                      self.view.bounds.size.height/2 - 130,
                      472, 260);
r = [self.view convertRect:r toView:modalVC.view.superview.superview];
modalVC.view.superview.frame = r;

Несмотря на то, что суперпредставление может не вращаться на iPad, оно, похоже, работает правильно и сохраняет центрирование модального вида, если я поворачиваю iPad после отображения модального вида.

...