Skip to content

Commit f7516de

Browse files
Created separate horizontal and vertical swipe interaction controllers
1 parent 86c0e0d commit f7516de

File tree

11 files changed

+176
-46
lines changed

11 files changed

+176
-46
lines changed

AnimationControllers/CECardsAnimationController.m

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ -(void)executeForwardsAnimation:(id<UIViewControllerContextTransitioning>)transi
5858
}];
5959

6060
} completion:^(BOOL finished) {
61-
[transitionContext completeTransition:YES];
61+
[transitionContext completeTransition:![transitionContext transitionWasCancelled]];
6262
}];
6363

6464

@@ -89,15 +89,19 @@ -(void)executeReverseAnimation:(id<UIViewControllerContextTransitioning>)transit
8989
}];
9090

9191
// animate the to- view into place
92-
[UIView addKeyframeWithRelativeStartTime:0.3f relativeDuration:0.45f animations:^{
92+
[UIView addKeyframeWithRelativeStartTime:0.35f relativeDuration:0.35f animations:^{
9393
toView.layer.transform = t1;
9494
toView.alpha = 1.0;
9595
}];
9696
[UIView addKeyframeWithRelativeStartTime:0.75f relativeDuration:0.25f animations:^{
9797
toView.layer.transform = CATransform3DIdentity;
9898
}];
9999
} completion:^(BOOL finished) {
100-
[transitionContext completeTransition:YES];
100+
if ([transitionContext transitionWasCancelled]) {
101+
toView.layer.transform = CATransform3DIdentity;
102+
toView.alpha = 1.0;
103+
}
104+
[transitionContext completeTransition:![transitionContext transitionWasCancelled]];
101105
}];
102106
}
103107

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
//
2+
// SwipeInteractionController.h
3+
// ILoveCatz
4+
//
5+
// Created by Colin Eberhardt on 22/08/2013.
6+
// Copyright (c) 2013 com.razeware. All rights reserved.
7+
//
8+
9+
#import <Foundation/Foundation.h>
10+
#import "CEBaseInteractionController.h"
11+
12+
/**
13+
A horizontal swipe interaction controller. When used with a navigation controller, a right-to-left swipe
14+
will cause a 'pop' navigation. When used wth a tabbar controller, right-to-left and left-to-right cause navigation
15+
between neighbouring tabs.
16+
*/
17+
@interface CEHorizontalSwipeInteractionController : CEBaseInteractionController
18+
19+
@end

InteractionControllers/CESwipeInteractionController.m renamed to InteractionControllers/CEHorizontalSwipeInteractionController.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
// Copyright (c) 2013 com.razeware. All rights reserved.
77
//
88

9-
#import "CESwipeInteractionController.h"
9+
#import "CEHorizontalSwipeInteractionController.h"
1010

