gme_2
6 years ago
42 changed files with 11478 additions and 5170 deletions
-
6GMERemittance.xcodeproj/project.pbxproj
-
1Podfile
-
6Podfile.lock
-
41Pods/LGSideMenuController/LGSideMenuController/LGSideMenuBorderView.h
-
94Pods/LGSideMenuController/LGSideMenuController/LGSideMenuBorderView.m
-
881Pods/LGSideMenuController/LGSideMenuController/LGSideMenuController.h
-
3317Pods/LGSideMenuController/LGSideMenuController/LGSideMenuController.m
-
47Pods/LGSideMenuController/LGSideMenuController/LGSideMenuGesturesHandler.h
-
106Pods/LGSideMenuController/LGSideMenuController/LGSideMenuGesturesHandler.m
-
55Pods/LGSideMenuController/LGSideMenuController/LGSideMenuHelper.h
-
114Pods/LGSideMenuController/LGSideMenuController/LGSideMenuHelper.m
-
34Pods/LGSideMenuController/LGSideMenuController/LGSideMenuSegue.h
-
49Pods/LGSideMenuController/LGSideMenuController/LGSideMenuSegue.m
-
36Pods/LGSideMenuController/LGSideMenuController/LGSideMenuView.h
-
54Pods/LGSideMenuController/LGSideMenuController/LGSideMenuView.m
-
63Pods/LGSideMenuController/LGSideMenuController/UIViewController+LGSideMenuController.h
-
131Pods/LGSideMenuController/LGSideMenuController/UIViewController+LGSideMenuController.m
-
21Pods/LGSideMenuController/LICENSE
-
741Pods/LGSideMenuController/README.md
-
6Pods/Manifest.lock
-
10555Pods/Pods.xcodeproj/project.pbxproj
-
26Pods/Target Support Files/LGSideMenuController/Info.plist
-
5Pods/Target Support Files/LGSideMenuController/LGSideMenuController-dummy.m
-
12Pods/Target Support Files/LGSideMenuController/LGSideMenuController-prefix.pch
-
23Pods/Target Support Files/LGSideMenuController/LGSideMenuController-umbrella.h
-
6Pods/Target Support Files/LGSideMenuController/LGSideMenuController.modulemap
-
8Pods/Target Support Files/LGSideMenuController/LGSideMenuController.xcconfig
-
25Pods/Target Support Files/Pods-GMERemittance/Pods-GMERemittance-acknowledgements.markdown
-
31Pods/Target Support Files/Pods-GMERemittance/Pods-GMERemittance-acknowledgements.plist
-
2Pods/Target Support Files/Pods-GMERemittance/Pods-GMERemittance-frameworks.sh
-
6Pods/Target Support Files/Pods-GMERemittance/Pods-GMERemittance.debug.xcconfig
-
6Pods/Target Support Files/Pods-GMERemittance/Pods-GMERemittance.release.xcconfig
-
25Pods/Target Support Files/Pods-GMERemittanceTests/Pods-GMERemittanceTests-acknowledgements.markdown
-
31Pods/Target Support Files/Pods-GMERemittanceTests/Pods-GMERemittanceTests-acknowledgements.plist
-
2Pods/Target Support Files/Pods-GMERemittanceTests/Pods-GMERemittanceTests-frameworks.sh
-
6Pods/Target Support Files/Pods-GMERemittanceTests/Pods-GMERemittanceTests.debug.xcconfig
-
6Pods/Target Support Files/Pods-GMERemittanceTests/Pods-GMERemittanceTests.release.xcconfig
-
25Pods/Target Support Files/Pods-GMERemittanceUITests/Pods-GMERemittanceUITests-acknowledgements.markdown
-
31Pods/Target Support Files/Pods-GMERemittanceUITests/Pods-GMERemittanceUITests-acknowledgements.plist
-
2Pods/Target Support Files/Pods-GMERemittanceUITests/Pods-GMERemittanceUITests-frameworks.sh
-
6Pods/Target Support Files/Pods-GMERemittanceUITests/Pods-GMERemittanceUITests.debug.xcconfig
-
6Pods/Target Support Files/Pods-GMERemittanceUITests/Pods-GMERemittanceUITests.release.xcconfig
@ -0,0 +1,41 @@ |
|||
// |
|||
// LGSideMenuBorderView.h |
|||
// LGSideMenuController |
|||
// |
|||
// |
|||
// The MIT License (MIT) |
|||
// |
|||
// Copyright © 2015 Grigory Lutkov <Friend.LGA@gmail.com> |
|||
// (https://github.com/Friend-LGA/LGSideMenuController) |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// |
|||
// The above copyright notice and this permission notice shall be included in all |
|||
// copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|||
// SOFTWARE. |
|||
// |
|||
|
|||
#import <UIKit/UIKit.h> |
|||
|
|||
@interface LGSideMenuBorderView : UIView |
|||
|
|||
@property (assign, nonatomic) UIRectCorner roundedCorners; |
|||
@property (assign, nonatomic) CGFloat cornerRadius; |
|||
@property (strong, nonatomic, nullable) UIColor *strokeColor; |
|||
@property (assign, nonatomic) CGFloat strokeWidth; |
|||
@property (strong, nonatomic, nullable) UIColor *shadowColor; |
|||
@property (assign, nonatomic) CGFloat shadowBlur; |
|||
|
|||
@end |
@ -0,0 +1,94 @@ |
|||
// |
|||
// LGSideMenuBorderView.m |
|||
// LGSideMenuController |
|||
// |
|||
// |
|||
// The MIT License (MIT) |
|||
// |
|||
// Copyright © 2015 Grigory Lutkov <Friend.LGA@gmail.com> |
|||
// (https://github.com/Friend-LGA/LGSideMenuController) |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// |
|||
// The above copyright notice and this permission notice shall be included in all |
|||
// copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|||
// SOFTWARE. |
|||
// |
|||
|
|||
#import "LGSideMenuBorderView.h" |
|||
|
|||
@implementation LGSideMenuBorderView |
|||
|
|||
- (instancetype)init { |
|||
self = [super init]; |
|||
if (self) { |
|||
self.backgroundColor = UIColor.clearColor; |
|||
self.userInteractionEnabled = NO; |
|||
} |
|||
return self; |
|||
} |
|||
|
|||
- (void)drawRect:(CGRect)rect { |
|||
[super drawRect:rect]; |
|||
|
|||
if ((!self.strokeColor && !self.shadowColor) || (!self.strokeWidth && !self.shadowBlur)) return; |
|||
|
|||
CGContextRef context = UIGraphicsGetCurrentContext(); |
|||
|
|||
// Fill |
|||
|
|||
if (self.shadowBlur && self.shadowColor) { |
|||
CGContextSetShadowWithColor(context, CGSizeZero, self.shadowBlur, self.shadowColor.CGColor); |
|||
} |
|||
|
|||
CGFloat offset = self.shadowBlur * 2.0; |
|||
CGRect drawRect = CGRectMake(self.shadowBlur, |
|||
self.shadowBlur, |
|||
CGRectGetWidth(rect) - offset, |
|||
CGRectGetHeight(rect) - offset); |
|||
|
|||
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:drawRect |
|||
byRoundingCorners:self.roundedCorners |
|||
cornerRadii:CGSizeMake(self.cornerRadius, self.cornerRadius)]; |
|||
[path closePath]; |
|||
|
|||
[UIColor.blackColor setFill]; |
|||
[path fill]; |
|||
|
|||
// Remove black background |
|||
|
|||
CGContextSetShadowWithColor(context, CGSizeZero, 0.0, nil); |
|||
|
|||
CGContextSetBlendMode(context, kCGBlendModeClear); |
|||
[path fill]; |
|||
CGContextSetBlendMode(context, kCGBlendModeNormal); |
|||
|
|||
// Stroke |
|||
|
|||
if (self.strokeWidth && self.strokeColor) { |
|||
[self.strokeColor setFill]; |
|||
[path fill]; |
|||
|
|||
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectInset(drawRect, self.strokeWidth, self.strokeWidth) |
|||
byRoundingCorners:self.roundedCorners |
|||
cornerRadii:CGSizeMake(self.cornerRadius, self.cornerRadius)]; |
|||
|
|||
CGContextSetBlendMode(context, kCGBlendModeClear); |
|||
[path fill]; |
|||
CGContextSetBlendMode(context, kCGBlendModeNormal); |
|||
} |
|||
} |
|||
|
|||
@end |
@ -0,0 +1,881 @@ |
|||
// |
|||
// LGSideMenuController.h |
|||
// LGSideMenuController |
|||
// |
|||
// |
|||
// The MIT License (MIT) |
|||
// |
|||
// Copyright © 2015 Grigory Lutkov <Friend.LGA@gmail.com> |
|||
// (https://github.com/Friend-LGA/LGSideMenuController) |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// |
|||
// The above copyright notice and this permission notice shall be included in all |
|||
// copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|||
// SOFTWARE. |
|||
// |
|||
|
|||
#import <UIKit/UIKit.h> |
|||
|
|||
@class LGSideMenuController; |
|||
@protocol LGSideMenuDelegate; |
|||
|
|||
#pragma mark - Constants |
|||
|
|||
extern NSString * _Nonnull const LGSideMenuWillShowLeftViewNotification; |
|||
extern NSString * _Nonnull const LGSideMenuDidShowLeftViewNotification; |
|||
|
|||
extern NSString * _Nonnull const LGSideMenuWillHideLeftViewNotification; |
|||
extern NSString * _Nonnull const LGSideMenuDidHideLeftViewNotification; |
|||
|
|||
extern NSString * _Nonnull const LGSideMenuWillShowRightViewNotification; |
|||
extern NSString * _Nonnull const LGSideMenuDidShowRightViewNotification; |
|||
|
|||
extern NSString * _Nonnull const LGSideMenuWillHideRightViewNotification; |
|||
extern NSString * _Nonnull const LGSideMenuDidHideRightViewNotification; |
|||
|
|||
/** You can use this notification to add some custom animations */ |
|||
extern NSString *_Nonnull const LGSideMenuShowLeftViewAnimationsNotification; |
|||
/** You can use this notification to add some custom animations */ |
|||
extern NSString *_Nonnull const LGSideMenuHideLeftViewAnimationsNotification; |
|||
|
|||
/** You can use this notification to add some custom animations */ |
|||
extern NSString *_Nonnull const LGSideMenuShowRightViewAnimationsNotification; |
|||
/** You can use this notification to add some custom animations */ |
|||
extern NSString *_Nonnull const LGSideMenuHideRightViewAnimationsNotification; |
|||
|
|||
/** Key for notifications userInfo dictionary */ |
|||
extern NSString * _Nonnull const kLGSideMenuView; |
|||
/** Key for notifications userInfo dictionary */ |
|||
extern NSString * _Nonnull const kLGSideMenuAnimationDuration; |
|||
|
|||
static NSString * _Nonnull const LGSideMenuSegueRootIdentifier = @"root"; |
|||
static NSString * _Nonnull const LGSideMenuSegueLeftIdentifier = @"left"; |
|||
static NSString * _Nonnull const LGSideMenuSegueRightIdentifier = @"right"; |
|||
|
|||
#pragma mark - Types |
|||
|
|||
typedef void (^ _Nullable LGSideMenuCompletionHandler)(); |
|||
typedef void (^ _Nullable LGSideMenuHandler)(LGSideMenuController * _Nonnull sideMenuController, UIView * _Nonnull view); |
|||
typedef void (^ _Nullable LGSideMenuAnimationsBlock)(LGSideMenuController * _Nonnull sideMenuController, UIView * _Nonnull view, NSTimeInterval duration); |
|||
|
|||
typedef NS_OPTIONS(NSUInteger, LGSideMenuAlwaysVisibleOptions) { |
|||
LGSideMenuAlwaysVisibleOnNone = 0, |
|||
LGSideMenuAlwaysVisibleOnLandscape = 1 << 1, |
|||
LGSideMenuAlwaysVisibleOnPortrait = 1 << 2, |
|||
LGSideMenuAlwaysVisibleOnPad = 1 << 3, |
|||
LGSideMenuAlwaysVisibleOnPhone = 1 << 4, |
|||
LGSideMenuAlwaysVisibleOnPadLandscape = 1 << 5, |
|||
LGSideMenuAlwaysVisibleOnPadPortrait = 1 << 6, |
|||
LGSideMenuAlwaysVisibleOnPhoneLandscape = 1 << 7, |
|||
LGSideMenuAlwaysVisibleOnPhonePortrait = 1 << 8, |
|||
LGSideMenuAlwaysVisibleOnAll = 1 << 9 |
|||
}; |
|||
|
|||
typedef NS_ENUM(NSUInteger, LGSideMenuPresentationStyle) { |
|||
LGSideMenuPresentationStyleSlideAbove = 0, |
|||
LGSideMenuPresentationStyleSlideBelow = 1, |
|||
LGSideMenuPresentationStyleScaleFromBig = 2, |
|||
LGSideMenuPresentationStyleScaleFromLittle = 3 |
|||
}; |
|||
|
|||
typedef NS_ENUM(NSUInteger, LGSideMenuSwipeGestureArea) { |
|||
LGSideMenuSwipeGestureAreaBorders = 0, |
|||
LGSideMenuSwipeGestureAreaFull = 1 |
|||
}; |
|||
|
|||
typedef struct LGSideMenuSwipeGestureRange { |
|||
CGFloat left; |
|||
CGFloat right; |
|||
} LGSideMenuSwipeGestureRange; |
|||
|
|||
LGSideMenuSwipeGestureRange LGSideMenuSwipeGestureRangeMake(CGFloat left, CGFloat right); |
|||
|
|||
#pragma mark - Interface |
|||
|
|||
@interface LGSideMenuController : UIViewController |
|||
|
|||
@property (strong, nonatomic, nullable) UIViewController *rootViewController; |
|||
@property (strong, nonatomic, nullable) UIViewController *leftViewController; |
|||
@property (strong, nonatomic, nullable) UIViewController *rightViewController; |
|||
|
|||
@property (strong, nonatomic, nullable) UIView *rootView; |
|||
@property (strong, nonatomic, nullable) UIView *leftView; |
|||
@property (strong, nonatomic, nullable) UIView *rightView; |
|||
|
|||
/** Container for rootViewController or rootView. Usually you do not need to use it */ |
|||
@property (strong, nonatomic, nullable, readonly) UIView *rootViewContainer; |
|||
/** Container for leftViewController or leftView. Usually you do not need to use it */ |
|||
@property (strong, nonatomic, nullable, readonly) UIView *leftViewContainer; |
|||
/** Container for rightViewController or rightView. Usually you do not need to use it */ |
|||
@property (strong, nonatomic, nullable, readonly) UIView *rightViewContainer; |
|||
|
|||
@property (strong, nonatomic, nullable, readonly) UIImageView *leftViewBackgroundView; |
|||
@property (strong, nonatomic, nullable, readonly) UIImageView *rightViewBackgroundView; |
|||
|
|||
/** tapGesture.cancelsTouchesInView = NO */ |
|||
@property (strong, nonatomic, readonly, nonnull) UITapGestureRecognizer *tapGesture; |
|||
/** panGesture.cancelsTouchesInView = YES, only inside your swipeGestureArea */ |
|||
@property (strong, nonatomic, readonly, nonnull) UIPanGestureRecognizer *panGesture; |
|||
|
|||
#pragma mark - Static defaults |
|||
|
|||
/** |
|||
Default: |
|||
if (iPhone) then MainScreen.size.min - 44.0 |
|||
else 320.0 |
|||
*/ |
|||
@property (assign, nonatomic) IBInspectable CGFloat leftViewWidth; |
|||
/** |
|||
Default: |
|||
if (iPhone) then MainScreen.size.min - 44.0 |
|||
else 320.0 |
|||
*/ |
|||
@property (assign, nonatomic) IBInspectable CGFloat rightViewWidth; |
|||
|
|||
/** Default is LGSideMenuPresentationStyleSlideAbove */ |
|||
#if TARGET_INTERFACE_BUILDER |
|||
@property (assign, nonatomic) IBInspectable NSUInteger leftViewPresentationStyle; |
|||
#else |
|||
@property (assign, nonatomic) LGSideMenuPresentationStyle leftViewPresentationStyle; |
|||
#endif |
|||
/** Default is LGSideMenuPresentationStyleSlideAbove */ |
|||
#if TARGET_INTERFACE_BUILDER |
|||
@property (assign, nonatomic) IBInspectable NSUInteger rightViewPresentationStyle; |
|||
#else |
|||
@property (assign, nonatomic) LGSideMenuPresentationStyle rightViewPresentationStyle; |
|||
#endif |
|||
|
|||
/** Default is LGSideMenuAlwaysVisibleOnNone */ |
|||
#if TARGET_INTERFACE_BUILDER |
|||
@property (assign, nonatomic) IBInspectable NSUInteger leftViewAlwaysVisibleOptions; |
|||
#else |
|||
@property (assign, nonatomic) LGSideMenuAlwaysVisibleOptions leftViewAlwaysVisibleOptions; |
|||
#endif |
|||
/** Default is LGSideMenuAlwaysVisibleOnNone */ |
|||
#if TARGET_INTERFACE_BUILDER |
|||
@property (assign, nonatomic) IBInspectable NSUInteger rightViewAlwaysVisibleOptions; |
|||
#else |
|||
@property (assign, nonatomic) LGSideMenuAlwaysVisibleOptions rightViewAlwaysVisibleOptions; |
|||
#endif |
|||
|
|||
/** Default is YES */ |
|||
@property (assign, nonatomic, getter=isLeftViewHidesOnTouch) IBInspectable BOOL leftViewHidesOnTouch; |
|||
/** Default is YES */ |
|||
@property (assign, nonatomic, getter=isRightViewHidesOnTouch) IBInspectable BOOL rightViewHidesOnTouch; |
|||
|
|||
/** Default is YES */ |
|||
@property (assign, nonatomic, getter=isLeftViewSwipeGestureEnabled) IBInspectable BOOL leftViewSwipeGestureEnabled; |
|||
/** Default is YES */ |
|||
@property (assign, nonatomic, getter=isRightViewSwipeGestureEnabled) IBInspectable BOOL rightViewSwipeGestureEnabled; |
|||
|
|||
/** Default is NO */ |
|||
@property (assign, nonatomic, getter=isLeftViewSwipeGestureDisabled) BOOL leftViewSwipeGestureDisabled; |
|||
/** Default is NO */ |
|||
@property (assign, nonatomic, getter=isRightViewSwipeGestureDisabled) BOOL rightViewSwipeGestureDisabled; |
|||
|
|||
/** Default is LGSideMenuSwipeGestureAreaBorders */ |
|||
#if TARGET_INTERFACE_BUILDER |
|||
@property (assign, nonatomic) IBInspectable NSUInteger swipeGestureArea; |
|||
#else |
|||
@property (assign, nonatomic) LGSideMenuSwipeGestureArea swipeGestureArea; |
|||
#endif |
|||
|
|||
/** |
|||
Only if (swipeGestureArea == LGSideMenuSwipeGestureAreaBorders) |
|||
Default is LGSideMenuSwipeGestureRangeMake(44.0, 44.0) |
|||
Explanation: |
|||
For LGSideMenuSwipeGestureRangeMake(44.0, 44.0) => leftView 44 | 44 rootView |
|||
For LGSideMenuSwipeGestureRangeMake(0.0, 44.0) => leftView | 44 rootView |
|||
For LGSideMenuSwipeGestureRangeMake(44.0, 0.0) => leftView 44 | rootView |
|||
*/ |
|||
@property (assign, nonatomic) IBInspectable LGSideMenuSwipeGestureRange leftViewSwipeGestureRange; |
|||
|
|||
/** |
|||
Only if (swipeGestureArea == LGSideMenuSwipeGestureAreaBorders) |
|||
Default is LGSideMenuSwipeGestureRangeMake(44.0, 44.0) |
|||
Explanation: |
|||
For LGSideMenuSwipeGestureRangeMake(44.0, 44.0) => rootView 44 | 44 rightView |
|||
For LGSideMenuSwipeGestureRangeMake(44.0, 0.0) => rootView 44 | rightView |
|||
For LGSideMenuSwipeGestureRangeMake(0.0, 44.0) => rootView | 44 rightView |
|||
*/ |
|||
@property (assign, nonatomic) IBInspectable LGSideMenuSwipeGestureRange rightViewSwipeGestureRange; |
|||
|
|||
/** Default is 0.5 */ |
|||
@property (assign, nonatomic) IBInspectable NSTimeInterval leftViewAnimationDuration; |
|||
/** Default is 0.5 */ |
|||
@property (assign, nonatomic) IBInspectable NSTimeInterval rightViewAnimationDuration; |
|||
|
|||
/** Default is YES */ |
|||
@property (assign, nonatomic) IBInspectable BOOL shouldHideLeftViewAnimated; |
|||
/** Default is YES */ |
|||
@property (assign, nonatomic) IBInspectable BOOL shouldHideRightViewAnimated; |
|||
|
|||
/** Default is YES */ |
|||
@property (assign, nonatomic, getter=isLeftViewEnabled) IBInspectable BOOL leftViewEnabled; |
|||
/** Default is YES */ |
|||
@property (assign, nonatomic, getter=isRightViewEnabled) IBInspectable BOOL rightViewEnabled; |
|||
|
|||
/** Default is NO */ |
|||
@property (assign, nonatomic, getter=isLeftViewDisabled) BOOL leftViewDisabled; |
|||
/** Default is NO */ |
|||
@property (assign, nonatomic, getter=isRightViewDisabled) BOOL rightViewDisabled; |
|||
|
|||
/** Default is nil */ |
|||
@property (strong, nonatomic, nullable) IBInspectable UIColor *leftViewBackgroundColor; |
|||
/** Default is nil */ |
|||
@property (strong, nonatomic, nullable) IBInspectable UIColor *rightViewBackgroundColor; |
|||
|
|||
/** |
|||
Only if (presentationStyle != LGSideMenuPresentationStyleSlideAbove) |
|||
Default is nil |
|||
*/ |
|||
@property (strong, nonatomic, nullable) IBInspectable UIImage *leftViewBackgroundImage; |
|||
/** |
|||
Only if (presentationStyle != LGSideMenuPresentationStyleSlideAbove) |
|||
Default is nil |
|||
*/ |
|||
@property (strong, nonatomic, nullable) IBInspectable UIImage *rightViewBackgroundImage; |
|||
|
|||
/** |
|||
Only if (presentationStyle == LGSideMenuPresentationStyleSlideAbove) |
|||
Default is nil |
|||
*/ |
|||
@property (strong, nonatomic, nullable) IBInspectable UIBlurEffect *leftViewBackgroundBlurEffect; |
|||
/** |
|||
Only if (presentationStyle == LGSideMenuPresentationStyleSlideAbove) |
|||
Default is nil |
|||
*/ |
|||
@property (strong, nonatomic, nullable) IBInspectable UIBlurEffect *rightViewBackgroundBlurEffect; |
|||
|
|||
/** |
|||
Only if (presentationStyle == LGSideMenuPresentationStyleSlideAbove) |
|||
Default is 1.0 |
|||
*/ |
|||
@property (assign, nonatomic) IBInspectable CGFloat leftViewBackgroundAlpha; |
|||
/** |
|||
Only if (presentationStyle == LGSideMenuPresentationStyleSlideAbove) |
|||
Default is 1.0 |
|||
*/ |
|||
@property (assign, nonatomic) IBInspectable CGFloat rightViewBackgroundAlpha; |
|||
|
|||
/** Default is nil */ |
|||
@property (strong, nonatomic, nullable) IBInspectable UIColor *rootViewLayerBorderColor; |
|||
/** |
|||
Only if (presentationStyle == LGSideMenuPresentationStyleSlideAbove) |
|||
Default is nil |
|||
*/ |
|||
@property (strong, nonatomic, nullable) IBInspectable UIColor *leftViewLayerBorderColor; |
|||
/** |
|||
Only if (presentationStyle == LGSideMenuPresentationStyleSlideAbove) |
|||
Default is nil |
|||
*/ |
|||
@property (strong, nonatomic, nullable) IBInspectable UIColor *rightViewLayerBorderColor; |
|||
|
|||
/** Default is 0.0 */ |
|||
@property (assign, nonatomic) IBInspectable CGFloat rootViewLayerBorderWidth; |
|||
/** |
|||
Only if (presentationStyle == LGSideMenuPresentationStyleSlideAbove) |
|||
Default is 0.0 |
|||
*/ |
|||
@property (assign, nonatomic) IBInspectable CGFloat leftViewLayerBorderWidth; |
|||
/** |
|||
Only if (presentationStyle == LGSideMenuPresentationStyleSlideAbove) |
|||
Default is 0.0 |
|||
*/ |
|||
@property (assign, nonatomic) IBInspectable CGFloat rightViewLayerBorderWidth; |
|||
|
|||
/** Default is [UIColor colorWithWhite:0.0 alpha:0.5] */ |
|||
@property (strong, nonatomic, nullable) IBInspectable UIColor *rootViewLayerShadowColor; |
|||
/** |
|||
Only if (presentationStyle == LGSideMenuPresentationStyleSlideAbove) |
|||
Default is [UIColor colorWithWhite:0.0 alpha:0.5] |
|||
*/ |
|||
@property (strong, nonatomic, nullable) IBInspectable UIColor *leftViewLayerShadowColor; |
|||
/** |
|||
Only if (presentationStyle == LGSideMenuPresentationStyleSlideAbove) |
|||
Default is [UIColor colorWithWhite:0.0 alpha:0.5] |
|||
*/ |
|||
@property (strong, nonatomic, nullable) IBInspectable UIColor *rightViewLayerShadowColor; |
|||
|
|||
/** Default is 5.0 */ |
|||
@property (assign, nonatomic) IBInspectable CGFloat rootViewLayerShadowRadius; |
|||
/** |
|||
Only if (presentationStyle == LGSideMenuPresentationStyleSlideAbove) |
|||
Default is 5.0 |
|||
*/ |
|||
@property (assign, nonatomic) IBInspectable CGFloat leftViewLayerShadowRadius; |
|||
/** |
|||
Only if (presentationStyle == LGSideMenuPresentationStyleSlideAbove) |
|||
Default is 5.0 |
|||
*/ |
|||
@property (assign, nonatomic) IBInspectable CGFloat rightViewLayerShadowRadius; |
|||
|
|||
/** Default is nil */ |
|||
@property (strong, nonatomic, nullable) IBInspectable UIBlurEffect *rootViewCoverBlurEffectForLeftView; |
|||
/** Default is nil */ |
|||
@property (strong, nonatomic, nullable) IBInspectable UIBlurEffect *rootViewCoverBlurEffectForRightView; |
|||
/** |
|||
Only if (presentationStyle != LGSideMenuPresentationStyleSlideAbove) |
|||
Default is nil |
|||
*/ |
|||
@property (strong, nonatomic, nullable) IBInspectable UIBlurEffect *leftViewCoverBlurEffect; |
|||
/** |
|||
Only if (presentationStyle != LGSideMenuPresentationStyleSlideAbove) |
|||
Default is nil |
|||
*/ |
|||
@property (strong, nonatomic, nullable) IBInspectable UIBlurEffect *rightViewCoverBlurEffect; |
|||
|
|||
/** Default is 1.0 */ |
|||
@property (assign, nonatomic) IBInspectable CGFloat rootViewCoverAlphaForLeftView; |
|||
/** Default is 1.0 */ |
|||
@property (assign, nonatomic) IBInspectable CGFloat rootViewCoverAlphaForRightView; |
|||
/** |
|||
Only if (presentationStyle != LGSideMenuPresentationStyleSlideAbove) |
|||
Default is 1.0 |
|||
*/ |
|||
@property (assign, nonatomic) IBInspectable CGFloat leftViewCoverAlpha; |
|||
/** |
|||
Only if (presentationStyle != LGSideMenuPresentationStyleSlideAbove) |
|||
Default is 1.0 |
|||
*/ |
|||
@property (assign, nonatomic) IBInspectable CGFloat rightViewCoverAlpha; |
|||
|
|||
#pragma mark - Dynamic defaults |
|||
|
|||
/** |
|||
Default: |
|||
if (rootViewController != nil) then rootViewController.shouldAutorotate |
|||
else super.shouldAutorotate |
|||
*/ |
|||
@property (assign, nonatomic) IBInspectable BOOL rootViewShouldAutorotate; |
|||
|
|||
/** |
|||
Default: |
|||
if (view controller-based status bar appearance == NO) then UIApplication.sharedApplication.statusBarHidden |
|||
else if (rootViewController != nil) then rootViewController.prefersStatusBarHidden |
|||
else super.prefersStatusBarHidden |
|||
*/ |
|||
@property (assign, nonatomic, getter=isRootViewStatusBarHidden) IBInspectable BOOL rootViewStatusBarHidden; |
|||
/** |
|||
Default: |
|||
if (view controller-based status bar appearance == NO) then UIApplication.sharedApplication.statusBarHidden |
|||
else if (leftViewController != nil) then leftViewController.prefersStatusBarHidden |
|||
else if (rootViewController != nil) then rootViewController.prefersStatusBarHidden |
|||
else super.prefersStatusBarHidden |
|||
*/ |
|||
@property (assign, nonatomic, getter=isLeftViewStatusBarHidden) IBInspectable BOOL leftViewStatusBarHidden; |
|||
/** |
|||
Default: |
|||
if (view controller-based status bar appearance == NO) then UIApplication.sharedApplication.statusBarHidden |
|||
else if (rightViewController != nil) then rightViewController.prefersStatusBarHidden |
|||
else if (rootViewController != nil) then rootViewController.prefersStatusBarHidden |
|||
else super.prefersStatusBarHidden |
|||
*/ |
|||
@property (assign, nonatomic, getter=isRightViewStatusBarHidden) IBInspectable BOOL rightViewStatusBarHidden; |
|||
|
|||
/** |
|||
Default: |
|||
if (view controller-based status bar appearance == NO) then UIApplication.sharedApplication.statusBarStyle |
|||
else if (rootViewController != nil) then rootViewController.preferredStatusBarStyle |
|||
else super.preferredStatusBarStyle |
|||
*/ |
|||
@property (assign, nonatomic) IBInspectable UIStatusBarStyle rootViewStatusBarStyle; |
|||
/** |
|||
Default: |
|||
if (view controller-based status bar appearance == NO) then UIApplication.sharedApplication.statusBarStyle |
|||
else if (leftViewController != nil) then leftViewController.preferredStatusBarStyle |
|||
else if (rootViewController != nil) then rootViewController.preferredStatusBarStyle |
|||
else super.preferredStatusBarStyle |
|||
*/ |
|||
@property (assign, nonatomic) IBInspectable UIStatusBarStyle leftViewStatusBarStyle; |
|||
/** |
|||
Default: |
|||
if (view controller-based status bar appearance == NO) then UIApplication.sharedApplication.statusBarStyle |
|||
else if (rightViewController != nil) then rightViewController.preferredStatusBarStyle |
|||
else if (rootViewController != nil) then rootViewController.preferredStatusBarStyle |
|||
else super.preferredStatusBarStyle |
|||
*/ |
|||
@property (assign, nonatomic) IBInspectable UIStatusBarStyle rightViewStatusBarStyle; |
|||
|
|||
/** |
|||
Default: |
|||
if (rootViewController != nil) then rootViewController.preferredStatusBarUpdateAnimation |
|||
else super.preferredStatusBarUpdateAnimation |
|||
*/ |
|||
@property (assign, nonatomic) IBInspectable UIStatusBarAnimation rootViewStatusBarUpdateAnimation; |
|||
/** |
|||
Default: |
|||
if (leftViewController != nil) then leftViewController.preferredStatusBarUpdateAnimation |
|||
else if (rootViewController != nil) then rootViewController.preferredStatusBarUpdateAnimation |
|||
else super.preferredStatusBarUpdateAnimation |
|||
*/ |
|||
@property (assign, nonatomic) IBInspectable UIStatusBarAnimation leftViewStatusBarUpdateAnimation; |
|||
/** |
|||
Default: |
|||
if (rightViewController != nil) then rightViewController.preferredStatusBarUpdateAnimation |
|||
else if (rootViewController != nil) then rootViewController.preferredStatusBarUpdateAnimation |
|||
else super.preferredStatusBarUpdateAnimation |
|||
*/ |
|||
@property (assign, nonatomic) IBInspectable UIStatusBarAnimation rightViewStatusBarUpdateAnimation; |
|||
|
|||
/** |
|||
Color that hides root view, when left view is showing |
|||
Default: |
|||
if (presentationStyle == LGSideMenuPresentationStyleSlideAbove) then [UIColor colorWithWhite:0.0 alpha:0.5] |
|||
else nil |
|||
*/ |
|||
@property (strong, nonatomic, nullable) IBInspectable UIColor *rootViewCoverColorForLeftView; |
|||
/** |
|||
Color that hides root view, when right view is showing |
|||
Default: |
|||
if (presentationStyle == LGSideMenuPresentationStyleSlideAbove) then [UIColor colorWithWhite:0.0 alpha:0.5] |
|||
else nil |
|||
*/ |
|||
@property (strong, nonatomic, nullable) IBInspectable UIColor *rootViewCoverColorForRightView; |
|||
/** |
|||
Color that hides left view, when it is not showing |
|||
Only if (presentationStyle != LGSideMenuPresentationStyleSlideAbove) |
|||
Default is [UIColor colorWithWhite:0.0 alpha:0.5] |
|||
*/ |
|||
@property (strong, nonatomic, nullable) IBInspectable UIColor *leftViewCoverColor; |
|||
/** |
|||
Color that hides right view, when it is not showing |
|||
Only if (presentationStyle != LGSideMenuPresentationStyleSlideAbove) |
|||
Default is [UIColor colorWithWhite:0.0 alpha:0.5] |
|||
*/ |
|||
@property (strong, nonatomic, nullable) IBInspectable UIColor *rightViewCoverColor; |
|||
|
|||
/** |
|||
Only if (presentationStyle != LGSideMenuPresentationStyleSlideAbove) |
|||
Default: |
|||
if (presentationStyle == LGSideMenuPresentationStyleSlideBelow) then 1.0 |
|||
else 0.8 |
|||
*/ |
|||
@property (assign, nonatomic) IBInspectable CGFloat rootViewScaleForLeftView; |
|||
/** |
|||
Only if (presentationStyle != LGSideMenuPresentationStyleSlideAbove) |
|||
Default: |
|||
if (presentationStyle == LGSideMenuPresentationStyleSlideBelow) then 1.0 |
|||
else 0.8 |
|||
*/ |
|||
@property (assign, nonatomic) IBInspectable CGFloat rootViewScaleForRightView; |
|||
|
|||
/** |
|||
Only if (presentationStyle != LGSideMenuPresentationStyleSlideAbove) |
|||
Default: |
|||
if (presentationStyle == LGSideMenuPresentationStyleSlideBelow) then 1.0 |
|||
else if (presentationStyle == LGSideMenuPresentationStyleScaleFromBig) then 1.2 |
|||
else if (presentationStyle == LGSideMenuPresentationStyleScaleFromLittle) then 0.8 |
|||
*/ |
|||
@property (assign, nonatomic) IBInspectable CGFloat leftViewInitialScale; |
|||
/** |
|||
Only if (presentationStyle != LGSideMenuPresentationStyleSlideAbove) |
|||
Default: |
|||
if (presentationStyle == LGSideMenuPresentationStyleSlideBelow) then 1.0 |
|||
else if (presentationStyle == LGSideMenuPresentationStyleScaleFromBig) then 1.2 |
|||
else if (presentationStyle == LGSideMenuPresentationStyleScaleFromLittle) then 0.8 |
|||
*/ |
|||
@property (assign, nonatomic) IBInspectable CGFloat rightViewInitialScale; |
|||
|
|||
/** |
|||
Only if (presentationStyle != LGSideMenuPresentationStyleSlideAbove) |
|||
Default: |
|||
if (presentationStyle == LGSideMenuPresentationStyleSlideBelow) then -width/2 |
|||
else 0.0 |
|||
*/ |
|||
@property (assign, nonatomic) IBInspectable CGFloat leftViewInitialOffsetX; |
|||
/** |
|||
Only if (presentationStyle != LGSideMenuPresentationStyleSlideAbove) |
|||
Default: |
|||
if (presentationStyle == LGSideMenuPresentationStyleSlideBelow) then -width/2 |
|||
else 0.0 |
|||
*/ |
|||
@property (assign, nonatomic) IBInspectable CGFloat rightViewInitialOffsetX; |
|||
|
|||
/** |
|||
Only if (presentationStyle != LGSideMenuPresentationStyleSlideAbove) |
|||
Default: |
|||
if (presentationStyle == LGSideMenuPresentationStyleScaleFromBig) then 1.4 |
|||
else 1.0 |
|||
*/ |
|||
@property (assign, nonatomic) IBInspectable CGFloat leftViewBackgroundImageInitialScale; |
|||
/** |
|||
Only if (presentationStyle != LGSideMenuPresentationStyleSlideAbove) |
|||
Default: |
|||
if (presentationStyle == LGSideMenuPresentationStyleScaleFromBig) then 1.4 |
|||
else 1.0 |
|||
*/ |
|||
@property (assign, nonatomic) IBInspectable CGFloat rightViewBackgroundImageInitialScale; |
|||
|
|||
/** |
|||
Only if (presentationStyle != LGSideMenuPresentationStyleSlideAbove) |
|||
Default: |
|||
if (presentationStyle == LGSideMenuPresentationStyleScaleFromLittle) then 1.4 |
|||
else 1.0 |
|||
*/ |
|||
@property (assign, nonatomic) IBInspectable CGFloat leftViewBackgroundImageFinalScale; |
|||
/** |
|||
Only if (presentationStyle != LGSideMenuPresentationStyleSlideAbove) |
|||
Default: |
|||
if (presentationStyle == LGSideMenuPresentationStyleScaleFromLittle) then 1.4 |
|||
else 1.0 |
|||
*/ |
|||
@property (assign, nonatomic) IBInspectable CGFloat rightViewBackgroundImageFinalScale; |
|||
|
|||
#pragma mark - Only getters |
|||
|
|||
/** Is left view fully opened */ |
|||
@property (assign, nonatomic, readonly, getter=isLeftViewShowing) BOOL leftViewShowing; |
|||
/** Is right view fully opened */ |
|||
@property (assign, nonatomic, readonly, getter=isRightViewShowing) BOOL rightViewShowing; |
|||
|
|||
/** Is left view fully closed */ |
|||
@property (assign, nonatomic, readonly, getter=isLeftViewHidden) BOOL leftViewHidden; |
|||
/** Is right view fully closed */ |
|||
@property (assign, nonatomic, readonly, getter=isRightViewHidden) BOOL rightViewHidden; |
|||
|
|||
/** Is left view showing or going to show or going to hide right now */ |
|||
@property (assign, nonatomic, readonly, getter=isLeftViewVisible) BOOL leftViewVisible; |
|||
/** Is right view showing or going to show or going to hide right now */ |
|||
@property (assign, nonatomic, readonly, getter=isRightViewVisible) BOOL rightViewVisible; |
|||
|
|||
/** Is left view has property "always visible" for current orientation */ |
|||
@property (assign, nonatomic, readonly, getter=isLeftViewAlwaysVisibleForCurrentOrientation) BOOL leftViewAlwaysVisibleForCurrentOrientation; |
|||
/** Is right view has property "always visible" for current orientation */ |
|||
@property (assign, nonatomic, readonly, getter=isRightViewAlwaysVisibleForCurrentOrientation) BOOL rightViewAlwaysVisibleForCurrentOrientation; |
|||
|
|||
#pragma mark - Callbacks |
|||
|
|||
/** To avoid retain cycle, do not forget about weak reference to self */ |
|||
@property (copy, nonatomic, nullable) LGSideMenuHandler willShowLeftView; |
|||
/** To avoid retain cycle, do not forget about weak reference to self */ |
|||
@property (copy, nonatomic, nullable) LGSideMenuHandler didShowLeftView; |
|||
|
|||
/** To avoid retain cycle, do not forget about weak reference to self */ |
|||
@property (copy, nonatomic, nullable) LGSideMenuHandler willHideLeftView; |
|||
/** To avoid retain cycle, do not forget about weak reference to self */ |
|||
@property (copy, nonatomic, nullable) LGSideMenuHandler didHideLeftView; |
|||
|
|||
/** To avoid retain cycle, do not forget about weak reference to self */ |
|||
@property (copy, nonatomic, nullable) LGSideMenuHandler willShowRightView; |
|||
/** To avoid retain cycle, do not forget about weak reference to self */ |
|||
@property (copy, nonatomic, nullable) LGSideMenuHandler didShowRightView; |
|||
|
|||
/** To avoid retain cycle, do not forget about weak reference to self */ |
|||
@property (copy, nonatomic, nullable) LGSideMenuHandler willHideRightView; |
|||
/** To avoid retain cycle, do not forget about weak reference to self */ |
|||
@property (copy, nonatomic, nullable) LGSideMenuHandler didHideRightView; |
|||
|
|||
/** |
|||
You can use this block to add some custom animations |
|||
To avoid retain cycle, do not forget about weak reference to self |
|||
*/ |
|||
@property (copy, nonatomic, nullable) LGSideMenuAnimationsBlock showLeftViewAnimations; |
|||
/** |
|||
You can use this block to add some custom animations |
|||
To avoid retain cycle, do not forget about weak reference to self |
|||
*/ |
|||
@property (copy, nonatomic, nullable) LGSideMenuAnimationsBlock hideLeftViewAnimations; |
|||
|
|||
/** |
|||
You can use this block to add some custom animations |
|||
To avoid retain cycle, do not forget about weak reference to self |
|||
*/ |
|||
@property (copy, nonatomic, nullable) LGSideMenuAnimationsBlock showRightViewAnimations; |
|||
/** |
|||
You can use this block to add some custom animations |
|||
To avoid retain cycle, do not forget about weak reference to self |
|||
*/ |
|||
@property (copy, nonatomic, nullable) LGSideMenuAnimationsBlock hideRightViewAnimations; |
|||
|
|||
#pragma mark - Delegate |
|||
|
|||
@property (weak, nonatomic, nullable) id <LGSideMenuDelegate> delegate; |
|||
|
|||
#pragma mark - Initialization |
|||
|
|||
- (nonnull instancetype)initWithRootViewController:(nullable UIViewController *)rootViewController; |
|||
|
|||
+ (nonnull instancetype)sideMenuControllerWithRootViewController:(nullable UIViewController *)rootViewController; |
|||
|
|||
- (nonnull instancetype)initWithRootViewController:(nullable UIViewController *)rootViewController |
|||
leftViewController:(nullable UIViewController *)leftViewController |
|||
rightViewController:(nullable UIViewController *)rightViewController; |
|||
|
|||
+ (nonnull instancetype)sideMenuControllerWithRootViewController:(nullable UIViewController *)rootViewController |
|||
leftViewController:(nullable UIViewController *)leftViewController |
|||
rightViewController:(nullable UIViewController *)rightViewController; |
|||
|
|||
- (nonnull instancetype)initWithRootView:(nullable UIView *)rootView; |
|||
|
|||
+ (nonnull instancetype)sideMenuControllerWithRootView:(nullable UIView *)rootView; |
|||
|
|||
- (nonnull instancetype)initWithRootView:(nullable UIView *)rootView |
|||
leftView:(nullable UIView *)leftView |
|||
rightView:(nullable UIView *)rightView; |
|||
|
|||
+ (nonnull instancetype)sideMenuControllerWithRootView:(nullable UIView *)rootView |
|||
leftView:(nullable UIView *)leftView |
|||
rightView:(nullable UIView *)rightView; |
|||
|
|||
#pragma mark - |
|||
|
|||
- (void)rootViewWillLayoutSubviewsWithSize:(CGSize)size; |
|||
- (void)leftViewWillLayoutSubviewsWithSize:(CGSize)size; |
|||
- (void)rightViewWillLayoutSubviewsWithSize:(CGSize)size; |
|||
|
|||
- (BOOL)isLeftViewAlwaysVisibleForOrientation:(UIInterfaceOrientation)orientation; |
|||
- (BOOL)isRightViewAlwaysVisibleForOrientation:(UIInterfaceOrientation)orientation; |
|||
|
|||
#pragma mark - Left view actions |
|||
|
|||
- (void)showLeftView; |
|||
- (void)hideLeftView; |
|||
- (void)toggleLeftView; |
|||
|
|||
- (IBAction)showLeftView:(nullable id)sender; |
|||
- (IBAction)hideLeftView:(nullable id)sender; |
|||
- (IBAction)toggleLeftView:(nullable id)sender; |
|||
|
|||
- (void)showLeftViewAnimated; |
|||
- (void)hideLeftViewAnimated; |
|||
- (void)toggleLeftViewAnimated; |
|||
|
|||
- (IBAction)showLeftViewAnimated:(nullable id)sender; |
|||
- (IBAction)hideLeftViewAnimated:(nullable id)sender; |
|||
- (IBAction)toggleLeftViewAnimated:(nullable id)sender; |
|||
|
|||
- (void)showLeftViewAnimated:(BOOL)animated completionHandler:(LGSideMenuCompletionHandler)completionHandler; |
|||
- (void)hideLeftViewAnimated:(BOOL)animated completionHandler:(LGSideMenuCompletionHandler)completionHandler; |
|||
- (void)toggleLeftViewAnimated:(BOOL)animated completionHandler:(LGSideMenuCompletionHandler)completionHandler; |
|||
|
|||
/** |
|||
Rarely you can get some visual bugs when you change view hierarchy and toggle side views in the same iteration |
|||
You can use delay to avoid this and probably other unexpected visual bugs |
|||
*/ |
|||
- (void)showLeftViewAnimated:(BOOL)animated delay:(NSTimeInterval)delay completionHandler:(LGSideMenuCompletionHandler)completionHandler; |
|||
|
|||
/** |
|||
Rarely you can get some visual bugs when you change view hierarchy and toggle side views in the same iteration |
|||
You can use delay to avoid this and probably other unexpected visual bugs |
|||
*/ |
|||
- (void)hideLeftViewAnimated:(BOOL)animated delay:(NSTimeInterval)delay completionHandler:(LGSideMenuCompletionHandler)completionHandler; |
|||
|
|||
/** |
|||
Rarely you can get some visual bugs when you change view hierarchy and toggle side views in the same iteration |
|||
You can use delay to avoid this and probably other unexpected visual bugs |
|||
*/ |
|||
- (void)toggleLeftViewAnimated:(BOOL)animated delay:(NSTimeInterval)delay completionHandler:(LGSideMenuCompletionHandler)completionHandler; |
|||
|
|||
#pragma mark - Right view actions |
|||
|
|||
- (void)showRightView; |
|||
- (void)hideRightView; |
|||
- (void)toggleRightView; |
|||
|
|||
- (IBAction)showRightView:(nullable id)sender; |
|||
- (IBAction)hideRightView:(nullable id)sender; |
|||
- (IBAction)toggleRightView:(nullable id)sender; |
|||
|
|||
- (void)showRightViewAnimated; |
|||
- (void)hideRightViewAnimated; |
|||
- (void)toggleRightViewAnimated; |
|||
|
|||
- (IBAction)showRightViewAnimated:(nullable id)sender; |
|||
- (IBAction)hideRightViewAnimated:(nullable id)sender; |
|||
- (IBAction)toggleRightViewAnimated:(nullable id)sender; |
|||
|
|||
- (void)showRightViewAnimated:(BOOL)animated completionHandler:(LGSideMenuCompletionHandler)completionHandler; |
|||
- (void)hideRightViewAnimated:(BOOL)animated completionHandler:(LGSideMenuCompletionHandler)completionHandler; |
|||
- (void)toggleRightViewAnimated:(BOOL)animated completionHandler:(LGSideMenuCompletionHandler)completionHandler; |
|||
|
|||
/** |
|||
Rarely you can get some visual bugs when you change view hierarchy and toggle side views in the same iteration |
|||
You can use delay to avoid this and probably other unexpected visual bugs |
|||
*/ |
|||
- (void)showRightViewAnimated:(BOOL)animated delay:(NSTimeInterval)delay completionHandler:(LGSideMenuCompletionHandler)completionHandler; |
|||
|
|||
/** |
|||
Rarely you can get some visual bugs when you change view hierarchy and toggle side views in the same iteration |
|||
You can use delay to avoid this and probably other unexpected visual bugs |
|||
*/ |
|||
- (void)hideRightViewAnimated:(BOOL)animated delay:(NSTimeInterval)delay completionHandler:(LGSideMenuCompletionHandler)completionHandler; |
|||
|
|||
/** |
|||
Rarely you can get some visual bugs when you change view hierarchy and toggle side views in the same iteration |
|||
You can use delay to avoid this and probably other unexpected visual bugs |
|||
*/ |
|||
- (void)toggleRightViewAnimated:(BOOL)animated delay:(NSTimeInterval)delay completionHandler:(LGSideMenuCompletionHandler)completionHandler; |
|||
|
|||
#pragma mark - |
|||
|
|||
/** Force update layouts and styles for all views */ |
|||
- (void)updateLayoutsAndStyles; |
|||
|
|||
#pragma mark - Unavailable methods |
|||
|
|||
/** Unavailable, select it on your rootViewController OR use rootViewShouldAutorotate */ |
|||
- (BOOL)shouldAutorotate __attribute__((unavailable("select it on your rootViewController OR use rootViewShouldAutorotate"))); |
|||
/** Unavailable, select it on your rootViewController, leftViewController, rightViewController OR use rootViewStatusBarHidden, leftViewStatusBarHidden, rightViewStatusBarHidden */ |
|||
- (BOOL)prefersStatusBarHidden __attribute__((unavailable("select it on your rootViewController, leftViewController, rightViewController OR use rootViewStatusBarHidden, leftViewStatusBarHidden, rightViewStatusBarHidden"))); |
|||
/** Unavailable, select it on your rootViewController, leftViewController, rightViewController OR use rootViewStatusBarStyle, leftViewStatusBarStyle, rightViewStatusBarStyle */ |
|||
- (UIStatusBarStyle)preferredStatusBarStyle __attribute__((unavailable("select it on your rootViewController, leftViewController, rightViewController OR use rootViewStatusBarStyle, leftViewStatusBarStyle, rightViewStatusBarStyle"))); |
|||
/** Unavailable, select it on your rootViewController, leftViewController, rightViewController OR use rootViewStatusBarUpdateAnimation, leftViewStatusBarUpdateAnimation, rightViewStatusBarUpdateAnimation */ |
|||
- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation __attribute__((unavailable("select it on your rootViewController, leftViewController, rightViewController OR use rootViewStatusBarUpdateAnimation, leftViewStatusBarUpdateAnimation, rightViewStatusBarUpdateAnimation"))); |
|||
|
|||
@end |
|||
|
|||
#pragma mark - Delegate |
|||
|
|||
@protocol LGSideMenuDelegate <NSObject> |
|||
|
|||
@optional |
|||
|
|||
- (void)willShowLeftView:(nonnull UIView *)leftView sideMenuController:(nonnull LGSideMenuController *)sideMenuController; |
|||
- (void)didShowLeftView:(nonnull UIView *)leftView sideMenuController:(nonnull LGSideMenuController *)sideMenuController; |
|||
|
|||
- (void)willHideLeftView:(nonnull UIView *)leftView sideMenuController:(nonnull LGSideMenuController *)sideMenuController; |
|||
- (void)didHideLeftView:(nonnull UIView *)leftView sideMenuController:(nonnull LGSideMenuController *)sideMenuController; |
|||
|
|||
- (void)willShowRightView:(nonnull UIView *)rightView sideMenuController:(nonnull LGSideMenuController *)sideMenuController; |
|||
- (void)didShowRightView:(nonnull UIView *)rightView sideMenuController:(nonnull LGSideMenuController *)sideMenuController; |
|||
|
|||
- (void)willHideRightView:(nonnull UIView *)rightView sideMenuController:(nonnull LGSideMenuController *)sideMenuController; |
|||
- (void)didHideRightView:(nonnull UIView *)rightView sideMenuController:(nonnull LGSideMenuController *)sideMenuController; |
|||
|
|||
/** You can use this method to add some custom animations */ |
|||
- (void)showAnimationsForLeftView:(nonnull UIView *)leftView sideMenuController:(nonnull LGSideMenuController *)sideMenuController duration:(NSTimeInterval)duration; |
|||
/** You can use this method to add some custom animations */ |
|||
- (void)hideAnimationsForLeftView:(nonnull UIView *)leftView sideMenuController:(nonnull LGSideMenuController *)sideMenuController duration:(NSTimeInterval)duration; |
|||
|
|||
/** You can use this method to add some custom animations */ |
|||
- (void)showAnimationsForRightView:(nonnull UIView *)rightView sideMenuController:(nonnull LGSideMenuController *)sideMenuController duration:(NSTimeInterval)duration; |
|||
/** You can use this method to add some custom animations */ |
|||
- (void)hideAnimationsForRightView:(nonnull UIView *)rightView sideMenuController:(nonnull LGSideMenuController *)sideMenuController duration:(NSTimeInterval)duration; |
|||
|
|||
// DEPRECATED |
|||
|
|||
/** You can use this method to add some custom animations */ |
|||
- (void)showAnimationsBlockForLeftView:(nonnull UIView *)leftView sideMenuController:(nonnull LGSideMenuController *)sideMenuController duration:(NSTimeInterval)duration |
|||
DEPRECATED_MSG_ATTRIBUTE("use showAnimationsForRightView:sideMenuController:duration: instead"); |
|||
/** You can use this method to add some custom animations */ |
|||
- (void)hideAnimationsBlockForLeftView:(nonnull UIView *)leftView sideMenuController:(nonnull LGSideMenuController *)sideMenuController duration:(NSTimeInterval)duration |
|||
DEPRECATED_MSG_ATTRIBUTE("use hideAnimationsForLeftView:sideMenuController:duration: instead"); |
|||
|
|||
/** You can use this method to add some custom animations */ |
|||
- (void)showAnimationsBlockForRightView:(nonnull UIView *)rightView sideMenuController:(nonnull LGSideMenuController *)sideMenuController duration:(NSTimeInterval)duration |
|||
DEPRECATED_MSG_ATTRIBUTE("use showAnimationsForRightView:sideMenuController:duration: instead"); |
|||
/** You can use this method to add some custom animations */ |
|||
- (void)hideAnimationsBlockForRightView:(nonnull UIView *)rightView sideMenuController:(nonnull LGSideMenuController *)sideMenuController duration:(NSTimeInterval)duration |
|||
DEPRECATED_MSG_ATTRIBUTE("use hideAnimationsForRightView:sideMenuController:duration: instead"); |
|||
|
|||
@end |
|||
|
|||
#pragma mark - Deprecated |
|||
|
|||
extern NSString * _Nonnull const LGSideMenuControllerWillDismissLeftViewNotification |
|||
DEPRECATED_MSG_ATTRIBUTE("use LGSideMenuWillHideLeftViewNotification instead"); |
|||
extern NSString * _Nonnull const LGSideMenuControllerDidDismissLeftViewNotification |
|||
DEPRECATED_MSG_ATTRIBUTE("use LGSideMenuDidHideLeftViewNotification instead"); |
|||
extern NSString * _Nonnull const LGSideMenuControllerWillDismissRightViewNotification |
|||
DEPRECATED_MSG_ATTRIBUTE("use LGSideMenuWillHideRightViewNotification instead"); |
|||
extern NSString * _Nonnull const LGSideMenuControllerDidDismissRightViewNotification |
|||
DEPRECATED_MSG_ATTRIBUTE("use LGSideMenuDidHideRightViewNotification instead"); |
|||
|
|||
extern NSString * _Nonnull const kLGSideMenuControllerWillShowLeftViewNotification |
|||
DEPRECATED_MSG_ATTRIBUTE("use LGSideMenuWillShowLeftViewNotification instead"); |
|||
extern NSString * _Nonnull const kLGSideMenuControllerWillHideLeftViewNotification |
|||
DEPRECATED_MSG_ATTRIBUTE("use LGSideMenuWillHideLeftViewNotification instead"); |
|||
extern NSString * _Nonnull const kLGSideMenuControllerDidShowLeftViewNotification |
|||
DEPRECATED_MSG_ATTRIBUTE("use LGSideMenuDidShowLeftViewNotification instead"); |
|||
extern NSString * _Nonnull const kLGSideMenuControllerDidHideLeftViewNotification |
|||
DEPRECATED_MSG_ATTRIBUTE("use LGSideMenuDidHideLeftViewNotification instead"); |
|||
|
|||
extern NSString * _Nonnull const kLGSideMenuControllerWillShowRightViewNotification |
|||
DEPRECATED_MSG_ATTRIBUTE("use LGSideMenuWillShowRightViewNotification instead"); |
|||
extern NSString * _Nonnull const kLGSideMenuControllerWillHideRightViewNotification |
|||
DEPRECATED_MSG_ATTRIBUTE("use LGSideMenuWillHideRightViewNotification instead"); |
|||
extern NSString * _Nonnull const kLGSideMenuControllerDidShowRightViewNotification |
|||
DEPRECATED_MSG_ATTRIBUTE("use LGSideMenuDidShowRightViewNotification instead"); |
|||
extern NSString * _Nonnull const kLGSideMenuControllerDidHideRightViewNotification |
|||
DEPRECATED_MSG_ATTRIBUTE("use LGSideMenuDidHideRightViewNotification instead"); |
|||
|
|||
extern NSString * _Nonnull const LGSideMenuControllerWillShowLeftViewNotification |
|||
DEPRECATED_MSG_ATTRIBUTE("use LGSideMenuWillShowLeftViewNotification instead"); |
|||
extern NSString * _Nonnull const LGSideMenuControllerDidShowLeftViewNotification |
|||
DEPRECATED_MSG_ATTRIBUTE("use LGSideMenuDidShowLeftViewNotification instead"); |
|||
|
|||
extern NSString * _Nonnull const LGSideMenuControllerWillHideLeftViewNotification |
|||
DEPRECATED_MSG_ATTRIBUTE("use LGSideMenuWillHideLeftViewNotification instead"); |
|||
extern NSString * _Nonnull const LGSideMenuControllerDidHideLeftViewNotification |
|||
DEPRECATED_MSG_ATTRIBUTE("use LGSideMenuDidHideLeftViewNotification instead"); |
|||
|
|||
extern NSString * _Nonnull const LGSideMenuControllerWillShowRightViewNotification |
|||
DEPRECATED_MSG_ATTRIBUTE("use LGSideMenuWillShowRightViewNotification instead"); |
|||
extern NSString * _Nonnull const LGSideMenuControllerDidShowRightViewNotification |
|||
DEPRECATED_MSG_ATTRIBUTE("use LGSideMenuDidShowRightViewNotification instead"); |
|||
|
|||
extern NSString * _Nonnull const LGSideMenuControllerWillHideRightViewNotification |
|||
DEPRECATED_MSG_ATTRIBUTE("use LGSideMenuWillHideRightViewNotification instead"); |
|||
extern NSString * _Nonnull const LGSideMenuControllerDidHideRightViewNotification |
|||
DEPRECATED_MSG_ATTRIBUTE("use LGSideMenuDidHideRightViewNotification instead"); |
|||
|
|||
@interface LGSideMenuController (Deprecated) |
|||
|
|||
@property (assign, nonatomic, getter=isShouldShowLeftView) IBInspectable BOOL shouldShowLeftView |
|||
DEPRECATED_MSG_ATTRIBUTE("use leftViewEnabled instead"); |
|||
@property (assign, nonatomic, getter=isShouldShowRightView) IBInspectable BOOL shouldShowRightView |
|||
DEPRECATED_MSG_ATTRIBUTE("use rightViewEnabled instead"); |
|||
|
|||
@property (assign, nonatomic, readonly, getter=isLeftViewAlwaysVisible) BOOL leftViewAlwaysVisible |
|||
DEPRECATED_MSG_ATTRIBUTE("use leftViewAlwaysVisibleForCurrentOrientation instead"); |
|||
@property (assign, nonatomic, readonly, getter=isRightViewAlwaysVisible) BOOL rightViewAlwaysVisible |
|||
DEPRECATED_MSG_ATTRIBUTE("use rightViewAlwaysVisibleForCurrentOrientation instead"); |
|||
|
|||
@property (assign, nonatomic) IBInspectable NSTimeInterval leftViewAnimationSpeed |
|||
DEPRECATED_MSG_ATTRIBUTE("use leftViewAnimationDuration instead"); |
|||
@property (assign, nonatomic) IBInspectable NSTimeInterval rightViewAnimationSpeed |
|||
DEPRECATED_MSG_ATTRIBUTE("use rightViewAnimationDuration instead"); |
|||
|
|||
@property (copy, nonatomic, nullable) LGSideMenuAnimationsBlock showLeftViewAnimationsBlock |
|||
DEPRECATED_MSG_ATTRIBUTE("use showLeftViewAnimations instead"); |
|||
@property (copy, nonatomic, nullable) LGSideMenuAnimationsBlock hideLeftViewAnimationsBlock |
|||
DEPRECATED_MSG_ATTRIBUTE("use hideLeftViewAnimations instead"); |
|||
|
|||
@property (copy, nonatomic, nullable) LGSideMenuAnimationsBlock showRightViewAnimationsBlock |
|||
DEPRECATED_MSG_ATTRIBUTE("use showRightViewAnimations instead"); |
|||
@property (copy, nonatomic, nullable) LGSideMenuAnimationsBlock hideRightViewAnimationsBlock |
|||
DEPRECATED_MSG_ATTRIBUTE("use hideRightViewAnimations instead"); |
|||
|
|||
- (void)showHideLeftViewAnimated:(BOOL)animated completionHandler:(LGSideMenuCompletionHandler)completionHandler |
|||
DEPRECATED_MSG_ATTRIBUTE("use toggleLeftViewAnimated:completionHandler instead"); |
|||
- (void)showHideRightViewAnimated:(BOOL)animated completionHandler:(LGSideMenuCompletionHandler)completionHandler |
|||
DEPRECATED_MSG_ATTRIBUTE("use toggleRightViewAnimated:completionHandler instead"); |
|||
|
|||
- (BOOL)isLeftViewAlwaysVisibleForInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation |
|||
DEPRECATED_MSG_ATTRIBUTE("use isLeftViewAlwaysVisibleForOrientation instead"); |
|||
- (BOOL)isRightViewAlwaysVisibleForInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation |
|||
DEPRECATED_MSG_ATTRIBUTE("use isRightViewAlwaysVisibleForOrientation instead"); |
|||
|
|||
- (void)setLeftViewEnabledWithWidth:(CGFloat)width |
|||
presentationStyle:(LGSideMenuPresentationStyle)presentationStyle |
|||
alwaysVisibleOptions:(LGSideMenuAlwaysVisibleOptions)alwaysVisibleOptions DEPRECATED_ATTRIBUTE; |
|||
|
|||
- (void)setRightViewEnabledWithWidth:(CGFloat)width |
|||
presentationStyle:(LGSideMenuPresentationStyle)presentationStyle |
|||
alwaysVisibleOptions:(LGSideMenuAlwaysVisibleOptions)alwaysVisibleOptions DEPRECATED_ATTRIBUTE; |
|||
|
|||
@end |
3317
Pods/LGSideMenuController/LGSideMenuController/LGSideMenuController.m
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,47 @@ |
|||
// |
|||
// LGSideMenuGesturesHandler.h |
|||
// LGSideMenuController |
|||
// |
|||
// |
|||
// The MIT License (MIT) |
|||
// |
|||
// Copyright © 2015 Grigory Lutkov <Friend.LGA@gmail.com> |
|||
// (https://github.com/Friend-LGA/LGSideMenuController) |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// |
|||
// The above copyright notice and this permission notice shall be included in all |
|||
// copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|||
// SOFTWARE. |
|||
// |
|||
|
|||
#import <UIKit/UIKit.h> |
|||
#import "LGSideMenuController.h" |
|||
|
|||
@interface LGSideMenuGesturesHandler : NSObject <UIGestureRecognizerDelegate> |
|||
|
|||
@property (assign, nonatomic, nonnull) LGSideMenuController *sideMenuController; |
|||
|
|||
@property (weak, nonatomic, nullable) UIView *rootViewContainer; |
|||
@property (weak, nonatomic, nullable) UIView *leftViewContainer; |
|||
@property (weak, nonatomic, nullable) UIView *rightViewContainer; |
|||
|
|||
@property (weak, nonatomic, nullable) UIView *rootViewCoverView; |
|||
|
|||
@property (assign, nonatomic, getter=isAnimating) BOOL animating; |
|||
|
|||
- (nonnull instancetype)initWithSideMenuController:(nonnull LGSideMenuController *)sideMenuController; |
|||
|
|||
@end |
@ -0,0 +1,106 @@ |
|||
// |
|||
// LGSideMenuGesturesHandler.m |
|||
// LGSideMenuController |
|||
// |
|||
// |
|||
// The MIT License (MIT) |
|||
// |
|||
// Copyright © 2015 Grigory Lutkov <Friend.LGA@gmail.com> |
|||
// (https://github.com/Friend-LGA/LGSideMenuController) |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// |
|||
// The above copyright notice and this permission notice shall be included in all |
|||
// copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|||
// SOFTWARE. |
|||
// |
|||
|
|||
#import "LGSideMenuGesturesHandler.h" |
|||
|
|||
@implementation LGSideMenuGesturesHandler |
|||
|
|||
- (nonnull instancetype)initWithSideMenuController:(nonnull LGSideMenuController *)sideMenuController { |
|||
self = [super init]; |
|||
if (self) { |
|||
self.sideMenuController = sideMenuController; |
|||
} |
|||
return self; |
|||
} |
|||
|
|||
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { |
|||
if (self.isAnimating) return NO; |
|||
|
|||
if (![gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) { |
|||
if (!self.rootViewCoverView) return NO; |
|||
|
|||
return [touch.view isDescendantOfView:self.rootViewCoverView]; |
|||
} |
|||
|
|||
if (!self.sideMenuController.rootView) return NO; |
|||
|
|||
if (self.sideMenuController.swipeGestureArea == LGSideMenuSwipeGestureAreaFull && |
|||
((self.sideMenuController.leftView && self.sideMenuController.isLeftViewSwipeGestureEnabled) || |
|||
(self.sideMenuController.rightView && self.sideMenuController.isRightViewSwipeGestureEnabled))) { |
|||
return YES; |
|||
} |
|||
|
|||
// ----- |
|||
|
|||
CGPoint location = [touch locationInView:self.sideMenuController.view]; |
|||
CGRect leftAvailableRect = CGRectNull; |
|||
CGRect rightAvailableRect = CGRectNull; |
|||
|
|||
if (self.sideMenuController.leftView && self.sideMenuController.isLeftViewSwipeGestureEnabled) { |
|||
if (self.sideMenuController.isLeftViewVisible) { |
|||
leftAvailableRect = CGRectMake(CGRectGetWidth(self.leftViewContainer.frame) - self.sideMenuController.leftViewSwipeGestureRange.left, |
|||
CGRectGetMinY(self.rootViewContainer.frame), |
|||
CGRectGetWidth(self.sideMenuController.view.frame), |
|||
CGRectGetHeight(self.rootViewContainer.frame)); |
|||
} |
|||
else { |
|||
leftAvailableRect = CGRectMake(-self.sideMenuController.leftViewSwipeGestureRange.left, |
|||
CGRectGetMinY(self.rootViewContainer.frame), |
|||
self.sideMenuController.leftViewSwipeGestureRange.left + self.sideMenuController.leftViewSwipeGestureRange.right, |
|||
CGRectGetHeight(self.rootViewContainer.frame)); |
|||
} |
|||
|
|||
if (CGRectContainsPoint(leftAvailableRect, location)) { |
|||
return YES; |
|||
} |
|||
} |
|||
|
|||
if (self.sideMenuController.rightView && self.sideMenuController.isRightViewSwipeGestureEnabled) { |
|||
if (self.sideMenuController.isRightViewVisible) { |
|||
rightAvailableRect = CGRectMake(CGRectGetWidth(self.sideMenuController.view.frame) - CGRectGetWidth(self.rightViewContainer.frame) + self.sideMenuController.rightViewSwipeGestureRange.left, |
|||
CGRectGetMinY(self.rootViewContainer.frame), |
|||
-CGRectGetWidth(self.sideMenuController.view.frame), |
|||
CGRectGetHeight(self.rootViewContainer.frame)); |
|||
} |
|||
else { |
|||
rightAvailableRect = CGRectMake(CGRectGetWidth(self.rootViewContainer.frame) - self.sideMenuController.rightViewSwipeGestureRange.left, |
|||
CGRectGetMinY(self.rootViewContainer.frame), |
|||
self.sideMenuController.rightViewSwipeGestureRange.left + self.sideMenuController.rightViewSwipeGestureRange.right, |
|||
CGRectGetHeight(self.rootViewContainer.frame)); |
|||
} |
|||
|
|||
if (CGRectContainsPoint(rightAvailableRect, location)) { |
|||
return YES; |
|||
} |
|||
} |
|||
|
|||
return NO; |
|||
} |
|||
|
|||
@end |
@ -0,0 +1,55 @@ |
|||
// |
|||
// LGSideMenuHelper.h |
|||
// LGSideMenuController |
|||
// |
|||
// |
|||
// The MIT License (MIT) |
|||
// |
|||
// Copyright © 2015 Grigory Lutkov <Friend.LGA@gmail.com> |
|||
// (https://github.com/Friend-LGA/LGSideMenuController) |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// |
|||
// The above copyright notice and this permission notice shall be included in all |
|||
// copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|||
// SOFTWARE. |
|||
// |
|||
|
|||
#import <UIKit/UIKit.h> |
|||
|
|||
@interface LGSideMenuHelper : NSObject |
|||
|
|||
+ (void)animateWithDuration:(NSTimeInterval)duration |
|||
animations:(void(^)())animations |
|||
completion:(void(^)(BOOL finished))completion; |
|||
|
|||
+ (void)statusBarAppearanceUpdateAnimated:(BOOL)animated |
|||
viewController:(UIViewController *)viewController |
|||
duration:(NSTimeInterval)duration |
|||
hidden:(BOOL)hidden |
|||
style:(UIStatusBarStyle)style |
|||
animation:(UIStatusBarAnimation)animation; |
|||
|
|||
+ (void)imageView:(UIImageView *)imageView setImageSafe:(UIImage *)image; |
|||
|
|||
+ (BOOL)isViewControllerBasedStatusBarAppearance; |
|||
|
|||
+ (BOOL)isNotRetina; |
|||
|
|||
+ (BOOL)isPhone; |
|||
|
|||
+ (BOOL)isPad; |
|||
|
|||
@end |
@ -0,0 +1,114 @@ |
|||
// |
|||
// LGSideMenuHelper.m |
|||
// LGSideMenuController |
|||
// |
|||
// |
|||
// The MIT License (MIT) |
|||
// |
|||
// Copyright © 2015 Grigory Lutkov <Friend.LGA@gmail.com> |
|||
// (https://github.com/Friend-LGA/LGSideMenuController) |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// |
|||
// The above copyright notice and this permission notice shall be included in all |
|||
// copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|||
// SOFTWARE. |
|||
// |
|||
|
|||
#import "LGSideMenuHelper.h" |
|||
|
|||
@implementation LGSideMenuHelper |
|||
|
|||
+ (void)animateWithDuration:(NSTimeInterval)duration |
|||
animations:(void(^)())animations |
|||
completion:(void(^)(BOOL finished))completion { |
|||
[UIView animateWithDuration:duration |
|||
delay:0.0 |
|||
usingSpringWithDamping:1.0 |
|||
initialSpringVelocity:0.5 |
|||
options:0 |
|||
animations:animations |
|||
completion:completion]; |
|||
|
|||
} |
|||
|
|||
+ (void)statusBarAppearanceUpdateAnimated:(BOOL)animated |
|||
viewController:(UIViewController *)viewController |
|||
duration:(NSTimeInterval)duration |
|||
hidden:(BOOL)hidden |
|||
style:(UIStatusBarStyle)style |
|||
animation:(UIStatusBarAnimation)animation { |
|||
if (self.isViewControllerBasedStatusBarAppearance) { |
|||
if (animated && animation != UIStatusBarAnimationNone) { |
|||
[UIView animateWithDuration:duration animations:^{ |
|||
[viewController setNeedsStatusBarAppearanceUpdate]; |
|||
}]; |
|||
} |
|||
else { |
|||
[viewController setNeedsStatusBarAppearanceUpdate]; |
|||
} |
|||
} |
|||
#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_9_0 |
|||
else { |
|||
[UIApplication.sharedApplication setStatusBarHidden:hidden withAnimation:animation]; |
|||
[UIApplication.sharedApplication setStatusBarStyle:style animated:animated]; |
|||
} |
|||
#endif |
|||
} |
|||
|
|||
+ (void)imageView:(UIImageView *)imageView setImageSafe:(UIImage *)image { |
|||
UIViewContentMode contentMode = imageView.contentMode; |
|||
imageView.contentMode = UIViewContentModeScaleToFill; |
|||
imageView.image = image; |
|||
imageView.contentMode = contentMode; |
|||
} |
|||
|
|||
+ (BOOL)isViewControllerBasedStatusBarAppearance { |
|||
static BOOL isViewControllerBasedStatusBarAppearance; |
|||
static dispatch_once_t onceToken; |
|||
|
|||
dispatch_once(&onceToken, ^{ |
|||
if (UIDevice.currentDevice.systemVersion.floatValue >= 9.0) { |
|||
isViewControllerBasedStatusBarAppearance = YES; |
|||
} |
|||
else { |
|||
NSNumber *viewControllerBasedStatusBarAppearance = [NSBundle.mainBundle objectForInfoDictionaryKey:@"UIViewControllerBasedStatusBarAppearance"]; |
|||
isViewControllerBasedStatusBarAppearance = (viewControllerBasedStatusBarAppearance == nil ? YES : viewControllerBasedStatusBarAppearance.boolValue); |
|||
} |
|||
}); |
|||
|
|||
return isViewControllerBasedStatusBarAppearance; |
|||
} |
|||
|
|||
+ (BOOL)isNotRetina { |
|||
static BOOL isNotRetina; |
|||
static dispatch_once_t onceToken; |
|||
|
|||
dispatch_once(&onceToken, ^{ |
|||
isNotRetina = (UIScreen.mainScreen.scale == 1.0); |
|||
}); |
|||
|
|||
return isNotRetina; |
|||
} |
|||
|
|||
+ (BOOL)isPhone { |
|||
return UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone; |
|||
} |
|||
|
|||
+ (BOOL)isPad { |
|||
return UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad; |
|||
} |
|||
|
|||
@end |
@ -0,0 +1,34 @@ |
|||
// |
|||
// LGSideMenuSegue.h |
|||
// LGSideMenuController |
|||
// |
|||
// |
|||
// The MIT License (MIT) |
|||
// |
|||
// Copyright © 2015 Grigory Lutkov <Friend.LGA@gmail.com> |
|||
// (https://github.com/Friend-LGA/LGSideMenuController) |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// |
|||
// The above copyright notice and this permission notice shall be included in all |
|||
// copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|||
// SOFTWARE. |
|||
// |
|||
|
|||
#import <UIKit/UIKit.h> |
|||
|
|||
@interface LGSideMenuSegue : UIStoryboardSegue |
|||
|
|||
@end |
@ -0,0 +1,49 @@ |
|||
// |
|||
// LGSideMenuSegue.m |
|||
// LGSideMenuController |
|||
// |
|||
// |
|||
// The MIT License (MIT) |
|||
// |
|||
// Copyright © 2015 Grigory Lutkov <Friend.LGA@gmail.com> |
|||
// (https://github.com/Friend-LGA/LGSideMenuController) |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// |
|||
// The above copyright notice and this permission notice shall be included in all |
|||
// copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|||
// SOFTWARE. |
|||
// |
|||
|
|||
#import "LGSideMenuSegue.h" |
|||
#import "LGSideMenuController.h" |
|||
|
|||
@implementation LGSideMenuSegue |
|||
|
|||
- (void)perform { |
|||
NSString *lowercaseIdentifier = self.identifier.lowercaseString; |
|||
|
|||
if ([lowercaseIdentifier isEqualToString:LGSideMenuSegueRootIdentifier]) { |
|||
[(LGSideMenuController *)self.sourceViewController setRootViewController:self.destinationViewController]; |
|||
} |
|||
else if ([lowercaseIdentifier isEqualToString:LGSideMenuSegueLeftIdentifier]) { |
|||
[(LGSideMenuController *)self.sourceViewController setLeftViewController:self.destinationViewController]; |
|||
} |
|||
else if ([lowercaseIdentifier isEqualToString:LGSideMenuSegueRightIdentifier]) { |
|||
[(LGSideMenuController *)self.sourceViewController setRightViewController:self.destinationViewController]; |
|||
} |
|||
} |
|||
|
|||
@end |
@ -0,0 +1,36 @@ |
|||
// |
|||
// LGSideMenuView.h |
|||
// LGSideMenuController |
|||
// |
|||
// |
|||
// The MIT License (MIT) |
|||
// |
|||
// Copyright © 2015 Grigory Lutkov <Friend.LGA@gmail.com> |
|||
// (https://github.com/Friend-LGA/LGSideMenuController) |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// |
|||
// The above copyright notice and this permission notice shall be included in all |
|||
// copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|||
// SOFTWARE. |
|||
// |
|||
|
|||
#import <UIKit/UIKit.h> |
|||
|
|||
@interface LGSideMenuView : UIView |
|||
|
|||
- (nonnull instancetype)initWithLayoutSubviewsHandler:(void(^ _Nonnull)())layoutSubviewsHandler; |
|||
|
|||
@end |
@ -0,0 +1,54 @@ |
|||
// |
|||
// LGSideMenuView.m |
|||
// LGSideMenuController |
|||
// |
|||
// |
|||
// The MIT License (MIT) |
|||
// |
|||
// Copyright © 2015 Grigory Lutkov <Friend.LGA@gmail.com> |
|||
// (https://github.com/Friend-LGA/LGSideMenuController) |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// |
|||
// The above copyright notice and this permission notice shall be included in all |
|||
// copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|||
// SOFTWARE. |
|||
// |
|||
|
|||
#import "LGSideMenuView.h" |
|||
|
|||
@interface LGSideMenuView () |
|||
|
|||
@property (strong, nonatomic) void (^layoutSubviewsHandler)(); |
|||
|
|||
@end |
|||
|
|||
@implementation LGSideMenuView |
|||
|
|||
- (nonnull instancetype)initWithLayoutSubviewsHandler:(void(^ _Nonnull)())layoutSubviewsHandler { |
|||
self = [super init]; |
|||
if (self) { |
|||
self.layoutSubviewsHandler = layoutSubviewsHandler; |
|||
} |
|||
return self; |
|||
} |
|||
|
|||
- (void)layoutSubviews { |
|||
[super layoutSubviews]; |
|||
|
|||
self.layoutSubviewsHandler(); |
|||
} |
|||
|
|||
@end |
@ -0,0 +1,63 @@ |
|||
// |
|||
// UIViewController+LGSideMenuController.h |
|||
// LGSideMenuController |
|||
// |
|||
// |
|||
// The MIT License (MIT) |
|||
// |
|||
// Copyright © 2015 Grigory Lutkov <Friend.LGA@gmail.com> |
|||
// (https://github.com/Friend-LGA/LGSideMenuController) |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// |
|||
// The above copyright notice and this permission notice shall be included in all |
|||
// copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|||
// SOFTWARE. |
|||
// |
|||
|
|||
#import <UIKit/UIKit.h> |
|||
#import "LGSideMenuController.h" |
|||
|
|||
@interface UIViewController (LGSideMenuController) |
|||
|
|||
/** If this view controller is root view controller of side menu controller or one of children of root view controller, return it. */ |
|||
@property(nullable, nonatomic, readonly, weak) LGSideMenuController *sideMenuController; |
|||
|
|||
- (IBAction)showLeftView:(nullable id)sender; |
|||
- (IBAction)hideLeftView:(nullable id)sender; |
|||
- (IBAction)toggleLeftView:(nullable id)sender; |
|||
|
|||
- (IBAction)showLeftViewAnimated:(nullable id)sender; |
|||
- (IBAction)hideLeftViewAnimated:(nullable id)sender; |
|||
- (IBAction)toggleLeftViewAnimated:(nullable id)sender; |
|||
|
|||
- (IBAction)showRightView:(nullable id)sender; |
|||
- (IBAction)hideRightView:(nullable id)sender; |
|||
- (IBAction)toggleRightView:(nullable id)sender; |
|||
|
|||
- (IBAction)showRightViewAnimated:(nullable id)sender; |
|||
- (IBAction)hideRightViewAnimated:(nullable id)sender; |
|||
- (IBAction)toggleRightViewAnimated:(nullable id)sender; |
|||
|
|||
@end |
|||
|
|||
#pragma mark - Deprecated |
|||
|
|||
@interface UIViewController (LGSideMenuControllerDeprecated) |
|||
|
|||
- (IBAction)openLeftView:(nullable id)sender DEPRECATED_ATTRIBUTE; |
|||
- (IBAction)openRightView:(nullable id)sender DEPRECATED_ATTRIBUTE; |
|||
|
|||
@end |
@ -0,0 +1,131 @@ |
|||
// |
|||
// UIViewController+LGSideMenuController.m |
|||
// LGSideMenuController |
|||
// |
|||
// |
|||
// The MIT License (MIT) |
|||
// |
|||
// Copyright © 2015 Grigory Lutkov <Friend.LGA@gmail.com> |
|||
// (https://github.com/Friend-LGA/LGSideMenuController) |
|||
// |
|||
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
// of this software and associated documentation files (the "Software"), to deal |
|||
// in the Software without restriction, including without limitation the rights |
|||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
// copies of the Software, and to permit persons to whom the Software is |
|||
// furnished to do so, subject to the following conditions: |
|||
// |
|||
// The above copyright notice and this permission notice shall be included in all |
|||
// copies or substantial portions of the Software. |
|||
// |
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|||
// SOFTWARE. |
|||
// |
|||
|
|||
#import <objc/runtime.h> |
|||
|
|||
#import "UIViewController+LGSideMenuController.h" |
|||
|
|||
@implementation UIViewController (LGSideMenuController) |
|||
|
|||
- (nullable LGSideMenuController *)sideMenuController { |
|||
if ([self isKindOfClass:[LGSideMenuController class]]) { |
|||
return (LGSideMenuController *)self; |
|||
} |
|||
|
|||
LGSideMenuController *result; |
|||
|
|||
result = objc_getAssociatedObject(self, @"sideMenuController"); |
|||
if (result) return result; |
|||
|
|||
result = self.parentViewController.sideMenuController; |
|||
if (result) return result; |
|||
|
|||
result = self.navigationController.sideMenuController; |
|||
if (result) return result; |
|||
|
|||
result = self.presentingViewController.sideMenuController; |
|||
if (result) return result; |
|||
|
|||
result = self.splitViewController.sideMenuController; |
|||
if (result) return result; |
|||
|
|||
return nil; |
|||
} |
|||
|
|||
#pragma mark - Show/Hide left view |
|||
|
|||
- (IBAction)showLeftView:(nullable id)sender { |
|||
[[self sideMenuController] showLeftView:sender]; |
|||
} |
|||
|
|||
- (IBAction)hideLeftView:(nullable id)sender { |
|||
[[self sideMenuController] hideLeftView:sender]; |
|||
} |
|||
|
|||
- (IBAction)toggleLeftView:(nullable id)sender { |
|||
[[self sideMenuController] toggleLeftView:sender]; |
|||
} |
|||
|
|||
#pragma mark |
|||
|
|||
- (IBAction)showLeftViewAnimated:(nullable id)sender { |
|||
[[self sideMenuController] showLeftViewAnimated:sender]; |
|||
} |
|||
|
|||
- (IBAction)hideLeftViewAnimated:(nullable id)sender { |
|||
[[self sideMenuController] hideLeftViewAnimated:sender]; |
|||
} |
|||
|
|||
- (IBAction)toggleLeftViewAnimated:(nullable id)sender { |
|||
[[self sideMenuController] toggleLeftViewAnimated:sender]; |
|||
} |
|||
|
|||
#pragma mark - Show/Hide right view |
|||
|
|||
- (IBAction)showRightView:(nullable id)sender { |
|||
[[self sideMenuController] showRightView:sender]; |
|||
} |
|||
|
|||
- (IBAction)hideRightView:(nullable id)sender { |
|||
[[self sideMenuController] hideRightView:sender]; |
|||
} |
|||
|
|||
- (IBAction)toggleRightView:(nullable id)sender { |
|||
[[self sideMenuController] toggleRightView:sender]; |
|||
} |
|||
|
|||
#pragma mark |
|||
|
|||
- (IBAction)showRightViewAnimated:(nullable id)sender { |
|||
[[self sideMenuController] showRightViewAnimated:sender]; |
|||
} |
|||
|
|||
- (IBAction)hideRightViewAnimated:(nullable id)sender { |
|||
[[self sideMenuController] hideRightViewAnimated:sender]; |
|||
} |
|||
|
|||
- (IBAction)toggleRightViewAnimated:(nullable id)sender { |
|||
[[self sideMenuController] toggleRightViewAnimated:sender]; |
|||
} |
|||
|
|||
@end |
|||
|
|||
#pragma mark - Deprecated |
|||
|
|||
@implementation UIViewController (LGSideMenuControllerDeprecated) |
|||
|
|||
- (IBAction)openLeftView:(nullable id)sender { |
|||
[self showLeftViewAnimated:sender]; |
|||
} |
|||
|
|||
- (IBAction)openRightView:(nullable id)sender { |
|||
[self showRightViewAnimated:sender]; |
|||
} |
|||
|
|||
@end |
@ -0,0 +1,21 @@ |
|||
The MIT License (MIT) |
|||
|
|||
Copyright (c) 2015 Grigory Lutkov <Friend.LGA@gmail.com> |
|||
|
|||
Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
of this software and associated documentation files (the "Software"), to deal |
|||
in the Software without restriction, including without limitation the rights |
|||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
copies of the Software, and to permit persons to whom the Software is |
|||
furnished to do so, subject to the following conditions: |
|||
|
|||
The above copyright notice and this permission notice shall be included in all |
|||
copies or substantial portions of the Software. |
|||
|
|||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|||
SOFTWARE. |
@ -0,0 +1,741 @@ |
|||
# LGSideMenuController |
|||
|
|||
iOS view controller, shows left and right views by pressing button or gesture. |
|||
|
|||
[![Platform](https://img.shields.io/cocoapods/p/LGSideMenuController.svg)](https://github.com/Friend-LGA/LGSideMenuController) |
|||
[![CocoaPods](https://img.shields.io/cocoapods/v/LGSideMenuController.svg)](http://cocoadocs.org/docsets/LGSideMenuController) |
|||
[![Carthage](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg)](https://github.com/Friend-LGA/LGSideMenuController) |
|||
[![License](http://img.shields.io/cocoapods/l/LGSideMenuController.svg)](https://raw.githubusercontent.com/Friend-LGA/LGSideMenuController/master/LICENSE) |
|||
|
|||
## Preview |
|||
|
|||
<img src="https://raw.githubusercontent.com/Friend-LGA/ReadmeFiles/34a53dd6dee506f5cac7e99f67d2f92720f2d24c/LGSideMenuController/Preview1.gif" width="285"/> <img src="https://raw.githubusercontent.com/Friend-LGA/ReadmeFiles/34a53dd6dee506f5cac7e99f67d2f92720f2d24c/LGSideMenuController/1.png" width="286"/> <img src="https://raw.githubusercontent.com/Friend-LGA/ReadmeFiles/34a53dd6dee506f5cac7e99f67d2f92720f2d24c/LGSideMenuController/2.png" width="286"/> |
|||
<img src="https://raw.githubusercontent.com/Friend-LGA/ReadmeFiles/34a53dd6dee506f5cac7e99f67d2f92720f2d24c/LGSideMenuController/Preview2.gif" width="285"/> <img src="https://raw.githubusercontent.com/Friend-LGA/ReadmeFiles/34a53dd6dee506f5cac7e99f67d2f92720f2d24c/LGSideMenuController/3.png" width="286"/> <img src="https://raw.githubusercontent.com/Friend-LGA/ReadmeFiles/34a53dd6dee506f5cac7e99f67d2f92720f2d24c/LGSideMenuController/4.png" width="286"/> |
|||
<img src="https://raw.githubusercontent.com/Friend-LGA/ReadmeFiles/34a53dd6dee506f5cac7e99f67d2f92720f2d24c/LGSideMenuController/Preview3.gif" width="285"/> <img src="https://raw.githubusercontent.com/Friend-LGA/ReadmeFiles/34a53dd6dee506f5cac7e99f67d2f92720f2d24c/LGSideMenuController/5.png" width="286"/> <img src="https://raw.githubusercontent.com/Friend-LGA/ReadmeFiles/34a53dd6dee506f5cac7e99f67d2f92720f2d24c/LGSideMenuController/6.png" width="286"/> |
|||
|
|||
## Installation |
|||
|
|||
| LGSideMenuController version | iOS version | |
|||
|------------------------------|-------------| |
|||
| <= 1.0.10 | >= 6.0 | |
|||
| >= 1.1.0 | >= 8.0 | |
|||
|
|||
### With source code |
|||
|
|||
[Download repository](https://github.com/Friend-LGA/LGSideMenuController/archive/master.zip), then add [LGSideMenuController directory](https://github.com/Friend-LGA/LGSideMenuController/blob/master/LGSideMenuController/) to your project. |
|||
|
|||
Then import header files where you need to use the library |
|||
|
|||
##### Objective-C |
|||
|
|||
```objective-c |
|||
#import "LGSideMenuController.h" |
|||
#import "UIViewController+LGSideMenuController.h" |
|||
``` |
|||
|
|||
##### Swift |
|||
|
|||
For swift you need to create [bridging header](https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html) |
|||
|
|||
```objective-c |
|||
// BridgingHeader.h |
|||
#import "LGSideMenuController.h" |
|||
#import "UIViewController+LGSideMenuController.h" |
|||
``` |
|||
|
|||
### With CocoaPods |
|||
|
|||
CocoaPods is a dependency manager for Objective-C, which automates and simplifies the process of using 3rd-party libraries in your projects. To install with cocoaPods, follow the "Get Started" section on [CocoaPods](https://cocoapods.org/). |
|||
|
|||
#### Podfile |
|||
|
|||
```ruby |
|||
platform :ios, '8.0' |
|||
use_frameworks! |
|||
pod 'LGSideMenuController' |
|||
``` |
|||
|
|||
Then import framework where you need to use the library |
|||
|
|||
##### Objective-C |
|||
|
|||
```objective-c |
|||
#import <LGSideMenuController/LGSideMenuController.h> |
|||
#import <LGSideMenuController/UIViewController+LGSideMenuController.h> |
|||
// OR |
|||
@import LGSideMenuController; |
|||
// OR |
|||
@import LGSideMenuController.LGSideMenuController; |
|||
@import LGSideMenuController.UIViewController_LGSideMenuController; |
|||
``` |
|||
|
|||
##### Swift |
|||
|
|||
```swift |
|||
import LGSideMenuController |
|||
// OR |
|||
import LGSideMenuController.LGSideMenuController |
|||
import LGSideMenuController.UIViewController_LGSideMenuController |
|||
``` |
|||
|
|||
### With Carthage |
|||
|
|||
Carthage is a lightweight dependency manager for Swift and Objective-C. It leverages CocoaTouch modules and is less invasive than CocoaPods. To install with carthage, follow the instruction on [Carthage](https://github.com/Carthage/Carthage/). |
|||
|
|||
#### Cartfile |
|||
|
|||
```ruby |
|||
github "Friend-LGA/LGSideMenuController" |
|||
``` |
|||
|
|||
Then import framework where you need to use the library |
|||
|
|||
##### Objective-C |
|||
|
|||
```objective-c |
|||
#import <LGSideMenuController/LGSideMenuController.h> |
|||
#import <LGSideMenuController/UIViewController+LGSideMenuController.h> |
|||
// OR |
|||
@import LGSideMenuController; |
|||
// OR |
|||
@import LGSideMenuController.LGSideMenuController; |
|||
@import LGSideMenuController.UIViewController_LGSideMenuController; |
|||
``` |
|||
|
|||
##### Swift |
|||
|
|||
```swift |
|||
import LGSideMenuController |
|||
// OR |
|||
import LGSideMenuController.LGSideMenuController |
|||
import LGSideMenuController.UIViewController_LGSideMenuController |
|||
``` |
|||
|
|||
## Usage |
|||
|
|||
### Initialization |
|||
|
|||
You can use view controllers or views to initialize LGSideMenuController: |
|||
|
|||
##### Objective-C |
|||
|
|||
```objective-c |
|||
- (nonnull instancetype)initWithRootViewController:(nullable UIViewController *)rootViewController; |
|||
|
|||
- (nonnull instancetype)initWithRootViewController:(nullable UIViewController *)rootViewController |
|||
leftViewController:(nullable UIViewController *)leftViewController |
|||
rightViewController:(nullable UIViewController *)rightViewController; |
|||
|
|||
- (nonnull instancetype)initWithRootView:(nullable UIView *)rootView; |
|||
|
|||
- (nonnull instancetype)initWithRootView:(nullable UIView *)rootView |
|||
leftView:(nullable UIView *)leftView |
|||
rightView:(nullable UIView *)rightView; |
|||
``` |
|||
|
|||
##### Swift |
|||
|
|||
```swift |
|||
public init(rootViewController: UIViewController?) |
|||
|
|||
public init(rootViewController: UIViewController?, |
|||
leftViewController: UIViewController?, |
|||
rightViewController: UIViewController?) |
|||
|
|||
public init(rootView: UIView?) |
|||
|
|||
public init(rootView: UIView?, |
|||
leftView: UIView?, |
|||
rightView: UIView?) |
|||
``` |
|||
|
|||
### Setup |
|||
|
|||
To set or to change root, left or right view controllers or views, call: |
|||
|
|||
```swift |
|||
sideMenuController.rootViewController = rootViewController |
|||
sideMenuController.leftViewController = leftViewController |
|||
sideMenuController.rightViewController = rightViewController |
|||
|
|||
sideMenuController.rootView = rootView |
|||
sideMenuController.leftView = leftView |
|||
sideMenuController.rightView = rightView |
|||
``` |
|||
|
|||
If you set, for example, `sideMenuController.rootViewController = rootViewController`, |
|||
then `sideMenuController.rootView == rootViewController.view`. |
|||
If you have, for example, `sideMenuController.rootViewController != nil` and you set `sideMenuController.rootView = rootView`, then `sideMenuController.rootViewController == nil`. |
|||
|
|||
### Quick Example |
|||
|
|||
#### Programmatically |
|||
|
|||
##### Objective-C |
|||
|
|||
```objective-c |
|||
UIViewController *rootViewController = [UIViewController new]; |
|||
UITableViewController *leftViewController = [UITableViewController new]; |
|||
UITableViewController *rightViewController = [UITableViewController new]; |
|||
|
|||
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:rootViewController]; |
|||
|
|||
LGSideMenuController *sideMenuController = [LGSideMenuController sideMenuControllerWithRootViewController:navigationController |
|||
leftViewController:leftViewController |
|||
rightViewController:rightViewController]; |
|||
|
|||
sideMenuController.leftViewWidth = 250.0; |
|||
sideMenuController.leftViewPresentationStyle = LGSideMenuPresentationStyleScaleFromBig; |
|||
|
|||
sideMenuController.rightViewWidth = 100.0; |
|||
sideMenuController.leftViewPresentationStyle = LGSideMenuPresentationStyleSlideBelow; |
|||
``` |
|||
|
|||
##### Swift |
|||
|
|||
```swift |
|||
let rootViewController = UIViewController() |
|||
let leftViewController = UITableViewController() |
|||
let rightViewController = UITableViewController() |
|||
|
|||
let navigationController = UINavigationController(rootViewController: rootViewController) |
|||
|
|||
let sideMenuController = LGSideMenuController(rootViewController: navigationController, |
|||
leftViewController: leftViewController, |
|||
rightViewController: rightViewController) |
|||
|
|||
sideMenuController.leftViewWidth = 250.0; |
|||
sideMenuController.leftViewPresentationStyle = .scaleFromBig; |
|||
|
|||
sideMenuController.rightViewWidth = 100.0; |
|||
sideMenuController.leftViewPresentationStyle = .slideBelow; |
|||
``` |
|||
|
|||
#### With storyboard |
|||
|
|||
1. Create instance of LGSideMenuController |
|||
2. Create some root view controller (for example UINavigationController) |
|||
3. Create some left view controller (for example UITableViewController) |
|||
4. Create some right view controller (for example UITableViewController) |
|||
5. Now you need to connect them all using segues of class `LGSideMenuSegue` and with identifiers: `root`, `left`, `right`. |
|||
|
|||
<img src="https://raw.githubusercontent.com/Friend-LGA/ReadmeFiles/dcb1aa9f4ce0fc1e7ded0ab595f6d346b1698e43/LGSideMenuController/Storyboard_Instructions/Segues/Root1.png" height="300"/> <img src="https://raw.githubusercontent.com/Friend-LGA/ReadmeFiles/dcb1aa9f4ce0fc1e7ded0ab595f6d346b1698e43/LGSideMenuController/Storyboard_Instructions/Segues/Root2.png" height="300"/> <img src="https://raw.githubusercontent.com/Friend-LGA/ReadmeFiles/dcb1aa9f4ce0fc1e7ded0ab595f6d346b1698e43/LGSideMenuController/Storyboard_Instructions/Segues/Root3.png" height="300"/> |
|||
<img src="https://raw.githubusercontent.com/Friend-LGA/ReadmeFiles/dcb1aa9f4ce0fc1e7ded0ab595f6d346b1698e43/LGSideMenuController/Storyboard_Instructions/Segues/Left1.png" height="300"/> <img src="https://raw.githubusercontent.com/Friend-LGA/ReadmeFiles/dcb1aa9f4ce0fc1e7ded0ab595f6d346b1698e43/LGSideMenuController/Storyboard_Instructions/Segues/Left2.png" height="300"/> <img src="https://raw.githubusercontent.com/Friend-LGA/ReadmeFiles/dcb1aa9f4ce0fc1e7ded0ab595f6d346b1698e43/LGSideMenuController/Storyboard_Instructions/Segues/Left3.png" height="300"/> |
|||
<img src="https://raw.githubusercontent.com/Friend-LGA/ReadmeFiles/dcb1aa9f4ce0fc1e7ded0ab595f6d346b1698e43/LGSideMenuController/Storyboard_Instructions/Segues/Right1.png" height="300"/> <img src="https://raw.githubusercontent.com/Friend-LGA/ReadmeFiles/dcb1aa9f4ce0fc1e7ded0ab595f6d346b1698e43/LGSideMenuController/Storyboard_Instructions/Segues/Right2.png" height="300"/> <img src="https://raw.githubusercontent.com/Friend-LGA/ReadmeFiles/dcb1aa9f4ce0fc1e7ded0ab595f6d346b1698e43/LGSideMenuController/Storyboard_Instructions/Segues/Right3.png" height="300"/> |
|||
|
|||
6. You can change `leftViewWidth`, `leftViewPresentationStyle`, `rightViewWidth` and `rightViewPresentationStyle` inside LGSideMenuController's attributes inspector. There you can also find all other properties. |
|||
|
|||
<img src="https://raw.githubusercontent.com/Friend-LGA/ReadmeFiles/d46bbba932f09fc91d91ada65d7060abec2be807/LGSideMenuController/Storyboard_Instructions/Properties.png" width="280"/> |
|||
|
|||
For better examples check [demo projects](https://github.com/Friend-LGA/LGSideMenuController/tree/master/Demo). |
|||
|
|||
### Blur |
|||
|
|||
You can use UIBlurEffect with next properties: |
|||
|
|||
```objective-c |
|||
UIBlurEffect *leftViewBackgroundBlurEffect; |
|||
UIBlurEffect *rightViewBackgroundBlurEffect; |
|||
|
|||
UIBlurEffect *rootViewCoverBlurEffectForLeftView; |
|||
UIBlurEffect *rootViewCoverBlurEffectForRightView; |
|||
|
|||
UIBlurEffect *leftViewCoverBlurEffect; |
|||
UIBlurEffect *rightViewCoverBlurEffect; |
|||
``` |
|||
|
|||
For example: |
|||
|
|||
##### Objective-C |
|||
|
|||
```objective-c |
|||
sideMenuController.leftViewBackgroundBlurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleRegular]; |
|||
``` |
|||
|
|||
##### Swift |
|||
|
|||
```swift |
|||
sideMenuController.leftViewBackgroundBlurEffect = UIBlurEffect(style: .regular) |
|||
``` |
|||
|
|||
If you want to change color of blurred view, use: |
|||
|
|||
```objective-c |
|||
UIColor *leftViewBackgroundColor; |
|||
UIColor *rightViewBackgroundColor; |
|||
|
|||
UIColor *rootViewCoverColorForLeftView; |
|||
UIColor *rootViewCoverColorForRightView; |
|||
|
|||
UIColor *leftViewCoverColor; |
|||
UIColor *rightViewCoverColor; |
|||
``` |
|||
|
|||
For example: |
|||
|
|||
##### Objective-C |
|||
|
|||
```objective-c |
|||
sideMenuController.leftViewBackgroundColor = [UIColor colorWithRed:0.0 green:0.5 blue:1.0 alpha:0.1]; |
|||
``` |
|||
|
|||
##### Swift |
|||
|
|||
```swift |
|||
sideMenuController.leftViewBackgroundColor = UIColor(red: 0.0, green: 0.5, blue: 1.0, alpha: 0.1) |
|||
``` |
|||
|
|||
If you want to change intensity of blurred view, use: |
|||
|
|||
```objective-c |
|||
CGFloat leftViewBackgroundAlpha; |
|||
CGFloat rightViewBackgroundAlpha; |
|||
|
|||
CGFloat rootViewCoverAlphaForLeftView; |
|||
CGFloat rootViewCoverAlphaForRightView; |
|||
|
|||
CGFloat CGFloatleftViewCoverAlpha; |
|||
CGFloat rightViewCoverAlpha; |
|||
``` |
|||
|
|||
For example: |
|||
|
|||
```objective-c |
|||
sideMenuController.leftViewBackgroundAlpha = 0.9; |
|||
``` |
|||
|
|||
### Status Bar |
|||
|
|||
You can't use `prefersStatusBarHidden, preferredStatusBarStyle, preferredStatusBarUpdateAnimation`, |
|||
instead you need to override all these methods for each controller separated, or use properties of sideMenuController: |
|||
|
|||
```objective-c |
|||
BOOL rootViewStatusBarHidden; |
|||
UIStatusBarStyle rootViewStatusBarStyle; |
|||
UIStatusBarAnimation rootViewStatusBarUpdateAnimation; |
|||
|
|||
BOOL leftViewStatusBarHidden; |
|||
UIStatusBarStyle leftViewStatusBarStyle; |
|||
UIStatusBarAnimation leftViewStatusBarUpdateAnimation; |
|||
|
|||
BOOL rightViewStatusBarHidden; |
|||
UIStatusBarStyle rightViewStatusBarStyle; |
|||
UIStatusBarAnimation rightViewStatusBarUpdateAnimation; |
|||
``` |
|||
|
|||
And these properties have greater priority then overridden `prefersStatusBarHidden, preferredStatusBarStyle, preferredStatusBarUpdateAnimation`. |
|||
|
|||
For example, you had sideMenuController with rootViewController, leftViewController and rightViewController. |
|||
For rootViewController, you can override it's default methods or use sideMenuController's properties: |
|||
|
|||
##### Objective-C |
|||
|
|||
```objective-c |
|||
// In RootViewController.m |
|||
|
|||
- (BOOL)prefersStatusBarHidden { |
|||
return NO; |
|||
} |
|||
|
|||
- (UIStatusBarStyle)preferredStatusBarStyle { |
|||
return UIStatusBarStyleDefault; |
|||
} |
|||
|
|||
- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation { |
|||
return UIStatusBarAnimationNone; |
|||
} |
|||
|
|||
// OR in SideMenuController.m |
|||
|
|||
self.rootViewStatusBarHidden = NO; |
|||
self.rootViewStatusBarStyle = UIStatusBarStyleDefault; |
|||
self.rootViewStatusBarUpdateAnimation = UIStatusBarAnimationNone; |
|||
|
|||
// OR |
|||
|
|||
- (BOOL)isRootViewStatusBarHidden { |
|||
return NO; |
|||
} |
|||
|
|||
- (UIStatusBarStyle)rootViewStatusBarStyle { |
|||
return UIStatusBarStyleDefault; |
|||
} |
|||
|
|||
- (UIStatusBarAnimation)rootViewStatusBarUpdateAnimation { |
|||
return UIStatusBarAnimationNone; |
|||
} |
|||
``` |
|||
|
|||
##### Swift |
|||
|
|||
```swift |
|||
// In RootViewController.swift |
|||
|
|||
override var prefersStatusBarHidden : Bool { |
|||
return false |
|||
} |
|||
|
|||
override var preferredStatusBarStyle : UIStatusBarStyle { |
|||
return .default |
|||
} |
|||
|
|||
override var preferredStatusBarUpdateAnimation : UIStatusBarAnimation { |
|||
return .none |
|||
} |
|||
|
|||
// OR in SideMenuController.swift |
|||
|
|||
rootViewStatusBarHidden = false |
|||
rootViewStatusBarStyle = .default |
|||
rootViewStatusBarUpdateAnimation = .none |
|||
|
|||
// OR |
|||
|
|||
override var isRootViewStatusBarHidden : Bool { |
|||
get { return false } |
|||
set { super.isRootViewStatusBarHidden = newValue } |
|||
} |
|||
|
|||
override var rootViewStatusBarStyle : UIStatusBarStyle { |
|||
get { return .default } |
|||
set { super.rootViewStatusBarStyle = newValue } |
|||
} |
|||
|
|||
override var rootViewStatusBarUpdateAnimation : UIStatusBarAnimation { |
|||
get { return .none } |
|||
set { super.rootViewStatusBarUpdateAnimation = newValue } |
|||
} |
|||
``` |
|||
|
|||
For `leftViewController and rightViewController` principe the same, but lets look at situation, when animations are different for each viewController. |
|||
* When side views are hidden, then `statusBarUpdateAnimation == rootViewController.statusBarUpdateAnimation`. |
|||
* When left view is going to show, then `statusBarUpdateAnimation == leftViewController.statusBarUpdateAnimation`. |
|||
* When left view is going to hide and root view is going to show, then `statusBarUpdateAnimation == rootViewController.statusBarUpdateAnimation`. |
|||
|
|||
But may be you want to `statusBarUpdateAnimation == leftViewController.statusBarUpdateAnimation` also when left view is going to hide. |
|||
Then you can do next: |
|||
|
|||
##### Objective-C |
|||
|
|||
```objective-c |
|||
// In RootViewController.m |
|||
|
|||
- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation { |
|||
if (self.sideMenuController.isLeftViewVisible) { |
|||
return UIStatusBarAnimationFade; |
|||
} |
|||
else if (self.sideMenuController.isRightViewVisible) { |
|||
return UIStatusBarAnimationSlide; |
|||
} |
|||
else { |
|||
return UIStatusBarAnimationNone; |
|||
} |
|||
} |
|||
|
|||
// OR in SideMenuController.m |
|||
|
|||
- (UIStatusBarAnimation)rootViewStatusBarUpdateAnimation { |
|||
if (self.isLeftViewVisible) { |
|||
return UIStatusBarAnimationFade; |
|||
} |
|||
else if (self.isRightViewVisible) { |
|||
return UIStatusBarAnimationSlide; |
|||
} |
|||
else { |
|||
return UIStatusBarAnimationNone; |
|||
} |
|||
} |
|||
``` |
|||
|
|||
##### Swift |
|||
|
|||
```swift |
|||
// In RootViewController.swift |
|||
|
|||
override var preferredStatusBarUpdateAnimation : UIStatusBarAnimation { |
|||
if sideMenuController.isLeftViewVisible { |
|||
return UIStatusBarAnimationFade |
|||
} |
|||
else if sideMenuController.isRightViewVisible { |
|||
return UIStatusBarAnimationSlide |
|||
} |
|||
else { |
|||
return UIStatusBarAnimationNone |
|||
} |
|||
} |
|||
|
|||
// OR in SideMenuController.swift |
|||
|
|||
override var rootViewStatusBarUpdateAnimation : UIStatusBarAnimation { |
|||
get { |
|||
if isLeftViewVisible { |
|||
return UIStatusBarAnimationFade |
|||
} |
|||
else if isRightViewVisible { |
|||
return UIStatusBarAnimationSlide |
|||
} |
|||
else { |
|||
return UIStatusBarAnimationNone |
|||
} |
|||
} |
|||
|
|||
set { super.rootViewStatusBarUpdateAnimation = newValue } |
|||
} |
|||
``` |
|||
|
|||
### Always visible options |
|||
|
|||
Sometimes, for example on iPad, you need to have toggleable side menu on portrait orientation and always visible side menu on landscape orientation |
|||
|
|||
You can get it with properties: |
|||
|
|||
```objective-c |
|||
LGSideMenuAlwaysVisibleOptions leftViewAlwaysVisibleOptions; |
|||
LGSideMenuAlwaysVisibleOptions rightViewAlwaysVisibleOptions; |
|||
``` |
|||
|
|||
LGSideMenuAlwaysVisibleOptions has values: |
|||
|
|||
``` |
|||
LGSideMenuAlwaysVisibleOnNone |
|||
LGSideMenuAlwaysVisibleOnLandscape |
|||
LGSideMenuAlwaysVisibleOnPortrait |
|||
LGSideMenuAlwaysVisibleOnPad |
|||
LGSideMenuAlwaysVisibleOnPhone |
|||
LGSideMenuAlwaysVisibleOnPadLandscape |
|||
LGSideMenuAlwaysVisibleOnPadPortrait |
|||
LGSideMenuAlwaysVisibleOnPhoneLandscape |
|||
LGSideMenuAlwaysVisibleOnPhonePortrait |
|||
LGSideMenuAlwaysVisibleOnAll |
|||
``` |
|||
|
|||
You can choose multiple values like this: |
|||
|
|||
##### Objective-C |
|||
|
|||
```objective-c |
|||
sideMenuController.leftViewAlwaysVisibleOptions = LGSideMenuAlwaysVisibleOnPadLandscape|LGSideMenuAlwaysVisibleOnPhoneLandscape; |
|||
``` |
|||
|
|||
##### Swift |
|||
|
|||
```swift |
|||
sideMenuController.leftViewAlwaysVisibleOptions = [.onPadLandscape, .onPhoneLandscape] |
|||
``` |
|||
|
|||
### NavigationController's back gesture |
|||
|
|||
Back gesture for UINavigationController has greater priority then swipe gesture for LGSideMenuController. |
|||
But if you want, you can disable `interactivePopGestureRecognizer`, or change `swipeGestureArea`, or increase `leftViewSwipeGestureRange, rightViewSwipeGestureRange`. |
|||
|
|||
##### Objective-C |
|||
|
|||
```objective-c |
|||
navigationController.interactivePopGestureRecognizer.enabled = NO; |
|||
|
|||
// OR |
|||
|
|||
sideMenuController.swipeGestureArea = LGSideMenuSwipeGestureAreaFull; |
|||
|
|||
// OR |
|||
|
|||
sideMenuController.leftViewSwipeGestureRange = LGSideMenuSwipeGestureRangeMake(44.0, 88.0); |
|||
sideMenuController.rightViewSwipeGestureRange = LGSideMenuSwipeGestureRangeMake(88.0, 44.0); |
|||
``` |
|||
|
|||
##### Swift |
|||
|
|||
```swift |
|||
navigationController.interactivePopGestureRecognizer.isEnabled = false |
|||
|
|||
// OR |
|||
|
|||
sideMenuController.swipeGestureArea = .full |
|||
|
|||
// OR |
|||
|
|||
sideMenuController.leftViewSwipeGestureRange = LGSideMenuSwipeGestureRangeMake(44.0, 88.0) |
|||
sideMenuController.rightViewSwipeGestureRange = LGSideMenuSwipeGestureRangeMake(88.0, 44.0) |
|||
``` |
|||
|
|||
### Editable Table View |
|||
|
|||
If you have editable table view inside sideMenuController, then it will work fine if you swipe rows not inside `swipeGestureArea` for sideMenuController. |
|||
If you need more place for swipe inside table view, then you can decrease `leftViewSwipeGestureRange, rightViewSwipeGestureRange` or disable it. |
|||
|
|||
##### Objective-C |
|||
|
|||
```objective-c |
|||
sideMenuController.swipeGestureArea = LGSideMenuSwipeGestureAreaBorders; // Default |
|||
|
|||
sideMenuController.leftViewSwipeGestureRange = LGSideMenuSwipeGestureRangeMake(44.0, 32.0); |
|||
sideMenuController.rightViewSwipeGestureRange = LGSideMenuSwipeGestureRangeMake(32.0, 44.0); |
|||
|
|||
// OR |
|||
|
|||
sideMenuController.leftViewSwipeGestureEnabled = NO; |
|||
sideMenuController.rightViewSwipeGestureEnabled = NO; |
|||
``` |
|||
|
|||
##### Swift |
|||
|
|||
```swift |
|||
sideMenuController.swipeGestureArea = .borders // Default |
|||
|
|||
sideMenuController.leftViewSwipeGestureRange = LGSideMenuSwipeGestureRangeMake(44.0, 32.0) |
|||
sideMenuController.rightViewSwipeGestureRange = LGSideMenuSwipeGestureRangeMake(32.0, 44.0) |
|||
|
|||
// OR |
|||
|
|||
sideMenuController.leftViewSwipeGestureEnabled = false |
|||
sideMenuController.rightViewSwipeGestureEnabled = false |
|||
``` |
|||
|
|||
### Handle actions |
|||
|
|||
To handle actions you can use delegate, blocks or notifications: |
|||
|
|||
#### Delegate |
|||
|
|||
##### Objective-C |
|||
|
|||
```objective-c |
|||
<LGSideMenuDelegate> |
|||
|
|||
@optional |
|||
|
|||
- (void)willShowLeftView:(nonnull UIView *)leftView sideMenuController:(nonnull LGSideMenuController *)sideMenuController; |
|||
- (void)didShowLeftView:(nonnull UIView *)leftView sideMenuController:(nonnull LGSideMenuController *)sideMenuController; |
|||
|
|||
- (void)willHideLeftView:(nonnull UIView *)leftView sideMenuController:(nonnull LGSideMenuController *)sideMenuController; |
|||
- (void)didHideLeftView:(nonnull UIView *)leftView sideMenuController:(nonnull LGSideMenuController *)sideMenuController; |
|||
|
|||
- (void)willShowRightView:(nonnull UIView *)rightView sideMenuController:(nonnull LGSideMenuController *)sideMenuController; |
|||
- (void)didShowRightView:(nonnull UIView *)rightView sideMenuController:(nonnull LGSideMenuController *)sideMenuController; |
|||
|
|||
- (void)willHideRightView:(nonnull UIView *)rightView sideMenuController:(nonnull LGSideMenuController *)sideMenuController; |
|||
- (void)didHideRightView:(nonnull UIView *)rightView sideMenuController:(nonnull LGSideMenuController *)sideMenuController; |
|||
|
|||
- (void)showAnimationsForLeftView:(nonnull UIView *)leftView sideMenuController:(nonnull LGSideMenuController *)sideMenuController duration:(NSTimeInterval)duration; |
|||
- (void)hideAnimationsForLeftView:(nonnull UIView *)leftView sideMenuController:(nonnull LGSideMenuController *)sideMenuController duration:(NSTimeInterval)duration; |
|||
|
|||
- (void)showAnimationsForRightView:(nonnull UIView *)rightView sideMenuController:(nonnull LGSideMenuController *)sideMenuController duration:(NSTimeInterval)duration; |
|||
- (void)hideAnimationsForRightView:(nonnull UIView *)rightView sideMenuController:(nonnull LGSideMenuController *)sideMenuController duration:(NSTimeInterval)duration; |
|||
``` |
|||
|
|||
##### Swift |
|||
|
|||
```swift |
|||
<LGSideMenuDelegate> |
|||
|
|||
optional public func willShowLeftView(_ leftView: UIView, sideMenuController: LGSideMenuController) |
|||
optional public func didShowLeftView(_ leftView: UIView, sideMenuController: LGSideMenuController) |
|||
|
|||
optional public func willHideLeftView(_ leftView: UIView, sideMenuController: LGSideMenuController) |
|||
optional public func didHideLeftView(_ leftView: UIView, sideMenuController: LGSideMenuController) |
|||
|
|||
optional public func willShowRightView(_ rightView: UIView, sideMenuController: LGSideMenuController) |
|||
optional public func didShowRightView(_ rightView: UIView, sideMenuController: LGSideMenuController) |
|||
|
|||
optional public func willHideRightView(_ rightView: UIView, sideMenuController: LGSideMenuController) |
|||
optional public func didHideRightView(_ rightView: UIView, sideMenuController: LGSideMenuController) |
|||
|
|||
optional public func showAnimations(forLeftView leftView: UIView, sideMenuController: LGSideMenuController, duration: TimeInterval) |
|||
optional public func hideAnimations(forLeftView leftView: UIView, sideMenuController: LGSideMenuController, duration: TimeInterval) |
|||
|
|||
optional public func showAnimations(forRightView rightView: UIView, sideMenuController: LGSideMenuController, duration: TimeInterval) |
|||
optional public func hideAnimations(forRightView rightView: UIView, sideMenuController: LGSideMenuController, duration: TimeInterval) |
|||
``` |
|||
|
|||
#### Blocks |
|||
|
|||
##### Objective-C |
|||
|
|||
```objective-c |
|||
void(^ _Nullable willShowLeftView)(LGSideMenuController * _Nonnull sideMenuController, UIView * _Nonnull view); |
|||
void(^ _Nullable didShowLeftView)(LGSideMenuController * _Nonnull sideMenuController, UIView * _Nonnull view); |
|||
|
|||
void(^ _Nullable willHideLeftView)(LGSideMenuController * _Nonnull sideMenuController, UIView * _Nonnull view); |
|||
void(^ _Nullable didHideLeftView)(LGSideMenuController * _Nonnull sideMenuController, UIView * _Nonnull view); |
|||
|
|||
void(^ _Nullable willShowRightView)(LGSideMenuController * _Nonnull sideMenuController, UIView * _Nonnull view); |
|||
void(^ _Nullable didShowRightView)(LGSideMenuController * _Nonnull sideMenuController, UIView * _Nonnull view); |
|||
|
|||
void(^ _Nullable willHideRightView)(LGSideMenuController * _Nonnull sideMenuController, UIView * _Nonnull view); |
|||
void(^ _Nullable didHideRightView)(LGSideMenuController * _Nonnull sideMenuController, UIView * _Nonnull view); |
|||
|
|||
void(^ _Nullable showLeftViewAnimations)(LGSideMenuController * _Nonnull sideMenuController, UIView * _Nonnull view, NSTimeInterval duration); |
|||
void(^ _Nullable hideLeftViewAnimations)(LGSideMenuController * _Nonnull sideMenuController, UIView * _Nonnull view, NSTimeInterval duration); |
|||
|
|||
void(^ _Nullable showRightViewAnimations)(LGSideMenuController * _Nonnull sideMenuController, UIView * _Nonnull view, NSTimeInterval duration); |
|||
void(^ _Nullable hideRightViewAnimations)(LGSideMenuController * _Nonnull sideMenuController, UIView * _Nonnull view, NSTimeInterval duration); |
|||
``` |
|||
|
|||
##### Swift |
|||
|
|||
```swift |
|||
open var willShowLeftView: ((sideMenuController: LGSideMenuController, view: UIView) -> Swift.Void)? |
|||
open var didShowLeftView: ((sideMenuController: LGSideMenuController, view: UIView) -> Swift.Void)? |
|||
|
|||
open var willHideLeftView: ((sideMenuController: LGSideMenuController, view: UIView) -> Swift.Void)? |
|||
open var didHideLeftView: ((sideMenuController: LGSideMenuController, view: UIView) -> Swift.Void)? |
|||
|
|||
open var willShowRightView: ((sideMenuController: LGSideMenuController, view: UIView) -> Swift.Void)? |
|||
open var didShowRightView: ((sideMenuController: LGSideMenuController, view: UIView) -> Swift.Void)? |
|||
|
|||
open var willHideRightView: ((sideMenuController: LGSideMenuController, view: UIView) -> Swift.Void)? |
|||
open var didHideRightView: ((sideMenuController: LGSideMenuController, view: UIView) -> Swift.Void)? |
|||
|
|||
open var showLeftViewAnimations: ((sideMenuController: LGSideMenuController, view: UIView, duration: TimeInterval) -> Swift.Void)? |
|||
open var hideLeftViewAnimations: ((sideMenuController: LGSideMenuController, view: UIView, duration: TimeInterval) -> Swift.Void)? |
|||
|
|||
open var showRightViewAnimations: ((sideMenuController: LGSideMenuController, view: UIView, duration: TimeInterval) -> Swift.Void)? |
|||
open var hideRightViewAnimations: ((sideMenuController: LGSideMenuController, view: UIView, duration: TimeInterval) -> Swift.Void)? |
|||
``` |
|||
|
|||
#### Notifications |
|||
|
|||
``` |
|||
LGSideMenuWillShowLeftViewNotification |
|||
LGSideMenuDidShowLeftViewNotification |
|||
|
|||
LGSideMenuWillHideLeftViewNotification |
|||
LGSideMenuDidHideLeftViewNotification |
|||
|
|||
LGSideMenuWillShowRightViewNotification |
|||
LGSideMenuDidShowRightViewNotification |
|||
|
|||
LGSideMenuWillHideRightViewNotification |
|||
LGSideMenuDidHideRightViewNotification |
|||
|
|||
LGSideMenuShowLeftViewAnimationsNotification |
|||
LGSideMenuHideLeftViewAnimationsNotification |
|||
|
|||
LGSideMenuShowRightViewAnimationsNotification |
|||
LGSideMenuHideRightViewAnimationsNotification |
|||
``` |
|||
|
|||
### More |
|||
|
|||
For more details see [header files](https://github.com/Friend-LGA/LGSideMenuController/tree/master/LGSideMenuController) and try Xcode [demo projects](https://github.com/Friend-LGA/LGSideMenuController/tree/master/Demo): |
|||
* [Objective-C](https://github.com/Friend-LGA/LGSideMenuController/tree/master/Demo/Objective-C) |
|||
* [Objective-C + Storyboard](https://github.com/Friend-LGA/LGSideMenuController/tree/master/Demo/Objective-C_Storyboard) |
|||
* [Swift](https://github.com/Friend-LGA/LGSideMenuController/tree/master/Demo/Swift) |
|||
* [Swift + Storyboard](https://github.com/Friend-LGA/LGSideMenuController/tree/master/Demo/Swift_Storyboard) |
|||
|
|||
## Xamarin |
|||
|
|||
If you use Xamarin, look at this repository: |
|||
* https://github.com/yahavgb/LGSideMenuController-Xamarin |
|||
|
|||
## Frameworks |
|||
|
|||
If you like LGSideMenuController, check out my other useful libraries: |
|||
* [LGAlertView](https://github.com/Friend-LGA/LGAlertView) |
|||
Customizable implementation of UIAlertViewController, UIAlertView and UIActionSheet. All in one. You can customize every detail. Make AlertView of your dream! :) |
|||
* [LGPlusButtonsView](https://github.com/Friend-LGA/LGPlusButtonsView) |
|||
Customizable iOS implementation of Floating Action Button (Google Plus Button, fab). |
|||
|
|||
## License |
|||
|
|||
LGSideMenuController is released under the MIT license. See [LICENSE](https://raw.githubusercontent.com/Friend-LGA/LGSideMenuController/master/LICENSE) for details. |
10555
Pods/Pods.xcodeproj/project.pbxproj
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,26 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> |
|||
<plist version="1.0"> |
|||
<dict> |
|||
<key>CFBundleDevelopmentRegion</key> |
|||
<string>en</string> |
|||
<key>CFBundleExecutable</key> |
|||
<string>${EXECUTABLE_NAME}</string> |
|||
<key>CFBundleIdentifier</key> |
|||
<string>${PRODUCT_BUNDLE_IDENTIFIER}</string> |
|||
<key>CFBundleInfoDictionaryVersion</key> |
|||
<string>6.0</string> |
|||
<key>CFBundleName</key> |
|||
<string>${PRODUCT_NAME}</string> |
|||
<key>CFBundlePackageType</key> |
|||
<string>FMWK</string> |
|||
<key>CFBundleShortVersionString</key> |
|||
<string>2.1.1</string> |
|||
<key>CFBundleSignature</key> |
|||
<string>????</string> |
|||
<key>CFBundleVersion</key> |
|||
<string>${CURRENT_PROJECT_VERSION}</string> |
|||
<key>NSPrincipalClass</key> |
|||
<string></string> |
|||
</dict> |
|||
</plist> |
@ -0,0 +1,5 @@ |
|||
#import <Foundation/Foundation.h> |
|||
@interface PodsDummy_LGSideMenuController : NSObject |
|||
@end |
|||
@implementation PodsDummy_LGSideMenuController |
|||
@end |
@ -0,0 +1,12 @@ |
|||
#ifdef __OBJC__ |
|||
#import <UIKit/UIKit.h> |
|||
#else |
|||
#ifndef FOUNDATION_EXPORT |
|||
#if defined(__cplusplus) |
|||
#define FOUNDATION_EXPORT extern "C" |
|||
#else |
|||
#define FOUNDATION_EXPORT extern |
|||
#endif |
|||
#endif |
|||
#endif |
|||
|
@ -0,0 +1,23 @@ |
|||
#ifdef __OBJC__ |
|||
#import <UIKit/UIKit.h> |
|||
#else |
|||
#ifndef FOUNDATION_EXPORT |
|||
#if defined(__cplusplus) |
|||
#define FOUNDATION_EXPORT extern "C" |
|||
#else |
|||
#define FOUNDATION_EXPORT extern |
|||
#endif |
|||
#endif |
|||
#endif |
|||
|
|||
#import "LGSideMenuBorderView.h" |
|||
#import "LGSideMenuController.h" |
|||
#import "LGSideMenuGesturesHandler.h" |
|||
#import "LGSideMenuHelper.h" |
|||
#import "LGSideMenuSegue.h" |
|||
#import "LGSideMenuView.h" |
|||
#import "UIViewController+LGSideMenuController.h" |
|||
|
|||
FOUNDATION_EXPORT double LGSideMenuControllerVersionNumber; |
|||
FOUNDATION_EXPORT const unsigned char LGSideMenuControllerVersionString[]; |
|||
|
@ -0,0 +1,6 @@ |
|||
framework module LGSideMenuController { |
|||
umbrella header "LGSideMenuController-umbrella.h" |
|||
|
|||
export * |
|||
module * { export * } |
|||
} |
@ -0,0 +1,8 @@ |
|||
CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/LGSideMenuController |
|||
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 |
|||
PODS_BUILD_DIR = ${BUILD_DIR} |
|||
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) |
|||
PODS_ROOT = ${SRCROOT} |
|||
PODS_TARGET_SRCROOT = ${PODS_ROOT}/LGSideMenuController |
|||
PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} |
|||
SKIP_INSTALL = YES |
Write
Preview
Loading…
Cancel
Save
Reference in new issue