iOS - Как вы управляете размером модального контроллера просмотра?
-
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 после отображения модального представления.