Contenu connexe
Similaire à Custom UIViewController Transitions (20)
Custom UIViewController Transitions
- 6. Modal View Controller
- (void)presentViewController:animated:completion:
!
- (void)dismissViewControllerAnimated:completion:
- 8. typedef NS_ENUM(NSInteger, UIModalTransitionStyle) {
UIModalTransitionStyleCoverVertical = 0,
UIModalTransitionStyleFlipHorizontal,
UIModalTransitionStyleCrossDissolve,
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_3_2
UIModalTransitionStylePartialCurl,
#endif
};
- 10. typedef NS_ENUM(NSInteger, UIModalPresentationStyle) {
UIModalPresentationFullScreen = 0,
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_3_2
UIModalPresentationPageSheet,
UIModalPresentationFormSheet,
UIModalPresentationCurrentContext,
#endif
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_7_0
UIModalPresentationCustom,
UIModalPresentationNone = -1,
#endif
};
- 11. typedef NS_ENUM(NSInteger, UIModalPresentationStyle) {
UIModalPresentationFullScreen = 0,
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_3_2
UIModalPresentationPageSheet,
UIModalPresentationFormSheet,
UIModalPresentationCurrentContext,
#endif
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_7_0
UIModalPresentationCustom,
UIModalPresentationNone = -1,
#endif
};
- 14. TestViewController *viewController = [TestViewController new];
!
viewController.transitioningDelegate = ???
!
[self presentViewController:viewController animated:YES
completion:nil];
- 15. TestViewController *viewController = [TestViewController new];
!
viewController.transitioningDelegate = ???
!
[self presentViewController:viewController animated:YES
completion:nil];
- 16. @protocol UIViewControllerTransitioningDelegate <NSObject>
!
@optional
!
!
- (id <UIViewControllerAnimatedTransitioning>)
animationControllerForPresentedController:(UIViewController *)presented
presentingController:(UIViewController *)presenting sourceController:
(UIViewController *)source;
!
!
- (id <UIViewControllerAnimatedTransitioning>)
animationControllerForDismissedController:(UIViewController *)dismissed;
!
!
- (id
<UIViewControllerInteractiveTransitioning>)interactionControllerForPresentation:(id
<UIViewControllerAnimatedTransitioning>)animator;
!
!
- (id <UIViewControllerInteractiveTransitioning>)interactionControllerForDismissal:
(id <UIViewControllerAnimatedTransitioning>)animator;
!
!
@end
- 17. @protocol UIViewControllerTransitioningDelegate <NSObject>
!
@optional
!
!
- (id <UIViewControllerAnimatedTransitioning>)
animationControllerForPresentedController:(UIViewController *)presented
presentingController:(UIViewController *)presenting sourceController:
(UIViewController *)source;
!
!
- (id <UIViewControllerAnimatedTransitioning>)
animationControllerForDismissedController:(UIViewController *)dismissed;
!
!
- (id
<UIViewControllerInteractiveTransitioning>)interactionControllerForPresentation:(id
<UIViewControllerAnimatedTransitioning>)animator;
!
!
- (id <UIViewControllerInteractiveTransitioning>)interactionControllerForDismissal:
(id <UIViewControllerAnimatedTransitioning>)animator;
!
!
@end
- 18. @protocol UIViewControllerTransitioningDelegate <NSObject>
!
@optional
!
!
- (id <UIViewControllerAnimatedTransitioning>)
animationControllerForPresentedController:(UIViewController *)presented
presentingController:(UIViewController *)presenting sourceController:
(UIViewController *)source;
!
!
- (id <UIViewControllerAnimatedTransitioning>)
animationControllerForDismissedController:(UIViewController *)dismissed;
!
!
- (id
<UIViewControllerInteractiveTransitioning>)interactionControllerForPresentation:(id
<UIViewControllerAnimatedTransitioning>)animator;
!
!
- (id <UIViewControllerInteractiveTransitioning>)interactionControllerForDismissal:
(id <UIViewControllerAnimatedTransitioning>)animator;
!
!
@end
- 20. @protocol UIViewControllerAnimatedTransitioning <NSObject>
!
!
- (NSTimeInterval)transitionDuration:(id
<UIViewControllerContextTransitioning>)transitionContext;
!
- (void)animateTransition:(id
<UIViewControllerContextTransitioning>)transitionContext;
!
!
@optional
!
- (void)animationEnded:(BOOL)transitionCompleted;
!
@end
- 21. @protocol UIViewControllerAnimatedTransitioning <NSObject>
!
!
- (NSTimeInterval)transitionDuration:(id
<UIViewControllerContextTransitioning>)transitionContext;
!
- (void)animateTransition:(id
<UIViewControllerContextTransitioning>)transitionContext;
!
!
@optional
!
- (void)animationEnded:(BOOL)transitionCompleted;
!
@end
- 23. @protocol UIViewControllerAnimatedTransitioning <NSObject>
!
!
- (NSTimeInterval)transitionDuration:(id
<UIViewControllerContextTransitioning>)transitionContext;
!
- (void)animateTransition:(id
<UIViewControllerContextTransitioning>)transitionContext;
!
!
@optional
!
- (void)animationEnded:(BOOL)transitionCompleted;
!
@end
- 24. @protocol UIViewControllerAnimatedTransitioning <NSObject>
!
!
- (NSTimeInterval)transitionDuration:(id
<UIViewControllerContextTransitioning>)transitionContext;
!
- (void)animateTransition:(id
<UIViewControllerContextTransitioning>)transitionContext;
!
!
@optional
!
- (void)animationEnded:(BOOL)transitionCompleted;
!
@end
- 25. UIViewController *fromViewController = [transitionContext
viewControllerForKey:UITransitionContextFromViewControllerKey];
!
UIViewController *toViewController = [transitionContext
viewControllerForKey:UITransitionContextToViewControllerKey];
!
!
toViewController.view.alpha = 0.0f;
toViewController.view.frame = [transitionContext
finalFrameForViewController:toViewController];
!
[transitionContext.containerView addSubview:toViewController.view];
[UIView animateWithDuration:self.duration
delay:0.0
options:0
animations:^{
toViewController.view.alpha = 1.0f;
}
completion:^(BOOL finished) {
[fromViewController.view removeFromSuperview];
[transitionContext completeTransition:YES];
}];
- 27. UIViewController *fromViewController = [transitionContext
viewControllerForKey:UITransitionContextFromViewControllerKey];
!
UIViewController *toViewController = [transitionContext
viewControllerForKey:UITransitionContextToViewControllerKey];
!
!
toViewController.view.alpha = 0.0f;
toViewController.view.frame = [transitionContext
finalFrameForViewController:toViewController];
!
[transitionContext.containerView addSubview:toViewController.view];
[UIView animateWithDuration:self.duration
delay:0.0
options:0
animations:^{
toViewController.view.alpha = 1.0f;
}
completion:^(BOOL finished) {
[fromViewController.view removeFromSuperview];
[transitionContext completeTransition:YES];
}];
- 28. UIViewController *fromViewController = [transitionContext
viewControllerForKey:UITransitionContextFromViewControllerKey];
!
UIViewController *toViewController = [transitionContext
viewControllerForKey:UITransitionContextToViewControllerKey];
!
!
toViewController.view.alpha = 0.0f;
toViewController.view.frame = [transitionContext
finalFrameForViewController:toViewController];
!
[transitionContext.containerView addSubview:toViewController.view];
[UIView animateWithDuration:self.duration
delay:0.0
options:0
animations:^{
toViewController.view.alpha = 1.0f;
}
completion:^(BOOL finished) {
[fromViewController.view removeFromSuperview];
[transitionContext completeTransition:YES];
}];
- 30. UIViewController *fromViewController = [transitionContext
viewControllerForKey:UITransitionContextFromViewControllerKey];
!
UIViewController *toViewController = [transitionContext
viewControllerForKey:UITransitionContextToViewControllerKey];
!
!
toViewController.view.alpha = 0.0f;
toViewController.view.frame = [transitionContext
finalFrameForViewController:toViewController];
!
[transitionContext.containerView addSubview:toViewController.view];
[UIView animateWithDuration:self.duration
delay:0.0
options:0
animations:^{
toViewController.view.alpha = 1.0f;
}
completion:^(BOOL finished) {
[fromViewController.view removeFromSuperview];
[transitionContext completeTransition:YES];
}];
- 31. UIViewController *fromViewController = [transitionContext
viewControllerForKey:UITransitionContextFromViewControllerKey];
!
UIViewController *toViewController = [transitionContext
viewControllerForKey:UITransitionContextToViewControllerKey];
!
!
toViewController.view.alpha = 0.0f;
toViewController.view.frame = [transitionContext
finalFrameForViewController:toViewController];
!
[transitionContext.containerView addSubview:toViewController.view];
[UIView animateWithDuration:self.duration
delay:0.0
options:0
animations:^{
toViewController.view.alpha = 1.0f;
}
completion:^(BOOL finished) {
[fromViewController.view removeFromSuperview];
[transitionContext completeTransition:YES];
}];
- 32. UIViewController *fromViewController = [transitionContext
viewControllerForKey:UITransitionContextFromViewControllerKey];
!
UIViewController *toViewController = [transitionContext
viewControllerForKey:UITransitionContextToViewControllerKey];
!
!
toViewController.view.alpha = 0.0f;
toViewController.view.frame = [transitionContext
finalFrameForViewController:toViewController];
!
[transitionContext.containerView addSubview:toViewController.view];
[UIView animateWithDuration:self.duration
delay:0.0
options:0
animations:^{
toViewController.view.alpha = 1.0f;
}
completion:^(BOOL finished) {
//[fromViewController.view removeFromSuperview];
[transitionContext completeTransition:YES];
}];
- 34. TestViewController *viewController = [TestViewController new];
!
viewController.modalPresentationStyle = UIModalPresentationCustom;
viewController.transitioningDelegate = ???
!
[self presentViewController:viewController animated:YES
completion:nil];
- 51. @protocol UIViewControllerTransitioningDelegate <NSObject>
!
@optional
!
!
- (id <UIViewControllerAnimatedTransitioning>)
animationControllerForPresentedController:(UIViewController *)presented
presentingController:(UIViewController *)presenting sourceController:
(UIViewController *)source;
!
!
- (id <UIViewControllerAnimatedTransitioning>)
animationControllerForDismissedController:(UIViewController *)dismissed;
!
!
- (id
<UIViewControllerInteractiveTransitioning>)interactionControllerForPresentation:(id
<UIViewControllerAnimatedTransitioning>)animator;
!
!
- (id <UIViewControllerInteractiveTransitioning>)interactionControllerForDismissal:
(id <UIViewControllerAnimatedTransitioning>)animator;
!
!
@end
- 52. @protocol UIViewControllerTransitioningDelegate <NSObject>
!
@optional
!
!
- (id <UIViewControllerAnimatedTransitioning>)
animationControllerForPresentedController:(UIViewController *)presented
presentingController:(UIViewController *)presenting sourceController:
(UIViewController *)source;
!
!
- (id <UIViewControllerAnimatedTransitioning>)
animationControllerForDismissedController:(UIViewController *)dismissed;
!
!
- (id
<UIViewControllerInteractiveTransitioning>)interactionControllerForPresentation:(id
<UIViewControllerAnimatedTransitioning>)animator;
!
!
- (id <UIViewControllerInteractiveTransitioning>)interactionControllerForDismissal:
(id <UIViewControllerAnimatedTransitioning>)animator;
!
!
@end
- 59. CGFloat scale = [gestureRecognizer scale];
switch ([gestureRecognizer state]) {
case UIGestureRecognizerStateBegan:
transitionController.interactive = YES;
_startScale = scale;
[testViewController dismissViewControllerAnimated:YES completion:nil];
}
break;
case UIGestureRecognizerStateChanged: {
CGFloat percent = (1.0 - scale/_startScale);
[transitionController.percentDrivenInteractiveTransition updateInteractiveTransition: (percent <= 0.0) ? 0.0 :
percent];
break;
}
case UIGestureRecognizerStateEnded:
case UIGestureRecognizerStateCancelled:
if ([gestureRecognizer velocity] >= 0.0 || [gestureRecognizer state] == UIGestureRecognizerStateCancelled) {
[transitionController.percentDrivenInteractiveTransition cancelInteractiveTransition];
}
else {
[transitionController.percentDrivenInteractiveTransition finishInteractiveTransition];
}
break;
default:
break;
}
- 60. CGFloat scale = [gestureRecognizer scale];
switch ([gestureRecognizer state]) {
case UIGestureRecognizerStateBegan:
transitionController.interactive = YES;
_startScale = scale;
[testViewController dismissViewControllerAnimated:YES completion:nil];
}
break;
case UIGestureRecognizerStateChanged: {
CGFloat percent = (1.0 - scale/_startScale);
[transitionController.percentDrivenInteractiveTransition updateInteractiveTransition: (percent <=
0.0) ? 0.0 : percent];
break;
}
case UIGestureRecognizerStateEnded:
case UIGestureRecognizerStateCancelled:
if ([gestureRecognizer velocity] >= 0.0 || [gestureRecognizer state] == UIGestureRecognizerStateCancelled) {
[transitionController.percentDrivenInteractiveTransition cancelInteractiveTransition];
}
else {
[transitionController.percentDrivenInteractiveTransition finishInteractiveTransition];
}
break;
default:
break;
}
- 70. - (void)viewWillAppear:(BOOL)animated {
[self doSomeSideEffectsAssumingViewDidAppearIsGoingToBeCalled];
id <UIViewControllerTransitionCoordinator> coordinator;
coordinator = [self transitionCoordinator];
if(coordinator && [coordinator initiallyInteractive]) {
[transitionCoordinator notifyWhenInteractionEndsUsingBlock:
^(id <UIViewControllerTransitionCoordinatorContext> ctx) {
if(ctx.isCancelled) {
[self undoSideEffects];
}
}];
}
}
UIViewControllerTransitionCoordinator
- 78. // Snapshot
UIView *fromView = [fromViewController.view snapshotViewAfterScreenUpdates:NO];
!
// Interactivity
fromViewController.view.userInteractionEnabled = NO;
toViewController.view.userInteractionEnabled = YES;
transitionContext.containerView.userInteractionEnabled = YES;
!
[transitionContext.containerView addSubview:fromView];
[transitionContext.containerView addSubview:toViewController.view];
!
// Finish before animation
[transitionContext completeTransition:YES];
!
[UIView animateWithDuration: . . .
- 80. // Prepare BitmapContext
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
GLubyte *textureData = malloc(textureWidth * textureHeight * 4);
memset_pattern4(textureData, "0000", textureWidth * textureHeight * 4);
NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel * textureWidth;
NSUInteger bitsPerComponent = 8;
CGContextRef bitmapContext = CGBitmapContextCreate(textureData, textureWidth,
textureHeight, bitsPerComponent, bytesPerRow, colorSpace,
kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colorSpace);
// draw
[view.layer renderInContext:bitmapContext];
CGContextRelease(bitmapContext);
!
// set data for texture
glBindTexture(GL_TEXTURE_2D, texture);
// set bitmap data into texture
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, textureWidth, textureHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, textureData);
// Don't need this data anymore
free(textureData);