iOS - Как вы управляете размером модального контроллера просмотра?

StackOverflow https://stackoverflow.com/questions/4231022

  •  26-09-2019
  •  | 
  •  

Вопрос

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

Редактировать: У меня есть следующее в контроллере модального просмотра. Это не помогает.

- (void)viewDidLoad {
    TestResultView *trv = [[TestResultView alloc]initWithTest: [Model m].currentTest];
    self.view = trv;
    trv.frame = CGRectMake(0, 320, 320, 160);
    [trv release];
    [super viewDidLoad];
}
Это было полезно?

Решение

Вы можете изменить кадр контроллера просмотра, но если вы используете UIViewController's -PresentmodalviewController: Animated: метод, вид позади будет выгружен после того, как ваше модальное представление будет завершено анимированием на экране (это предполагает, что вы на iPhone) И вы увидите белый экран, где должен быть вид вашего фона. IOS предполагает, что ваш контроллер модального представления будет полноэкранным контроллером просмотра и сбрасывает другое представление для сохранения памяти.

Если вы действительно хотите показать представление над частью экрана, вы должны вместо этого добавить UIView (NO 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;

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

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

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

Другие советы

Это приятно, вышеприменинный ответ объясняет хороший взлом для представления субвезонных представлений, которые чувствуют себя как ModalViews, но что, если это iPad, и я действительно могу дать ему ModalViewController, который не покрывает весь экран.

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

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

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

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.

Я бы добавил ответ @ 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 после отображения модального представления.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top