11-
@implementation CESwipeInteractionController {
11+
@implementation CEHorizontalSwipeInteractionController {
1212
BOOL _shouldCompleteTransition;
1313
UIViewController *_viewController;
1414
UIPanGestureRecognizer *_gesture;

InteractionControllers/CESwipeInteractionController.h

Lines changed: 0 additions & 14 deletions
This file was deleted.
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
//
2+
// CEVerticalSwipeInteactionController.h
3+
// TransitionsDemo
4+
//
5+
// Created by Colin Eberhardt on 22/09/2013.
6+
// Copyright (c) 2013 Colin Eberhardt. All rights reserved.
7+
//
8+
9+
#import "CEBaseInteractionController.h"
10+
11+
/**
12+
A horizontal swipe interaction controller. When used with a navigation controller, a top-to-bottom swipe
13+
will cause a 'pop' navigation. This interaction controller cannot be used with a tabbar controller. That would be silly.
14+
*/
15+
@interface CEVerticalSwipeInteractionController : CEBaseInteractionController
16+
17+
@end
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
//
2+
// CEVerticalSwipeInteactionController.m
3+
// TransitionsDemo
4+
//
5+
// Created by Colin Eberhardt on 22/09/2013.
6+
// Copyright (c) 2013 Colin Eberhardt. All rights reserved.
7+
//
8+
9+
#import "CEVerticalSwipeInteractionController.h"
10+
11+
@implementation CEVerticalSwipeInteractionController {
12+
BOOL _shouldCompleteTransition;
13+
UIViewController *_viewController;
14+
UIPanGestureRecognizer *_gesture;
15+
CEInteractionOperation _operation;
16+
}
17+
18+
-(void)dealloc {
19+
[_gesture.view removeGestureRecognizer:_gesture];
20+
}
21+
22+
- (void)wireToViewController:(UIViewController *)viewController forOperation:(CEInteractionOperation)operation{
23+
24+
if (operation == CEInteractionOperationTab) {
25+
@throw [NSException exceptionWithName:NSInternalInconsistencyException
26+
reason:@"You cannot use a vertical swipe interaction with a tabbar controller - that would be silly!"
27+
userInfo:nil];
28+
}
29+
_operation = operation;
30+
_viewController = viewController;
31+
[self prepareGestureRecognizerInView:viewController.view];
32+
}
33+
34+
35+
- (void)prepareGestureRecognizerInView:(UIView*)view {
36+
_gesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
37+
[view addGestureRecognizer:_gesture];
38+
}
39+
40+
- (CGFloat)completionSpeed
41+
{
42+
return 1 - self.percentComplete;
43+
}
44+
45+
- (void)handleGesture:(UIPanGestureRecognizer*)gestureRecognizer {
46+
CGPoint translation = [gestureRecognizer translationInView:gestureRecognizer.view.superview];
47+
48+
switch (gestureRecognizer.state) {
49+
case UIGestureRecognizerStateBegan: {
50+
51+
BOOL topToBottomSwipe = translation.y > 0;
52+
53+
// perform the required navigation operation ...
54+
55+
if (_operation == CEInteractionOperationPop) {
56+
// for pop operation, fire on top-to-bottom
57+
if (topToBottomSwipe) {
58+
self.interactionInProgress = YES;
59+
[_viewController.navigationController popViewControllerAnimated:YES];
60+
}
61+
} else {
62+
// for dismiss, fire regardless of the translation direction
63+
self.interactionInProgress = YES;
64+
[_viewController dismissViewControllerAnimated:YES completion:nil];
65+
}
66+
break;
67+
}
68+
case UIGestureRecognizerStateChanged: {
69+
if (self.interactionInProgress) {
70+
// compute the current position
71+
CGFloat fraction = fabsf(translation.y / 200.0);
72+
fraction = fminf(fmaxf(fraction, 0.0), 1.0);
73+
_shouldCompleteTransition = (fraction > 0.5);
74+
75+
[self updateInteractiveTransition:fraction];
76+
}
77+
break;
78+
}
79+
case UIGestureRecognizerStateEnded:
80+
case UIGestureRecognizerStateCancelled:
81+
if (self.interactionInProgress) {
82+
self.interactionInProgress = NO;
83+
if (!_shouldCompleteTransition || gestureRecognizer.state == UIGestureRecognizerStateCancelled) {
84+
[self cancelInteractiveTransition];
85+
}
86+
else {
87+
[self finishInteractiveTransition];
88+
}
89+
}
90+
break;
91+
default:
92+
break;
93+
}
94+
}
95+
96+
@end

TabBarDemo/TabBarDemo.xcodeproj/project.pbxproj

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
72EC060017E8DF5D00DCB9A3 /* CETurnAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EC05FA17E8DF5D00DCB9A3 /* CETurnAnimationController.m */; };
3131
72EC060317E9655300DCB9A3 /* TabBarViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EC060217E9655300DCB9A3 /* TabBarViewController.m */; };
3232
72EC060917E96C2500DCB9A3 /* CEBaseInteractionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EC060717E96C2500DCB9A3 /* CEBaseInteractionController.m */; };
33-
72EC060A17E96C2500DCB9A3 /* CESwipeInteractionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EC060817E96C2500DCB9A3 /* CESwipeInteractionController.m */; };
33+
72EE96DE17EF6A5D0097DF82 /* CEHorizontalSwipeInteractionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EE96DD17EF6A5D0097DF82 /* CEHorizontalSwipeInteractionController.m */; };
3434
/* End PBXBuildFile section */
3535

