Ios push和model之间的不同表示

Ios push和model之间的不同表示,ios,objective-c,animation,transition,Ios,Objective C,Animation,Transition,我有一个自定义转换,我将其应用于符合uiviewcontrollertransitiondelegate协议的ViewController中。我的过渡工作正常。但是当我将uiviewcontrollertransitiondelegate协议更改为UINavigationControllerDelegate协议时,它的工作方式很奇怪 MyTransitioning: #import "MyTransitioning.h" #define PARTS_COUNT 4 @interface M

我有一个自定义转换,我将其应用于符合
uiviewcontrollertransitiondelegate
协议的ViewController中。我的过渡工作正常。但是当我将
uiviewcontrollertransitiondelegate
协议更改为
UINavigationControllerDelegate
协议时,它的工作方式很奇怪

MyTransitioning:

#import "MyTransitioning.h"
#define PARTS_COUNT 4

@interface MyTransitioning()
@property (nonatomic) CGFloat partWidth;
@property (nonatomic) CGFloat partHeight;
@end

@implementation MyTransitioning

-(NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext
{
    return 1.0;
}

-(void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
    UIViewController* fromCtrl = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController* toCtrl = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    UIView* fromView = fromCtrl.view;
    UIView* toView = toCtrl.view;
    UIView* container = [transitionContext containerView];
    CATransform3D transform = container.layer.transform;
    transform.m34 = -0.01;
    [container.layer setSublayerTransform:transform];

    NSArray<UIView*>* fromViewParts = [self spliteView:fromView];
    NSArray<UIView*>* toViewParts = [self spliteView:toView];
    [self addViews:toViewParts ToContainer:container isFromView:NO];
    [self addViews:fromViewParts ToContainer:container isFromView:YES];
    [fromView removeFromSuperview];


    [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^
    {
        [self strechViews:toViewParts];
        [self compressViews:fromViewParts ToLeft:YES];
    } completion:^(BOOL finished)
    {
        if (!finished)
        {
            NSLog(@"not finish");
        }
        [self removeViewsfromSuper:fromViewParts];
        [self removeViewsfromSuper:toViewParts];
        [container addSubview:toView];
        [transitionContext completeTransition:!transitionContext.transitionWasCancelled];
    }];
}

-(NSArray*)spliteView:(UIView*)view
{
    self.partWidth = view.bounds.size.width / PARTS_COUNT;
    self.partHeight = view.bounds.size.height;
    CGRect region = CGRectMake(0, 0, self.partWidth, self.partHeight);

    NSMutableArray<UIView*>* viewParts = [NSMutableArray array];
    for (int i = 0; i < PARTS_COUNT; i++)
    {
        region.origin.x =self.partWidth * i;
        UIView* partView = [view resizableSnapshotViewFromRect:region afterScreenUpdates:YES withCapInsets:UIEdgeInsetsZero];
        [viewParts addObject:partView];
        partView.frame = region;
    }
    return viewParts;
}

-(void)addViews:(NSArray<UIView*>*)views ToContainer:(UIView*)container isFromView:(BOOL)isFromView
{
    isFromView ? [self strechViews:views] : [self compressViews:views ToLeft:NO];
    for (UIView* view in views)
    {
        [container addSubview:view];
    }
}

-(void)compressViews:(NSArray<UIView*>*)views ToLeft:(BOOL)toLeft
{
    CGFloat x = toLeft ? 0 : self.partWidth * 4;
    int isClockWise = -1;
    CGPoint position = CGPointMake(x, self.partHeight / 2);
    for (UIView* view in views) {
        isClockWise *= -1;
        view.layer.anchorPoint = CGPointMake(0.5 - isClockWise * 0.5, 0.5);
        view.layer.position = position;
        view.layer.transform = CATransform3DMakeRotation(M_PI_2 * isClockWise, 0, 1, 0);
    }
}

-(void)strechViews:(NSArray<UIView*>*)views
{
    int isClockWise = -1;
    for (UIView* view in views)
    {
        isClockWise *= -1;
        view.layer.anchorPoint = CGPointMake(0.5 - isClockWise * 0.5, 0.5);
        NSLog(@"%@",NSStringFromCGPoint(view.layer.anchorPoint));
        CGPoint position = view.layer.position;
        position.x = self.partWidth * [views indexOfObject:view] + (isClockWise == 1 ? 0 : self.partWidth);
        view.layer.position = position;
        view.layer.transform = CATransform3DIdentity;
        NSLog(@"%@",NSStringFromCGRect(view.frame));
    }
}

-(void)removeViewsfromSuper:(NSArray<UIView*>*)views
{
    for (UIView* view in views)
    {
        [view removeFromSuperview];
    }
}

@end
#import "ViewController.h"
#import "MyTransitioning.h"
#import "SecondController.h"

@interface ViewController ()<UINavigationControllerDelegate>
//@interface ViewController ()<UIViewControllerTransitioningDelegate>
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

//-(id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source
//{
//    return [MyTransitioning new];
//}
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    self.navigationController.delegate = self;
//    SecondController* ctrl = [segue destinationViewController];
//    ctrl.transitioningDelegate = self;
}

