IOS Segue анимация слева направо (по горизонтали) - PullRequest
10 голосов
/ 22 марта 2012

Я почти новичок в Xcode 4. Есть ли способ добавить в ход пользовательскую анимацию перехода, которая не входит в число четырех представленных Интерфейсным Разработчиком в управлении раскадровкой? В частности, я хочу анимацию, похожую на обычную «вертикальную обложку», но горизонтальную. Я хочу, чтобы вид перешел к другому скольжению слева направо (или справа налево), а не сверху вниз, как это происходит при переходе «Вертикальное покрытие». Я попробовал с жестом смахивания, но не случайно: даже это происходит с переходом сверху вниз, и в любом случае, я не понимаю, почему переход по умолчанию происходит сверху вниз, когда переход по умолчанию для всех приложений обычно направлен вправо или влево направо, особенно если вы проводите пальцем ...

Я пробовал также программно, но не в этом случае, даже в этом случае, используя этот код:

#import "JHCustomSegue.h"

@implementation JHCustomSegue
- (void) perform {
  UIViewController *src = (UIViewController *) self.sourceViewController;
  UIViewController *dst = (UIViewController *) self.destinationViewController;

  [UIView transitionWithView:src.navigationController.view duration:0.5 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{
        [src presentModalViewController:dst animated:NO];
    }
    completion:NULL];
}

@end

В конструкторе интерфейсов я определил этот класс как класс моего перехода. Используя точку останова, я увидел, что она входит в функцию perfom, но ... не выполняет! Я заблокировал приложение в портретном режиме (не знаю, если это проблема). Я попытался запустить приложение на реальном Ipad и на имитированном Iphone. Та же проблема.

Ответы [ 5 ]

19 голосов
/ 28 июня 2012

Вы можете использовать CATransition в пользовательском Segue для достижения перехода слева направо.Добавьте этот #import "QuartzCore / QuartzCore.h" в свой пользовательский Segue

-(void)perform {

__block UIViewController *sourceViewController = (UIViewController*)[self sourceViewController];
__block UIViewController *destinationController = (UIViewController*)[self destinationViewController];                    

CATransition* transition = [CATransition animation];
transition.duration = .25;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionPush; //kCATransitionMoveIn; //, kCATransitionPush, kCATransitionReveal, kCATransitionFade
transition.subtype = kCATransitionFromLeft; //kCATransitionFromLeft, kCATransitionFromRight, kCATransitionFromTop, kCATransitionFromBottom



[sourceViewController.navigationController.view.layer addAnimation:transition
                                            forKey:kCATransition];

[sourceViewController.navigationController pushViewController:destinationController animated:NO];    


}
9 голосов
/ 13 февраля 2015

Основываясь на представлении Закира Хайдера, вот та же функциональность, переведенная на Swift:

override func perform() {

    var sourceViewController = self.sourceViewController as UIViewController
    var destinationViewController = self.destinationViewController as UIViewController

    var transition: CATransition = CATransition()

    transition.duration = 0.25
    transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
    transition.type = kCATransitionPush; //kCATransitionMoveIn; //, kCATransitionPush, kCATransitionReveal, kCATransitionFade
    transition.subtype = kCATransitionFromLeft; //kCATransitionFromLeft, kCATransitionFromRight, kCATransitionFromTop, kCATransitionFromBottom

    sourceViewController.navigationController?.view.layer.addAnimation(transition, forKey: "kCATransition")
    sourceViewController.navigationController?.pushViewController(destinationViewController, animated: false)     

}
8 голосов
/ 30 ноября 2013

Вот рабочий код для пользовательской последовательности, когда не используется навигационный контроллер.

-(void)perform
{

UIViewController *sourceViewController = (UIViewController*)[self sourceViewController];
UIViewController *destinationController = (UIViewController*)[self destinationViewController];

CATransition* transition = [CATransition animation];
transition.duration = 0.25;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionMoveIn; //kCATransitionMoveIn; //, kCATransitionPush, kCATransitionReveal, kCATransitionFade
transition.subtype = kCATransitionFromRight; //kCATransitionFromLeft, kCATransitionFromRight, kCATransitionFromTop, kCATransitionFromBottom

[destinationController.view.layer addAnimation:transition forKey:kCATransition];
[sourceViewController presentViewController:destinationController animated:NO completion:nil];
}
3 голосов
/ 31 марта 2015

Посмотрите этот пример на Github:

https://github.com/itinance/iOSCustomSegue

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

Код в ответе Sahil не работал для меня на iOS 8. Поэтому мне пришлось немного больше изучить эту проблему.

«UIView animateWithDuration» работает на iOS 8,в то время как 'destinationController.view.layer addAnimation: transition' ничего не делает в сочетании с presentViewController.

2 голосов
/ 31 мая 2012

Я пытался использовать Segue для того же эффекта, но безуспешно.Вместо этого я использовал обходной путь:

// get the view that's currently showing
UIView *currentView = self.view;
// get the the underlying UIWindow, or the view containing the current view
UIView *theWindow = [currentView superview];

UIView *newView = aTwoViewController.view; 

// remove the current view and replace with myView1
[currentView removeFromSuperview];
[theWindow addSubview:newView];

// set up an animation for the transition between the views
CATransition *animation = [CATransition animation];
[animation setDuration:0.5];
[animation setType:kCATransitionPush];
[animation setSubtype:kCATransitionFromRight];
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];

[[theWindow layer] addAnimation:animation forKey:@"SwitchToView2"];

Вы можете скачать пример проекта здесь .Ура! * * 1006

...