iPhone Curl Left и Curl Right переходы
Я ищу способ сделать UIViewAnimationTransitionCurlUp
или же UIViewAnimationTransitionCurlDown
переход на iPhone, но вместо сверху вниз, сделайте это слева направо (или сверху / снизу в ландшафтном режиме). Я видел, как несколько раз спрашивали об этом в Интернете, но никто не пытается получить ответ. Однако я чувствую, что это выполнимо.
Я попытался изменить преобразование View и view.layer, но это не повлияло на переход. Поскольку переход изменяется, когда устройство меняет ориентацию, я предполагаю, что существует способ обмануть устройство, чтобы использовать альбомный переход в портретном режиме и наоборот?
5 ответов
Мне действительно удалось достичь этого эффекта, изменив ориентацию моего 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];}];});
Заметки:
- Я должен признать, что аффинное преобразование translate (80,80) не имеет смысла в моем уме, но это необходимо для iphone, вероятно, не будет работать на iPad.
- flipSizeRect переворачивает ширину и высоту прямоугольника (вы уже это поняли, верно?)
- dispatch_after необходим, потому что я добавил контейнер и затем хочу удалить представление из иерархии. Если я пропущу отправку, ничего не оживит. Мое лучшее предположение состоит в том, что сначала мы должны позволить системе выполнить прохождение макета, прежде чем мы сможем оживить удаление.
Я не думаю, что есть выход за рамки написания собственной анимации.
Что еще более важно, вы, вероятно, не должны пытаться это сделать. Curl up и curl down являются частью грамматики пользовательского интерфейса, которая сообщает пользователю, что представление поднимается или опускается над существующим представлением. Это должно быть похоже на заметку, которую кладут, а потом удаляют. Левый<->правый завиток, скорее всего, будет интерпретироваться как что-то вроде копирования страницы из книги. Это запутает пользователей.
Всякий раз, когда вы обнаруживаете, что пытаетесь сделать что-то в интерфейсе, что не так просто для стандартного API, вам следует спросить себя, будет ли такой новый метод передавать что-то важное для пользователя и похоже ли это на существующую грамматику интерфейса. Если нет, то вам не стоит беспокоиться.
У необычных интерфейсов есть начальный вау-фактор, но они приводят к разочарованию и ошибкам в повседневном использовании. Они также могут заставить Apple отказаться от вашего приложения.