Переходы iPhone Curl влево и Curl вправо
-
06-07-2019 - |
Вопрос
Я ищу способ сделать 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];}];});
Примечания:
- Я должен признать, что аффинное преобразование translate (80,80), на мой взгляд, не имеет смысла, но оно необходимо для iphone, вероятно, не будет работать на iPad.
- flipSizeRect изменяет ширину и высоту прямоугольника (вы уже поняли это, не так ли?).
- dispatch_after необходим, потому что я добавил контейнер, а затем хочу удалить представление из иерархии.Если я опущу отправку, ничего не оживит.Мое лучшее предположение заключается в том, что сначала нам нужно позволить системе выполнить прохождение макета, прежде чем мы сможем анимировать удаление.
Я не думаю, что есть что-то кроме написания пользовательской анимации. Р>
Что еще более важно, вы, вероятно, не должны пытаться это делать. Свертывание вверх и скручивание являются частью грамматики пользовательского интерфейса, которая сообщает пользователю, что представление поднимается или опускается над существующим представлением. Это должно быть похоже на заметку, которую кладут, а потом удаляют. Левый & Lt; - & Gt; правый завиток, скорее всего, будет интерпретироваться как нечто вроде копирования страницы из книги. Это запутает пользователей. Р>
Всякий раз, когда вы обнаруживаете, что пытаетесь сделать что-то в интерфейсе, что не так просто для стандартного API, вам следует спросить себя, будет ли такой новый метод передавать что-то важное для пользователя и похоже ли это на существующую грамматику интерфейса. Если нет, то вам не стоит беспокоиться.
Необычные интерфейсы имеют начальный вау-фактор, но они приводят к разочарованию и ошибкам в повседневном использовании. Они также могут заставить Apple отказаться от вашего приложения. Р>