3636
/* Begin PBXContainerItemProxy section */
@@ -79,9 +79,9 @@
7979
72EC060117E9655300DCB9A3 /* TabBarViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TabBarViewController.h; sourceTree = "<group>"; };
8080
72EC060217E9655300DCB9A3 /* TabBarViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TabBarViewController.m; sourceTree = "<group>"; };
8181
72EC060517E96C2500DCB9A3 /* CEBaseInteractionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CEBaseInteractionController.h; path = ../InteractionControllers/CEBaseInteractionController.h; sourceTree = "<group>"; };
82-
72EC060617E96C2500DCB9A3 /* CESwipeInteractionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CESwipeInteractionController.h; path = ../InteractionControllers/CESwipeInteractionController.h; sourceTree = "<group>"; };
8382
72EC060717E96C2500DCB9A3 /* CEBaseInteractionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CEBaseInteractionController.m; path = ../InteractionControllers/CEBaseInteractionController.m; sourceTree = "<group>"; };
84-
72EC060817E96C2500DCB9A3 /* CESwipeInteractionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CESwipeInteractionController.m; path = ../InteractionControllers/CESwipeInteractionController.m; sourceTree = "<group>"; };
83+
72EE96DC17EF6A5D0097DF82 /* CEHorizontalSwipeInteractionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CEHorizontalSwipeInteractionController.h; path = ../InteractionControllers/CEHorizontalSwipeInteractionController.h; sourceTree = "<group>"; };
84+
72EE96DD17EF6A5D0097DF82 /* CEHorizontalSwipeInteractionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CEHorizontalSwipeInteractionController.m; path = ../InteractionControllers/CEHorizontalSwipeInteractionController.m; sourceTree = "<group>"; };
8585
/* End PBXFileReference section */
8686

8787
/* Begin PBXFrameworksBuildPhase section */
@@ -208,10 +208,10 @@
208208
72EC060417E96C0C00DCB9A3 /* InteractionControllers */ = {
209209
isa = PBXGroup;
210210
children = (
211+
72EE96DC17EF6A5D0097DF82 /* CEHorizontalSwipeInteractionController.h */,
212+
72EE96DD17EF6A5D0097DF82 /* CEHorizontalSwipeInteractionController.m */,
211213
72EC060517E96C2500DCB9A3 /* CEBaseInteractionController.h */,
212214
72EC060717E96C2500DCB9A3 /* CEBaseInteractionController.m */,
213-
72EC060617E96C2500DCB9A3 /* CESwipeInteractionController.h */,
214-
72EC060817E96C2500DCB9A3 /* CESwipeInteractionController.m */,
215215
);
216216
name = InteractionControllers;
217217
sourceTree = "<group>";
@@ -315,7 +315,7 @@
315315
buildActionMask = 2147483647;
316316
files = (
317317
72EC060317E9655300DCB9A3 /* TabBarViewController.m in Sources */,
318-
72EC060A17E96C2500DCB9A3 /* CESwipeInteractionController.m in Sources */,
318+
72EE96DE17EF6A5D0097DF82 /* CEHorizontalSwipeInteractionController.m in Sources */,
319319
72EC05D017E8DF3D00DCB9A3 /* ViewController.m in Sources */,
320320
72EC05FF17E8DF5D00DCB9A3 /* CEReversibleAnimationController.m in Sources */,
321321
72EC05C717E8DF3D00DCB9A3 /* AppDelegate.m in Sources */,
@@ -544,6 +544,7 @@
544544
72EC05EA17E8DF3D00DCB9A3 /* Release */,
545545
);
546546
defaultConfigurationIsVisible = 0;
547+
defaultConfigurationName = Release;
547548
};
548549
72EC05EB17E8DF3D00DCB9A3 /* Build configuration list for PBXNativeTarget "TabBarDemoTests" */ = {
549550
isa = XCConfigurationList;
@@ -552,6 +553,7 @@
552553
72EC05ED17E8DF3D00DCB9A3 /* Release */,
553554
);
554555
defaultConfigurationIsVisible = 0;
556+
defaultConfigurationName = Release;
555557
};
556558
/* End XCConfigurationList section */
557559
};

