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

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

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

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

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

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

underMapViewController.modalTransitionStyle = UIModalTransitionStylePartialCurl;

[curlableMapViewController presentModalViewController:underMapViewController animated:YES];

Ответы [ 8 ]

9 голосов
/ 04 октября 2010

Из документации :

UIModalTransitionStylePartialCurl

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

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

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

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

7 голосов
/ 01 сентября 2011

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

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

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

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

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

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

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

Сводка: размещайте контент только в нижней половине вашего нового представления.iOS это поймет.

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

7 голосов
/ 27 октября 2010

Примерно так:

    [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 может исправить с помощью.

5 голосов
/ 26 июня 2011

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

.modalTransitionStyle

и

.modalPresentationStyle

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

0 голосов
/ 05 октября 2012

Переопределите метод viewWillDisappear вашего underMapViewController примерно следующим образом:

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

    [super viewWillDisappear:animated];
}

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

0 голосов
/ 14 июля 2012

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

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

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

0 голосов
/ 25 октября 2010

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

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

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

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

0 голосов
/ 22 октября 2010

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

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