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控制器
Pop视图控制器也是导航控制器的一个属性。当您想在导航堆栈中向后移动时,请执行以下操作PopViewController
/Model-View-controller 压力PresentViewController