iPhone Curl Left и Curl Right переходы - PullRequest
9 голосов
/ 26 октября 2009

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

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

Ответы [ 5 ]

9 голосов
/ 19 августа 2010

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

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];
4 голосов
/ 22 ноября 2009

Мне действительно удалось добиться этого эффекта, изменив ориентацию моего 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);
}
2 голосов
/ 12 июля 2012

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

Я тоже с этим боролся. Чтобы заставить локон приходить справа или слева, вы можете создать промежуточный вид и трансформировать его. Итак, допустим, что переходное представление (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.

0 голосов
/ 26 октября 2009

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

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

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

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

...