SlideShare uma empresa Scribd logo
1 de 83
Baixar para ler offline
Custom UIViewController
Transitions
Ján Ilavský - @split82
iPhone OS 3.0
iOS 7
Modal View Controller
- (void)presentViewController:animated:completion:
!
- (void)dismissViewControllerAnimated:completion:
UIModalTransitionStyle modalTransitionStyle
typedef NS_ENUM(NSInteger, UIModalTransitionStyle) {
UIModalTransitionStyleCoverVertical = 0,
UIModalTransitionStyleFlipHorizontal,
UIModalTransitionStyleCrossDissolve,
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_3_2
UIModalTransitionStylePartialCurl,
#endif
};
UIModalPresentationStyle modalPresentationStyle
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
};
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
};
Custom Fullscreen
Non-interactive Transitions
Demo
TestViewController *viewController = [TestViewController new];
!
viewController.transitioningDelegate = ???
!
[self presentViewController:viewController animated:YES
completion:nil];
TestViewController *viewController = [TestViewController new];
!
viewController.transitioningDelegate = ???
!
[self presentViewController:viewController animated:YES
completion:nil];
@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
@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
@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
UIViewController UIViewController
id <UIViewControllerTransitioningDelegate>
transitioningDelegate
animationControllerForPresentedController… animationControllerForDismissedController
id <UIViewControllerAnimatedTransitioning>
id <UIViewControllerAnimatedTransitioning>
present
dismiss
@protocol UIViewControllerAnimatedTransitioning <NSObject>
!
!
- (NSTimeInterval)transitionDuration:(id
<UIViewControllerContextTransitioning>)transitionContext;
!
- (void)animateTransition:(id
<UIViewControllerContextTransitioning>)transitionContext;
!
!
@optional
!
- (void)animationEnded:(BOOL)transitionCompleted;
!
@end
@protocol UIViewControllerAnimatedTransitioning <NSObject>
!
!
- (NSTimeInterval)transitionDuration:(id
<UIViewControllerContextTransitioning>)transitionContext;
!
- (void)animateTransition:(id
<UIViewControllerContextTransitioning>)transitionContext;
!
!
@optional
!
- (void)animationEnded:(BOOL)transitionCompleted;
!
@end
UIView UIView
UIViewController UIViewController
@protocol UIViewControllerAnimatedTransitioning <NSObject>
!
!
- (NSTimeInterval)transitionDuration:(id
<UIViewControllerContextTransitioning>)transitionContext;
!
- (void)animateTransition:(id
<UIViewControllerContextTransitioning>)transitionContext;
!
!
@optional
!
- (void)animationEnded:(BOOL)transitionCompleted;
!
@end
@protocol UIViewControllerAnimatedTransitioning <NSObject>
!
!
- (NSTimeInterval)transitionDuration:(id
<UIViewControllerContextTransitioning>)transitionContext;
!
- (void)animateTransition:(id
<UIViewControllerContextTransitioning>)transitionContext;
!
!
@optional
!
- (void)animationEnded:(BOOL)transitionCompleted;
!
@end
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];
}];
!
Container View
UIView UIView
UIViewController UIViewController
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];
}];
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];
}];
initialFrameForViewController finalFrameForViewController
from CGRectZero
to CGRectZero
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];
}];
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];
}];
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];
}];
Custom Non-Fullscreen
Non-interactive Transitions
TestViewController *viewController = [TestViewController new];
!
viewController.modalPresentationStyle = UIModalPresentationCustom;
viewController.transitioningDelegate = ???
!
[self presentViewController:viewController animated:YES
completion:nil];
UIView
UIView
Demo
Presentation != Dismissal
Presentation
!
Container View
UIView UIView
UIViewController UIViewController
Dismission
!
Container View
UIView UIView
UIViewController UIViewController
initialFrameForViewController finalFrameForViewController
from
to CGRectZero CGRectZero
Presentation
initialFrameForViewController finalFrameForViewController
from CGRectZero
to CGRectZero
Dismissal
viewWillDissapear
!
viewDidDissapear
FromViewController
Presentation
viewWillAppear
!
viewDidAppear
ToViewController
Dismissal
[transitionContext.containerView
addSubview:toViewController.view];
!
toViewController.view.frame = CGRectInset([transitionContext
initialFrameForViewController:fromViewController], 32.0f, 32.0f);
!
toViewController.view.alpha = 0.0f;
!
[UIView animateWithDuration:self.duration
delay:0.0
options:0
animations:^{
toViewController.view.alpha = 1.0f;
}
completion:^(BOOL finished) {
[transitionContext completeTransition:YES];
}];
Presentation
[UIView animateWithDuration:self.duration
delay:0.0
options:0
animations:^{
fromViewController.view.alpha = 0.0f;
}
completion:^(BOOL finished) {
[transitionContext completeTransition:YES];
}];
Dismissal
Interactive Transitions
start complete
start complete
cancel
finish
updating
Demo
UIViewController UIViewController
id <UIViewControllerTransitioningDelegate>
transitioningDelegate
animationControllerForPresentedController… animationControllerForDismissedController
id <UIViewControllerAnimatedTransitioning>
id <UIViewControllerAnimatedTransitioning>
present
dismiss
@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
@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
UIViewController UIViewController
id <UIViewControllerTransitioningDelegate>
transitioningDelegate
animationControllerForPresentedController… animationControllerForDismissedController
id <UIViewControllerAnimatedTransitioning>
id <UIViewControllerAnimatedTransitioning>
present
dismiss
UIViewController UIViewController
id <UIViewControllerTransitioningDelegate>
transitioningDelegate
id <UIViewControllerAnimatedTransitioning>
id <UIViewControllerAnimatedTransitioning>
present
dismiss
id
<UIViewControllerInteractiveTra
nsitioning>
id
<UIViewControllerInteractiveTra
nsitioning>
id <UIViewControllerInteractiveTransitioning>
@protocol UIViewControllerInteractiveTransitioning <NSObject>
!
- (void)startInteractiveTransition:(id
<UIViewControllerContextTransitioning>)transitionContext;
!
@optional
!
- (CGFloat)completionSpeed;
- (UIViewAnimationCurve)completionCurve;
!
@end
UIPercentDrivenInteractiveTransition
UIPercentDrivenInteractiveTransition
- (void)updateInteractiveTransition:(CGFloat)percentComplete;
- (void)cancelInteractiveTransition;
- (void)finishInteractiveTransition;
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;
}
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;
}
Core Animation!
!
+[UIView transitionFromView:toView:duration:options:completion:]!
!
Custom Animations!
!
UIView block-based animations
UIPercentDrivenInteractiveTransition
[UIView animateWithDuration:self.duration
delay:0.0
options:0
animations:^{
toViewController.view.alpha = 1.0f;
}
completion:^(BOOL finished) {
[fromViewController.view removeFromSuperview];
[transitionContext completeTransition:YES];
}];
[UIView animateWithDuration:self.duration
delay:0.0
options:0
animations:^{
toViewController.view.alpha = 1.0f;
}
completion:^(BOOL finished) {
[fromViewController.view removeFromSuperview];
[transitionContext completeTransition:
!transitionContext.transitionWasCancelled];
}];
- (void)startInteractiveTransition:(id
<UIViewControllerContextTransitioning>)transitionContext {
!
_transitionContext = transitionContext;
_toViewController = [transitionContext
viewControllerForKey:UITransitionContextToViewControllerKey];
_toViewController.view.alpha = 0.0f;
_toViewController.view.frame = [transitionContext
finalFrameForViewController:_toViewController];
[transitionContext.containerView addSubview:_toViewController.view];
}
id <UIViewControllerInteractiveTransitioning>
id <UIViewControllerInteractiveTransitioning>
- (void)updateInteractiveTransition:(CGFloat)percentComplete {
_toViewController.view.alpha = percentComplete;
[_transitionContext updateInteractiveTransition:percentComplete];
}
id <UIViewControllerInteractiveTransitioning>
- (void)cancelInteractiveTransition {
[_transitionContext cancelInteractiveTransition];
[UIView animateWithDuration:0.3
delay:0.0
options:0
animations:^{
_toViewController.view.alpha = 0.0f;
}
completion:^(BOOL finished) {
[_transitionContext completeTransition:!
_transitionContext.transitionWasCancelled];
}];
}
viewWillAppear
viewDidAppear
viewWillDisappear
viewDidDisappear
viewWillAppear
viewDidAppear
viewWillDisappear
viewDidDisappear
viewWillAppear viewWillDisappear
viewDidDisappear
- (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
UINavigationController
– pushViewController:animated:
– popViewControllerAnimated:
– popToRootViewControllerAnimated:
– popToViewController:animated:
- (id<UIViewControllerAnimatedTransitioning>)!
navigationController:(UINavigationController *)navigationController
animationControllerForOperation:(UINavigationControllerOperation)operation
fromViewController:(UIViewController *)fromVC !
toViewController:(UIViewController *)toVC
UINavigationControllerDelegate
- (id<UIViewControllerInteractiveTransitioning>)!
navigationController:(UINavigationController *)navigationController
interactionControllerForAnimationController:
(id<UIViewControllerAnimatedTransitioning>)animationController
UINavigationController
@property(nonatomic, readonly) UIGestureRecognizer *interactivePopGestureRecognizer
UITabBarController
@property(nonatomic, assign) UIViewController *selectedViewController
@property(nonatomic) NSUInteger selectedIndex
UITabBarControllerDelegate
- (id <UIViewControllerInteractiveTransitioning>)tabBarController:(UITabBarController *)tabBarController
interactionControllerForAnimationController:(id <UIViewControllerAnimatedTransitioning>)animationController;
!
- (id <UIViewControllerAnimatedTransitioning>)tabBarController:(UITabBarController *)tabBarController
animationControllerForTransitionFromViewController:(UIViewController *)fromVC
toViewController:(UIViewController *)toVC;
finty fň
// 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: . . .
// 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);
fuck off view controllers
Custom UIViewController
Transitions
Ján Ilavský - @split82

Mais conteúdo relacionado

Semelhante a Custom UIViewController Transitions

Protocol Oriented MVVM - Auckland iOS Meetup
Protocol Oriented MVVM - Auckland iOS MeetupProtocol Oriented MVVM - Auckland iOS Meetup
Protocol Oriented MVVM - Auckland iOS MeetupNatasha Murashev
 
Leaving Interface Builder Behind
Leaving Interface Builder BehindLeaving Interface Builder Behind
Leaving Interface Builder BehindJohn Wilker
 
Migrating Objective-C to Swift
Migrating Objective-C to SwiftMigrating Objective-C to Swift
Migrating Objective-C to SwiftElmar Kretzer
 
Quick Start to iOS Development
Quick Start to iOS DevelopmentQuick Start to iOS Development
Quick Start to iOS DevelopmentJussi Pohjolainen
 
Creating Container View Controllers
Creating Container View ControllersCreating Container View Controllers
Creating Container View ControllersBob McCune
 
Architectures in the compose world
Architectures in the compose worldArchitectures in the compose world
Architectures in the compose worldFabio Collini
 
Intro to UIKit • Made by Many
Intro to UIKit • Made by ManyIntro to UIKit • Made by Many
Intro to UIKit • Made by Manykenatmxm
 
ios_summit_2016_korhan
ios_summit_2016_korhanios_summit_2016_korhan
ios_summit_2016_korhanKorhan Bircan
 
There is no spoon - iPhone vs. iPad
There is no spoon - iPhone vs. iPadThere is no spoon - iPhone vs. iPad
There is no spoon - iPhone vs. iPadPaul Ardeleanu
 
Константин Чернухо_Popups, alerts and windows
Константин Чернухо_Popups, alerts and windowsКонстантин Чернухо_Popups, alerts and windows
Константин Чернухо_Popups, alerts and windowsGeeksLab Odessa
 
iOSインタラクションデザイン
iOSインタラクションデザインiOSインタラクションデザイン
iOSインタラクションデザインhIDDENxv
 
Heat on Wed.(ヒートオンウェンズディ)! Vol.1
Heat on Wed.(ヒートオンウェンズディ)! Vol.1Heat on Wed.(ヒートオンウェンズディ)! Vol.1
Heat on Wed.(ヒートオンウェンズディ)! Vol.1Noriyuki Nonomura
 
Projet d'accès aux résultats des étudiant via client mobile
Projet d'accès aux résultats des étudiant via client mobile Projet d'accès aux résultats des étudiant via client mobile
Projet d'accès aux résultats des étudiant via client mobile Patrick Bashizi
 
[22]Efficient and Testable MVVM pattern
[22]Efficient and Testable MVVM pattern[22]Efficient and Testable MVVM pattern
[22]Efficient and Testable MVVM patternNAVER Engineering
 
Compose로 Android:Desktop 멀티플랫폼 만들기.pdf
Compose로 Android:Desktop 멀티플랫폼 만들기.pdfCompose로 Android:Desktop 멀티플랫폼 만들기.pdf
Compose로 Android:Desktop 멀티플랫폼 만들기.pdfssuserb6c2641
 

Semelhante a Custom UIViewController Transitions (20)

Protocol Oriented MVVM - Auckland iOS Meetup
Protocol Oriented MVVM - Auckland iOS MeetupProtocol Oriented MVVM - Auckland iOS Meetup
Protocol Oriented MVVM - Auckland iOS Meetup
 
iOS
iOSiOS
iOS
 
Leaving Interface Builder Behind
Leaving Interface Builder BehindLeaving Interface Builder Behind
Leaving Interface Builder Behind
 
SwiftでUIKitDynamics
SwiftでUIKitDynamicsSwiftでUIKitDynamics
SwiftでUIKitDynamics
 
Migrating Objective-C to Swift
Migrating Objective-C to SwiftMigrating Objective-C to Swift
Migrating Objective-C to Swift
 
Quick Start to iOS Development
Quick Start to iOS DevelopmentQuick Start to iOS Development
Quick Start to iOS Development
 
Protocol-Oriented MVVM
Protocol-Oriented MVVMProtocol-Oriented MVVM
Protocol-Oriented MVVM
 
Creating Container View Controllers
Creating Container View ControllersCreating Container View Controllers
Creating Container View Controllers
 
Architectures in the compose world
Architectures in the compose worldArchitectures in the compose world
Architectures in the compose world
 
004
004004
004
 
Intro to UIKit • Made by Many
Intro to UIKit • Made by ManyIntro to UIKit • Made by Many
Intro to UIKit • Made by Many
 
ios_summit_2016_korhan
ios_summit_2016_korhanios_summit_2016_korhan
ios_summit_2016_korhan
 
There is no spoon - iPhone vs. iPad
There is no spoon - iPhone vs. iPadThere is no spoon - iPhone vs. iPad
There is no spoon - iPhone vs. iPad
 
Константин Чернухо_Popups, alerts and windows
Константин Чернухо_Popups, alerts and windowsКонстантин Чернухо_Popups, alerts and windows
Константин Чернухо_Popups, alerts and windows
 
iOSインタラクションデザイン
iOSインタラクションデザインiOSインタラクションデザイン
iOSインタラクションデザイン
 
Heat on Wed.(ヒートオンウェンズディ)! Vol.1
Heat on Wed.(ヒートオンウェンズディ)! Vol.1Heat on Wed.(ヒートオンウェンズディ)! Vol.1
Heat on Wed.(ヒートオンウェンズディ)! Vol.1
 
iOS_Presentation
iOS_PresentationiOS_Presentation
iOS_Presentation
 
Projet d'accès aux résultats des étudiant via client mobile
Projet d'accès aux résultats des étudiant via client mobile Projet d'accès aux résultats des étudiant via client mobile
Projet d'accès aux résultats des étudiant via client mobile
 
[22]Efficient and Testable MVVM pattern
[22]Efficient and Testable MVVM pattern[22]Efficient and Testable MVVM pattern
[22]Efficient and Testable MVVM pattern
 
Compose로 Android:Desktop 멀티플랫폼 만들기.pdf
Compose로 Android:Desktop 멀티플랫폼 만들기.pdfCompose로 Android:Desktop 멀티플랫폼 만들기.pdf
Compose로 Android:Desktop 멀티플랫폼 만들기.pdf
 

Último

Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsAlberto González Trastoy
 
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerHow To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerThousandEyes
 
10 Trends Likely to Shape Enterprise Technology in 2024
10 Trends Likely to Shape Enterprise Technology in 202410 Trends Likely to Shape Enterprise Technology in 2024
10 Trends Likely to Shape Enterprise Technology in 2024Mind IT Systems
 
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesVictorSzoltysek
 
How To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsHow To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsAndolasoft Inc
 
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfintroduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfVishalKumarJha10
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVshikhaohhpro
 
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...OnePlan Solutions
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech studentsHimanshiGarg82
 
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...kalichargn70th171
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...Health
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...ICS
 
A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxComplianceQuest1
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comFatema Valibhai
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension AidPhilip Schwarz
 
Define the academic and professional writing..pdf
Define the academic and professional writing..pdfDefine the academic and professional writing..pdf
Define the academic and professional writing..pdfPearlKirahMaeRagusta1
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsArshad QA
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionSolGuruz
 
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionIntroducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionOnePlan Solutions
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Modelsaagamshah0812
 

Último (20)

Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
 
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerHow To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
 
10 Trends Likely to Shape Enterprise Technology in 2024
10 Trends Likely to Shape Enterprise Technology in 202410 Trends Likely to Shape Enterprise Technology in 2024
10 Trends Likely to Shape Enterprise Technology in 2024
 
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
 
How To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsHow To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.js
 
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfintroduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTV
 
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students
 
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
 
A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docx
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.com
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
Define the academic and professional writing..pdf
Define the academic and professional writing..pdfDefine the academic and professional writing..pdf
Define the academic and professional writing..pdf
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview Questions
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with Precision
 
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionIntroducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Models
 

Custom UIViewController Transitions