Подтвердить что ты не робот

IOS - как вы контролируете размер модального контроллера?

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

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

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

Ответ 1

Вы можете изменить фрейм контроллера вида, но если вы используете UIViewController -presentModalViewController: анимированный: метод, представление позади будет выгружено после того, как ваше модальное представление закончит анимацию на экране (это предполагает, что вы находитесь на 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 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 в верхней части вашего представления, чтобы помочь пользователям понять, что происходит. Полуфайлы, как правило, являются UIActionSheets на iPhone, поэтому подумайте в этом направлении.

Ответ 2

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

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

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

Вот что даст вам настраиваемый фрейм ModalView:

MyViewController *viewController = [[MyViewController alloc] init];
viewConroller.modalPresentationStyle = UIModalPresentationFormSheet;
[self presentModalViewController:viewController animated:YES];
    //superView of viewController view is modalViewController view, which we were after
viewController.view.superview.frame = CGRectMake(x,y,w,h);
    //x y w h - can have desired values.

Ответ 3

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