Navigation 전환 애니메이션 사용자 정의
7578 단어 애니메이션
간단하게 다음과 같은 몇 단계로 나뉜다.
1, A Push B, A는 UINavigation Controller Delegate 2를 실현하려면 위의 delegate에서 실현해야 할 방법의 반환 값은'회전 애니메이션'3이고 회전 애니메이션은
id<UIViewControllerAnimatedTransitioning>
4이다. 실현해야 할 애니메이션은 <UIViewControllerAnimatedTransitioning>
방법에서 5, 두 번째 단계의 반환 값을 실현하고 alloc init는 회전 애니메이션이고 반환해야 한다.A Push B, A가 UINavigation Controller Delegate를 실현하려면 이 코드를 잊지 마십시오.
self.navigationController.delegate = self;
에이전트 중 한 가지 방법이 있다. - (nullable id <UIViewControllerAnimatedTransitioning>)
navigationController:(UINavigationController *)navigationController
animationControllerForOperation:(UINavigationControllerOperation)operation
fromViewController:(UIViewController *)fromVC
toViewController:(UIViewController *)toVC NS_AVAILABLE_IOS(7_0);
상기 방법을 실현하면push의 과정에서 호출된다. 반환 값은 UIViewControllerAnimatedTransitioning
에이전트의 id 값을 따른다. 반환 값은 바로 회전 애니메이션이라고 이해할 수 있다.일반적으로 NSObject에서 상속된 클래스를 사용자 정의하여 이 프로토콜을 실현할 수 있습니다.사용자 정의 회전 애니메이션에서 언급한 바와 같이 UIViewControllerAnimatedTransitioning
에이전트의 id 값을 따라 회전 애니메이션으로 이해할 수 있다. 우리는 이 놀이를 정의한다.#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface MagicMoveTransition :
NSObject<UIViewControllerAnimatedTransitioning>
@end
import 조심하고 UIKit. 그리고.m 파일에서 두 가지 방법을 실현해야 한다. - (NSTimeInterval)transitionDuration:(nullable id < UIViewControllerContextTransitioning>)transitionContext;
- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext;
첫 번째 방법은 실행 시간을 되돌려주고 두 번째 방법은 필요한 애니메이션 효과를 정의한다.- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext{
return 0.6f;
}
- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext{
// VC
FirstCollectionViewController *fromVC = (FirstCollectionViewController *)[transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
SecondViewController *toVC = (SecondViewController *)[transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
//containerView view
UIView *containerView = [transitionContext containerView];
// Cell imageView , imageView
CollectionViewCell *cell =(CollectionViewCell *)[fromVC.collectionView cellForItemAtIndexPath:[[fromVC.collectionView indexPathsForSelectedItems] firstObject]];
fromVC.indexPath = [[fromVC.collectionView indexPathsForSelectedItems]firstObject];
UIView * snapShotView = [cell.imageView snapshotViewAfterScreenUpdates:NO];
// cell frame containerView
snapShotView.frame = fromVC.finalCellRect = [containerView convertRect:cell.imageView.frame fromView:cell.imageView.superview];
cell.imageView.hidden = YES;
// 、
toVC.view.frame = [transitionContext finalFrameForViewController:toVC];
toVC.view.alpha = 0;
toVC.imageViewForSecond.hidden = YES;
// ViewController , ,snapShotView
[containerView addSubview:toVC.view];
[containerView addSubview:snapShotView];
// 。 0~1; SnapShotView ;
[UIView animateWithDuration:[self transitionDuration:transitionContext] delay:0.0f usingSpringWithDamping:0.6f initialSpringVelocity:1.0f options:UIViewAnimationOptionCurveLinear animations:^{
[containerView layoutIfNeeded];
toVC.view.alpha = 1.0;
snapShotView.frame = [containerView convertRect:toVC.imageViewForSecond.frame fromView:toVC.view];
} completion:^(BOOL finished) {
// ,cell , cell
toVC.imageViewForSecond.hidden = NO;
cell.imageView.hidden = NO;
[snapShotView removeFromSuperview];
//
[transitionContext completeTransition:!transitionContext.transitionWasCancelled];
}];
}
무책임하게 큰 코드를 붙여 놓았으니 구체적인 수요는 구체적으로 분석해 봅시다.이렇게 하면push의 controller에서 프록시 방법은 이렇게 쓸 수 있다
`
- (id <UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController
animationControllerForOperation:(UINavigationControllerOperation)operation
fromViewController:(UIViewController *)fromVC
toViewController:(UIViewController *)toVC{
if ([toVC isKindOfClass:[SecondViewController class]]) {
MagicMoveTransition *transition = [[MagicMoveTransition alloc]init];
return transition;
}else{
return nil;
}
}
`
한마디 더 하자면 애플은 모든 애니메이션 보기를transitionContext의containerView에 두어야 한다고 공식적으로 규정하고 있다.됐어.FYI http://www.kittenyang.com/uiviewcontrollertransitioning/ https://github.com/boycechang/BCMagicTransition
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
SwiftUI에서 Lottie를 사용하여 풍부한 애니메이션을 쉽게 실현해보세요이하의 기사를 이전 썼지만, 최근 SwiftUI를 사용해 Lottie를 이용했으므로 그 방법에 대해서 써 간다. Lottie에 관한 설명은 여러가지 기사에서도 되고 있으므로 여기서는 언급하지 말고, SwiftUI상에...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.