Вопрос

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

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

Это было полезно?

Решение 2

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

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

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

-(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);
}

Другие советы

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

NSView* parent = viewController.view; // the main view
NSView* containerView = [[[UIView alloc] initWithFrame:parent.bounds] autorelease];
containerView.transform = CGAffineTransformMakeRotation(<your angle here, should probably be M_PI_2 * some integer>);
[parent addSubview:containerView]; 

[UIView beginAnimations:nil context:nil];
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:containerView cache:YES];
[containerView addSubview:view];
[UIView commitAnimations];

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

-parentView
-->myView

Вы вставите промежуточное представление между ними (это легко сделать в Интерфейсном Разработчике):

-parentView
-->containerView
--->myView

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

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

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

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

  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......]), но это не сработало:завиток по-прежнему поднимался вверх или вниз.Очевидно, что переход теперь не учитывает преобразование представления.Поэтому, если кто-то еще захочет проделать тот же трюк с 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. Я должен признать, что аффинное преобразование translate (80,80), на мой взгляд, не имеет смысла, но оно необходимо для iphone, вероятно, не будет работать на iPad.
  2. flipSizeRect изменяет ширину и высоту прямоугольника (вы уже поняли это, не так ли?).
  3. dispatch_after необходим, потому что я добавил контейнер, а затем хочу удалить представление из иерархии.Если я опущу отправку, ничего не оживит.Мое лучшее предположение заключается в том, что сначала нам нужно позволить системе выполнить прохождение макета, прежде чем мы сможем анимировать удаление.

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

Что еще более важно, вы, вероятно, не должны пытаться это делать. Свертывание вверх и скручивание являются частью грамматики пользовательского интерфейса, которая сообщает пользователю, что представление поднимается или опускается над существующим представлением. Это должно быть похоже на заметку, которую кладут, а потом удаляют. Левый & Lt; - & Gt; правый завиток, скорее всего, будет интерпретироваться как нечто вроде копирования страницы из книги. Это запутает пользователей.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top