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

Как я могу использовать UIModalTransitionStylePartialCurl в UIView, который НЕ занимает весь экран?

В официальном приложении Apple Maps для iPhone есть маленькая кнопка "скручивание страницы" в нижнем правом углу. Когда вы нажимаете его, сама карта отслаивается, чтобы показать некоторые параметры. Я хотел бы дублировать этот эффект в своем приложении.

Я пытаюсь использовать UIModalTransitionStylePartialCurl (добавлено в SDK 3.2). Что касается его компоновки, то мое приложение почти точно похоже на приложение Apple Maps Maps. Я могу легко получить экран ENTIRE, чтобы отслаиваться, показывая другой вид внизу, но я не хочу этого. Я хочу ТОЛЬКО просмотр карты, чтобы отслаиваться.

Чтобы создать этот эффект, вы должны иметь UIViewController, который будет выполнять переход. Если я настрою это представление UIViewController на небольшое подвью где-то на экране, которое не занимает весь экран, я могу получить только этот подпункт, чтобы отслаиваться. Это здорово! Однако после второй части перехода (когда страница снова встает на место), представления никогда не начинаются. Либо представление, которое отслаивается назад, переместится из его исходного положения, или обнаруженное представление будет расширено, чтобы охватить весь экран.

Есть ли очевидная ошибка, которую я делаю? Я был бы очень признателен за любую помощь!

Код, который я использую, очень прост. Это в основном просто:

underMapViewController.modalTransitionStyle = UIModalTransitionStylePartialCurl;

[curlableMapViewController presentModalViewController:underMapViewController animated:YES];
4b9b3361

Ответ 1

Из Documentation:

UIModalTransitionStylePartialCurl

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

Этот стиль перехода поддерживается только в том случае, если родительский контроллер представления представляет полноэкранное представление, и вы используете стиль модульной презентации UIModalPresentationFullScreen. Попытка использовать другой форм-фактор для родительского представления или другого стиля презентации вызывает исключение.

Хотя, у меня нет никаких исключений, используя другие презентации, чем полный экран. Я тестировал, и у меня такая же проблема, как и вы. Я обнаружил, что если мое представление ParentViewController является ImageView, и я установил режим содержимого в UIViewContentModeCenter, представление не будет изменено или изменено. Возможно, есть обходное решение, сохраняя ваше текущее представление в виде изображения, помещая его вверху, делайте завиток, и после того, как вы упустите свой модальный, измените беспорядочный скрытый материал и удалите верхний вид изображения. Я знаю, что это звучит безумно, но это то, что я постараюсь, если мне действительно нужно выполнить это требование.

Надеюсь, это поможет, Хорхе.

Ответ 2

Как насчет чего-то вроде этого:

    [UIView beginAnimations:@"PartialPageCurlEffect" context:nil];
    [UIView setAnimationDuration:0.3];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:myOldSubViewController.view cache:YES];

    [myOldSubViewController.view addSubview:myNewViewController.view];

    [UIView commitAnimations];

Примечание: для некоторых видов, если представления сложны и неактивны, могут быть артефакты. Изменение cache:YES на cache:NO может быть исправлено с помощью.

Ответ 3

Как указывает cprcrack, это не отвечает на исходный вопрос. Тем не менее, это полезная информация, поэтому с учетом этого я собираюсь оставить ее здесь.

Это намного проще, чем вы предполагали.

Мы будем называть контроллеры вида MapViewController и SettingsViewController. Ваша проблема в том, что вы хотите открутить часть (и только часть) MapViewController, чтобы показать SettingsViewController.

Вот как вы это делаете:

  • Используйте представление полного размера для обоих представлений.
  • Поместите контент только в нижнюю половину представления SettingsViewController.
  • Используйте UIModalTransitionStylePartialCurl для перехода между ними, как и вы.

iOS обнаружит, что вы сделали это автоматически и только отслаиваете MapViewController назад достаточно далеко до нижней половины представления SettingsViewController, в котором находится весь ваш контент.

Если вы помещаете контент в верхнюю половину представления SettingsViewController, iOS будет обнаруживать это и откручивать назад MapViewController только так.

Резюме. Поместите контент только в нижнюю половину вашего нового представления. iOS выяснит это.

(Я не думаю, что это где-то зарегистрировано, извините.)

Ответ 4

У меня был небольшой икот, запутывающий

.modalTransitionStyle

и

.modalPresentationStyle

Первый идет на TARGET viewController, например, тот, который вы хотите под ним. Второй идет на контроллер просмотра PARENT, например. тот, который фактически искажается завитом. ОП получил это право, но я понял, что это неправильно, и это было разочарование за 10 минут до того, как я понял это. Бросая его на этот пост, если он дает кому-то еще больший пощечину, который мне нужен.

Ответ 5

Я столкнулся с этой проблемой. Для меня рамка родительского представления не исказилась до тех пор, пока модальное представление не было отклонено. Поэтому я закрепил рамку перед увольнением, а затем восстановил ее сразу после.

CGRect frame = controllerWithModal.view.frame;
[controllerWithModal dismissModalViewControllerAnimated:YES];   
controllerWithModal.view.frame = frame;

Ответ 6

У меня тоже была эта проблема, но я ее решил.. (не знаю, как правильно, но работает)

Я хотел иметь изображение в окне прокрутки, и когда пользователь вбрасывает кнопку внутри этого прокрутки, я хотел свернуться с просмотром прокрутки и показать табличное представление в этом месте. Поэтому я разместил табличное представление позади scrollview и начал его скрывать. Когда кнопка нажатия кнопок пользователя я сделал

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:1];
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:frontView cache:YES];
[UIView commitAnimations];

после этого удаленный вид спереди из представления. Надеюсь, что это поможет.

Ответ 7

Я считаю, что приложение Apple Maps использует недокументированные переходы: mapCurl и mapUncurl. Я не уверен, что есть какой-то способ сделать то, что хочет caecus314 (что также является тем эффектом, который я пытался дублировать).

UIModalTransitionStylePartialCurl будет скручивать всю нижнюю часть первого представления, включая панель инструментов, которая отличается в отличие от приложения Apple Maps, которая только скручивает карту и оставляет панель инструментов на месте.

Насколько я могу судить, нет возможности только скручивать карту.

Ответ 8

Отмените метод viewWillDisappear вашего underMapViewController примерно так:

- (void)viewWillDisappear:(BOOL)animated
{
    curlableMapViewController.view.frame = CGRectMake(0.f, 0.f, 320.f, 416.f);

    [super viewWillDisappear:animated];
}

Корректирует размер представления curlableMapViewController к указанному размеру значка, который вы могли бы сохранить ранее в методе viewWillAppear, например.