Переходы iPhone Curl Left и Curl Right

Я ищу способ сделать переход на UIViewAnimationTransitionCurlUp или UIViewAnimationTransitionCurlDown на iPhone, но вместо сверху вниз сделайте это слева направо (или сверху / снизу в ландшафтном режиме). Я видел, как это несколько раз спрашивали интернет-сайт, но никто не получал ответа. Однако я чувствую, что это выполнимо.

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

Можно использовать завитки в любом из четырех направлений, используя вид контейнера. Установите преобразование вида контейнера в нужный угол и затем сделайте curl, добавив ваше представление в вид контейнера, а не основной вид вашего приложения, у которого нет трансформированного фрейма:

 NSView* parent = viewController.view; // the main view NSView* containerView = [[[UIView alloc] initWithFrame:parent.bounds] autorelease]; containerView.transform = CGAffineTransformMakeRotation(); [parent addSubview:containerView]; [UIView beginAnimations:nil context:nil]; [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:containerView cache:YES]; [containerView addSubview:view]; [UIView commitAnimations]; 

Фактически мне удалось добиться этого эффекта, изменив ориентацию моего UIViewController. Странная вещь: у меня был controller в другом, когда он не работал, но когда я установил его как непосредственный controller, он работал.

Код, который делает это:

В UIViewController, который является основным controllerом представления в моем делете приложения и только позволяет использовать ландшафтную ориентацию (как вы видите во втором методе ниже), у меня есть следующее:

 -(void)goToPage:(int)page flipUp:(BOOL)flipUp { //do stuff... // start the animated transition [UIView beginAnimations:@"page transition" context:nil]; [UIView setAnimationDuration:1.0]; [UIView setAnimationTransition:flipUp ? UIViewAnimationTransitionCurlUp : UIViewAnimationTransitionCurlDown forView:self.view cache:YES]; //insert your new subview //[self.view insertSubview:currentPage.view atIndex:self.view.subviews.count]; // commit the transition animation [UIView commitAnimations]; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation == UIInterfaceOrientationLandscapeRight); } 

Я также боролся с этим. Чтобы заставить локон прибыть справа или слева, вы можете создать промежуточный вид и преобразовать его. Итак, предположим, что представление, которое вы переходите (myView), является дочерним элементом главного windows (parentView):

 -parentView -->myView 

Вы вставляете промежуточный вид между ними (это легко сделать в Interface Builder):

 -parentView -->containerView --->myView 

Затем используйте следующий код, чтобы перевернуть контейнер на 90 gradleусов влево, а переход на 90 gradleусов вправо:

 containerView.transform = CGAffineTransformMakeRotation(-M_PI_2); myView.transform = CGAffineTransformMakeRotation(M_PI_2); 

myView по-прежнему будет выглядеть вертикально для пользователя, но переход будет считать, что он применяется на 90 gradleусов слева.

Обратите внимание, что в зависимости от того, как автоматически масштабируются ваши представления, вам, возможно, придется исправить размеры фреймов после применения преобразования, например

  containerView.frame = CGRectMake(0.0, 0.0, 768.0, 1024.0); myWebView.frame = CGRectMake(0.0, 0.0, 768.0, 1024.0); 

Надеюсь это поможет. Наиболее близким вы можете добраться до UIViewAnimationTransitionCurlLeft и UIViewAnimationTransitionCurlRight.

Я попробовал решение fluXa на iOS5 (поэтому мне пришлось использовать [UIView trans ……]), но это не помогло: curl все равно поднимался или вниз. По-видимому, переход теперь не учитывает преобразования взгляда. Поэтому, если кто-то хочет сделать тот же трюк на iOS5, решение состоит в том, чтобы добавить другой контейнер между ними и оживить переход оттуда.

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

 UIView* parent = self.view; // the main view CGRect r = flipRectSize(parent.bounds); UIView* containerView = [[UIView alloc] initWithFrame:r]; CGAffineTransform t = CGAffineTransformMakeRotation(-M_PI_2); t = CGAffineTransformTranslate(t, -80, -80); containerView.transform = CGAffineTransformScale(t, -1, 1); [parent addSubview:containerView]; UIView* container2 = [[UIView alloc] initWithFrame:r]; [containerView addSubview:container2]; UIImageView* v = [[UIImageView alloc] initWithFrame:r]; v.image = [UIImage imageWithCGImage:contents.CGImage scale:contents.scale orientation:UIImageOrientationLeftMirrored]; [container2 addSubview:v]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.001 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ [UIView transitionWithView:container2 duration:DURATION_CURL_ANIMATION options:UIViewAnimationOptionTransitionCurlUp animations:^{ [v removeFromSuperview]; } completion:^(BOOL finished) { if (completion) { completion(finished); } [containerView removeFromSuperview];}];}); 

Заметки:

  1. Должен признать, что аффинное преобразование (80,80) не имеет смысла в моем сознании, но это необходимо для iphone, вероятно, не будет работать на iPad.
  2. flipSizeRect переворачивает ширину и высоту прямоугольника (вы уже получили это, не так ли?)
  3. dispatch_after необходимо, потому что я добавил контейнер, а затем хочу удалить представление из иерархии. Если я откажусь от отправки, ничего не оживит. Лучше всего предположить, что сначала нам нужно позволить системе сделать макет, прежде чем мы сможем анимировать удаление.

Я не думаю, что есть способ не писать пользовательскую анимацию.

Более того, вы, вероятно, не должны пытаться это делать. Curl up и curl down являются частью грамматики пользовательского интерфейса, которая сообщает пользователю, что представление поднимается или помещается поверх существующего представления. Это должно быть похоже на липкую ноту, которую нужно положить, а затем удалить. Левый <-> правый curl, скорее всего, будет интерпретироваться как нечто вроде копирования страницы из книги. Это смущает пользователей.

Всякий раз, когда вы пытаетесь что-то сделать в интерфейсе, что стандартный API не делает легко, вы должны спросить себя, будет ли такой новый метод передавать что-то важное для пользователя и похоже ли он на существующую грамматику интерфейса. Если нет, то не стоит беспокоиться.

Необычные интерфейсы имеют начальный вау-фактор, но они приводят к разочарованию и ошибкам в повседневном использовании. Они также могут заставить Apple отказаться от вашего приложения.

Давайте будем гением компьютера.