TabBarDemo/TabBarDemo/TabBarViewController.m

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,23 @@
88

99
#import "TabBarViewController.h"
1010
#import "CEFoldAnimationController.h"
11-
#import "CESwipeInteractionController.h"
11+
#import "CEHorizontalSwipeInteractionController.h"
1212

1313
@interface TabBarViewController () <UITabBarControllerDelegate>
1414

1515
@end
1616

1717
@implementation TabBarViewController {
1818
CEFoldAnimationController *_animationController;
19-
CESwipeInteractionController *_swipeInteractionController;
19+
CEHorizontalSwipeInteractionController *_swipeInteractionController;
2020
}
2121

2222
- (id)initWithCoder:(NSCoder *)aDecoder {
2323
if (self = [super initWithCoder:aDecoder]) {
2424
self.delegate = self;
2525

2626
// create the interaction / animation controllers
27-
_swipeInteractionController = [CESwipeInteractionController new];
27+
_swipeInteractionController = [CEHorizontalSwipeInteractionController new];
2828
_animationController = [CEFoldAnimationController new];
2929
_animationController.folds = 3;
3030

TransitionsDemo/TransitionsDemo.xcodeproj/project.pbxproj

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,15 @@
2323
7273236017DFBEBF0072C7FD /* CETurnAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7273235D17DFBEBF0072C7FD /* CETurnAnimationController.m */; };
2424
7273236317DFBEFE0072C7FD /* CEReversibleAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7273236217DFBEFE0072C7FD /* CEReversibleAnimationController.m */; };
2525
7273236917DFBF140072C7FD /* CEBaseInteractionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7273236617DFBF140072C7FD /* CEBaseInteractionController.m */; };
26-
7273236A17DFBF140072C7FD /* CESwipeInteractionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7273236817DFBF140072C7FD /* CESwipeInteractionController.m */; };
26+
7273236A17DFBF140072C7FD /* CEHorizontalSwipeInteractionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7273236817DFBF140072C7FD /* CEHorizontalSwipeInteractionController.m */; };
2727
7273236D17DFC0690072C7FD /* NavigationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7273236C17DFC0690072C7FD /* NavigationController.m */; };
2828
7273237017DFC4710072C7FD /* SettingsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7273236F17DFC4710072C7FD /* SettingsViewController.m */; };
2929
72C15E1117E10C620056B3F9 /* CECrossfadeAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72C15E1017E10C620056B3F9 /* CECrossfadeAnimationController.m */; };
3030
72C15E1417E10E7B0056B3F9 /* CEExplodeAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72C15E1317E10E7B0056B3F9 /* CEExplodeAnimationController.m */; };
3131
72C15E1717E19A940056B3F9 /* CEFoldAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72C15E1617E19A940056B3F9 /* CEFoldAnimationController.m */; };
3232
72EC05A917E7B1BE00DCB9A3 /* CEPinchInteractionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EC05A817E7B1BE00DCB9A3 /* CEPinchInteractionController.m */; };
3333
72EE96D817EF47A60097DF82 /* CECardsAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EE96D717EF47A60097DF82 /* CECardsAnimationController.m */; };
34+
72EE96DB17EF66040097DF82 /* CEVerticalSwipeInteractionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EE96DA17EF66040097DF82 /* CEVerticalSwipeInteractionController.m */; };
3435
/* End PBXBuildFile section */
3536