-(id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC
{
    if (operation == UINavigationControllerOperationPush) {
        return [MyTransitioning new];
    }
    return nil;
}

@end
#导入“MyTransitioning.h”
#定义零件计数4
@接口MyTransitioning()
@属性(非原子)CGFloat partWidth;
@属性(非原子)CGFloat零件高度;
@结束
@实现MyTransitioning
-(NSTimeInterval)transitionDuration:(id)transitionContext
{
返回1.0;
}
-(void)animateTransfion:(id)transitionContext
{
UIViewController*fromCtrl=[transitionContext ViewControllerWorky:UITransitionContextFromViewControllerKey];
UIViewController*toCtrl=[transitionContext ViewControllerWorky:UITransitionContextToViewControllerKey];
UIView*fromView=fromCtrl.view;
UIView*toView=toCtrl.view;
UIView*容器=[transitionContext containerView];
CATTransformM3D transform=container.layer.transform;
transform.m34=-0.01;
[container.layer setSublayerTransform:transform];
NSArray*fromViewParts=[自拆分视图:fromView];
NSArray*toViewParts=[self-spliteView:toView];
[自添加视图:toViewParts到容器:容器来自视图:否];
[自添加视图:从ViewParts到容器:容器是从视图:是];
[fromView removeFromSuperview];
[UIView animateWithDuration:[self-transitionDuration:transitionContext]动画:^
{
[自街道视图:toViewParts];
[自压缩视图:从视图零件到左侧:是];
}完成:^(布尔完成)
{
如果(!完成)
{
NSLog(@“未完成”);
}
[来自Super的自移除视图:来自ViewParts];
[来自Super的自移除视图:toViewParts];
[容器添加子视图:toView];
[transitionContext completeTransition:!transitionContext.transitionWasCancelled];
}];
}
-(NSArray*)拆分视图:(UIView*)视图
{
self.partWidth=view.bounds.size.width/PARTS\u COUNT;
self.partHeight=view.bounds.size.height;
CGRect区域=CGRectMake(0,0,self.partWidth,self.partHeight);
NSMutableArray*viewParts=[NSMutableArray];
对于(int i=0;i
视图控制器:

#import "MyTransitioning.h"
#define PARTS_COUNT 4

@interface MyTransitioning()
@property (nonatomic) CGFloat partWidth;
@property (nonatomic) CGFloat partHeight;
@end

@implementation MyTransitioning

-(NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext
{
    return 1.0;
}

-(void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
    UIViewController* fromCtrl = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController* toCtrl = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    UIView* fromView = fromCtrl.view;
    UIView* toView = toCtrl.view;
    UIView* container = [transitionContext containerView];
    CATransform3D transform = container.layer.transform;
    transform.m34 = -0.01;
    [container.layer setSublayerTransform:transform];

    NSArray<UIView*>* fromViewParts = [self spliteView:fromView];
    NSArray<UIView*>* toViewParts = [self spliteView:toView];
    [self addViews:toViewParts ToContainer:container isFromView:NO];
    [self addViews:fromViewParts ToContainer:container isFromView:YES];
    [fromView removeFromSuperview];


    [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^
    {
        [self strechViews:toViewParts];
        [self compressViews:fromViewParts ToLeft:YES];
    } completion:^(BOOL finished)
    {
        if (!finished)
        {
            NSLog(@"not finish");
        }
        [self removeViewsfromSuper:fromViewParts];
        [self removeViewsfromSuper:toViewParts];
        [container addSubview:toView];
        [transitionContext completeTransition:!transitionContext.transitionWasCancelled];
    }];
}

-(NSArray*)spliteView:(UIView*)view
{
    self.partWidth = view.bounds.size.width / PARTS_COUNT;
    self.partHeight = view.bounds.size.height;
    CGRect region = CGRectMake(0, 0, self.partWidth, self.partHeight);

    NSMutableArray<UIView*>* viewParts = [NSMutableArray array];
    for (int i = 0; i < PARTS_COUNT; i++)
    {
        region.origin.x =self.partWidth * i;
        UIView* partView = [view resizableSnapshotViewFromRect:region afterScreenUpdates:YES withCapInsets:UIEdgeInsetsZero];
        [viewParts addObject:partView];
        partView.frame = region;
    }
    return viewParts;
}

-(void)addViews:(NSArray<UIView*>*)views ToContainer:(UIView*)container isFromView:(BOOL)isFromView
{
    isFromView ? [self strechViews:views] : [self compressViews:views ToLeft:NO];
    for (UIView* view in views)
    {
        [container addSubview:view];
    }
}

-(void)compressViews:(NSArray<UIView*>*)views ToLeft:(BOOL)toLeft
{
    CGFloat x = toLeft ? 0 : self.partWidth * 4;
    int isClockWise = -1;
    CGPoint position = CGPointMake(x, self.partHeight / 2);
    for (UIView* view in views) {
        isClockWise *= -1;
        view.layer.anchorPoint = CGPointMake(0.5 - isClockWise * 0.5, 0.5);
        view.layer.position = position;
        view.layer.transform = CATransform3DMakeRotation(M_PI_2 * isClockWise, 0, 1, 0);
    }
}

-(void)strechViews:(NSArray<UIView*>*)views
{
    int isClockWise = -1;
    for (UIView* view in views)
    {
        isClockWise *= -1;
        view.layer.anchorPoint = CGPointMake(0.5 - isClockWise * 0.5, 0.5);
        NSLog(@"%@",NSStringFromCGPoint(view.layer.anchorPoint));
        CGPoint position = view.layer.position;
        position.x = self.partWidth * [views indexOfObject:view] + (isClockWise == 1 ? 0 : self.partWidth);
        view.layer.position = position;
        view.layer.transform = CATransform3DIdentity;
        NSLog(@"%@",NSStringFromCGRect(view.frame));
    }
}

-(void)removeViewsfromSuper:(NSArray<UIView*>*)views
{
    for (UIView* view in views)
    {
        [view removeFromSuperview];
    }
}

@end
#import "ViewController.h"
#import "MyTransitioning.h"
#import "SecondController.h"

@interface ViewController ()<UINavigationControllerDelegate>
//@interface ViewController ()<UIViewControllerTransitioningDelegate>
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

//-(id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source
//{
//    return [MyTransitioning new];
//}
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    self.navigationController.delegate = self;
//    SecondController* ctrl = [segue destinationViewController];
//    ctrl.transitioningDelegate = self;
}

-(id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC
{
    if (operation == UINavigationControllerOperationPush) {
        return [MyTransitioning new];
    }
    return nil;
}

@end
#导入“ViewController.h”
#导入“MyTransitioning.h”
#导入“SecondController.h”
@界面视图控制器()
//@界面视图控制器()
@结束
@实现视图控制器
-(无效)viewDidLoad{
[超级视图下载];
//加载视图后,通常从nib执行任何其他设置。
}
-(无效)未收到记忆警告{
[超级记忆警告];
//处置所有可以重新创建的资源。
}
//-(id)animationControllerForPresentedController:(UIViewController*)PresentedPresentingController:(UIViewController*)PresentingSourceController:(UIViewController*)源
//{
//返回[MyTransitioning new];
//}
-(void)prepareForSegue:(UIStoryboardSegue*)segue发送方:(id)发送方
{
self.navigationController.delegate=self;
//SecondController*ctrl=[segue destinationViewController];
//ctrl.transitioningDelegate=self;
}
-(id)导航控制器:(UINavigationController*)导航控制器动画控制器操作:(UINavigationController操作)从ViewController:(UIViewController*)到ViewController:(UIViewController*)到VC的操作
{
if(操作==UINavigationControllerOperationPush){
返回[MyTransitioning new];
}
返回零;
}
@结束

如果您的问题是
PresentViewController
Push
之间的差异,
pop
查看控制器

  • pushview控制器
    推送视图控制器是导航控制器的一个属性。当您想从一个控制器向前移动到另一个控制器时,请使用此选项
  • PopViewController
    Pop视图控制器也是导航控制器的一个属性。当您想在导航堆栈中向后移动时,请执行以下操作
  • PresentViewController
    /Model-View-controller

    压力