3637
/* Begin PBXContainerItemProxy section */
@@ -68,8 +69,8 @@
6869
7273236217DFBEFE0072C7FD /* CEReversibleAnimationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CEReversibleAnimationController.m; sourceTree = "<group>"; };
6970
7273236517DFBF140072C7FD /* CEBaseInteractionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CEBaseInteractionController.h; sourceTree = "<group>"; };
7071
7273236617DFBF140072C7FD /* CEBaseInteractionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CEBaseInteractionController.m; sourceTree = "<group>"; };
71-
7273236717DFBF140072C7FD /* CESwipeInteractionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CESwipeInteractionController.h; sourceTree = "<group>"; };
72-
7273236817DFBF140072C7FD /* CESwipeInteractionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CESwipeInteractionController.m; sourceTree = "<group>"; };
72+
7273236717DFBF140072C7FD /* CEHorizontalSwipeInteractionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CEHorizontalSwipeInteractionController.h; sourceTree = "<group>"; };
73+
7273236817DFBF140072C7FD /* CEHorizontalSwipeInteractionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CEHorizontalSwipeInteractionController.m; sourceTree = "<group>"; };
7374
7273236B17DFC0690072C7FD /* NavigationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NavigationController.h; sourceTree = "<group>"; };
7475
7273236C17DFC0690072C7FD /* NavigationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NavigationController.m; sourceTree = "<group>"; };
7576
7273236E17DFC4710072C7FD /* SettingsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SettingsViewController.h; sourceTree = "<group>"; };
@@ -84,6 +85,8 @@
8485
72EC05A817E7B1BE00DCB9A3 /* CEPinchInteractionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CEPinchInteractionController.m; sourceTree = "<group>"; };
8586
72EE96D617EF47A60097DF82 /* CECardsAnimationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CECardsAnimationController.h; sourceTree = "<group>"; };
8687
72EE96D717EF47A60097DF82 /* CECardsAnimationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CECardsAnimationController.m; sourceTree = "<group>"; };
88+
72EE96D917EF66040097DF82 /* CEVerticalSwipeInteractionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CEVerticalSwipeInteractionController.h; sourceTree = "<group>"; };
89+
72EE96DA17EF66040097DF82 /* CEVerticalSwipeInteractionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CEVerticalSwipeInteractionController.m; sourceTree = "<group>"; };
8790
/* End PBXFileReference section */
8891

8992
/* Begin PBXFrameworksBuildPhase section */
@@ -197,10 +200,12 @@
197200
children = (
198201
7273236517DFBF140072C7FD /* CEBaseInteractionController.h */,
199202
7273236617DFBF140072C7FD /* CEBaseInteractionController.m */,
200-
7273236717DFBF140072C7FD /* CESwipeInteractionController.h */,
201-
7273236817DFBF140072C7FD /* CESwipeInteractionController.m */,
203+
7273236717DFBF140072C7FD /* CEHorizontalSwipeInteractionController.h */,
204+
7273236817DFBF140072C7FD /* CEHorizontalSwipeInteractionController.m */,
202205
72EC05A717E7B1BE00DCB9A3 /* CEPinchInteractionController.h */,
203206
72EC05A817E7B1BE00DCB9A3 /* CEPinchInteractionController.m */,
207+
72EE96D917EF66040097DF82 /* CEVerticalSwipeInteractionController.h */,
208+
72EE96DA17EF66040097DF82 /* CEVerticalSwipeInteractionController.m */,
204209
);
205210
name = InteractionControllers;
206211
path = ../InteractionControllers;
@@ -311,9 +316,10 @@
311316
7273233017DFBD4D0072C7FD /* AppDelegate.m in Sources */,
312317
7273232C17DFBD4D0072C7FD /* main.m in Sources */,
313318
7273236017DFBEBF0072C7FD /* CETurnAnimationController.m in Sources */,
314-
7273236A17DFBF140072C7FD /* CESwipeInteractionController.m in Sources */,
319+
7273236A17DFBF140072C7FD /* CEHorizontalSwipeInteractionController.m in Sources */,
315320
7273236D17DFC0690072C7FD /* NavigationController.m in Sources */,
316321
7273237017DFC4710072C7FD /* SettingsViewController.m in Sources */,
322+
72EE96DB17EF66040097DF82 /* CEVerticalSwipeInteractionController.m in Sources */,
317323
7273235F17DFBEBF0072C7FD /* CEFlipAnimationController.m in Sources */,
318324
7273236317DFBEFE0072C7FD /* CEReversibleAnimationController.m in Sources */,
319325
72EE96D817EF47A60097DF82 /* CECardsAnimationController.m in Sources */,

0 commit comments

Comments
 (0)