Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a1716035c3 | |||
| 99456afaed | |||
| 4b92f5a776 | |||
| 459a4a1e9f | |||
| 717fd3a325 | |||
| 802146708e | |||
| f34452d040 | |||
| bda990bbef | |||
| b8f13dc333 | |||
| 793ffd77bc | |||
| 132a50766e | |||
| 85f00c63b4 | |||
| e71ec145f1 | |||
| 37b0f6d57e | |||
| ccee3e1f83 |
@@ -4,6 +4,8 @@
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>en</string>
|
||||
<key>CFBundleDisplayName</key>
|
||||
<string>SideMenu</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>$(EXECUTABLE_NAME)</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
|
||||
@@ -1,7 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="11134" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="11762" systemVersion="16C67" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
|
||||
<device id="retina4_7" orientation="portrait">
|
||||
<adaptation id="fullscreen"/>
|
||||
</device>
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11106"/>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11757"/>
|
||||
<capability name="Constraints with non-1.0 multipliers" minToolsVersion="5.1"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
@@ -18,12 +22,14 @@
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text=" Copyright © 2016 jonkykong. All rights reserved." textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="obG-Y5-kRd">
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text=" Copyright © 2016 Jon Kent. All rights reserved." textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="obG-Y5-kRd">
|
||||
<rect key="frame" x="20" y="626.5" width="335" height="21"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="SideMenu" textAlignment="center" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" minimumFontSize="18" translatesAutoresizingMaskIntoConstraints="NO" id="GJd-Yh-RWb">
|
||||
<rect key="frame" x="20" y="202" width="335" height="43"/>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="36"/>
|
||||
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<nil key="highlightedColor"/>
|
||||
|
||||
@@ -17,8 +17,35 @@ open class SideMenuTransition: UIPercentDrivenInteractiveTransition, UIViewContr
|
||||
|
||||
internal static let singleton = SideMenuTransition()
|
||||
internal static var presentDirection: UIRectEdge = .left;
|
||||
internal static weak var tapView: UIView?
|
||||
internal static weak var statusBarView: UIView?
|
||||
internal static weak var tapView: UIView? {
|
||||
didSet {
|
||||
guard let tapView = tapView else {
|
||||
return
|
||||
}
|
||||
|
||||
tapView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
|
||||
let exitPanGesture = UIPanGestureRecognizer()
|
||||
exitPanGesture.addTarget(SideMenuTransition.self, action:#selector(SideMenuTransition.handleHideMenuPan(_:)))
|
||||
let exitTapGesture = UITapGestureRecognizer()
|
||||
exitTapGesture.addTarget(SideMenuTransition.self, action: #selector(SideMenuTransition.handleHideMenuTap(_:)))
|
||||
tapView.addGestureRecognizer(exitPanGesture)
|
||||
tapView.addGestureRecognizer(exitTapGesture)
|
||||
}
|
||||
}
|
||||
internal static weak var statusBarView: UIView? {
|
||||
didSet {
|
||||
guard let statusBarView = statusBarView else {
|
||||
return
|
||||
}
|
||||
|
||||
if let menuShrinkBackgroundColor = SideMenuManager.menuAnimationBackgroundColor {
|
||||
statusBarView.backgroundColor = menuShrinkBackgroundColor
|
||||
} else {
|
||||
statusBarView.backgroundColor = UIColor.black
|
||||
}
|
||||
statusBarView.isUserInteractionEnabled = false
|
||||
}
|
||||
}
|
||||
|
||||
// prevent instantiation
|
||||
fileprivate override init() {}
|
||||
@@ -154,7 +181,9 @@ open class SideMenuTransition: UIPercentDrivenInteractiveTransition, UIViewContr
|
||||
internal class func hideMenuStart() {
|
||||
NotificationCenter.default.removeObserver(SideMenuTransition.singleton)
|
||||
guard let mainViewController = SideMenuTransition.viewControllerForPresentedMenu,
|
||||
let menuView = SideMenuTransition.presentDirection == .left ? SideMenuManager.menuLeftNavigationController?.view : SideMenuManager.menuRightNavigationController?.view else {return}
|
||||
let menuView = SideMenuTransition.presentDirection == .left ? SideMenuManager.menuLeftNavigationController?.view : SideMenuManager.menuRightNavigationController?.view else {
|
||||
return
|
||||
}
|
||||
|
||||
menuView.transform = CGAffineTransform.identity
|
||||
mainViewController.view.transform = CGAffineTransform.identity
|
||||
@@ -292,67 +321,45 @@ open class SideMenuTransition: UIPercentDrivenInteractiveTransition, UIViewContr
|
||||
|
||||
// get reference to our fromView, toView and the container view that we should perform the transition in
|
||||
let container = transitionContext.containerView
|
||||
// prevent any other menu gestures from firing
|
||||
container.isUserInteractionEnabled = false
|
||||
|
||||
if let menuBackgroundColor = SideMenuManager.menuAnimationBackgroundColor {
|
||||
container.backgroundColor = menuBackgroundColor
|
||||
}
|
||||
|
||||
// create a tuple of our screens
|
||||
let screens : (from:UIViewController, to:UIViewController) = (transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from)!, transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to)!)
|
||||
let fromViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from)!
|
||||
let toViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to)!
|
||||
|
||||
// assign references to our menu view controller and the 'bottom' view controller from the tuple
|
||||
// remember that our menuViewController will alternate between the from and to view controller depending if we're presenting or dismissing
|
||||
let menuViewController = (!presenting ? screens.from : screens.to)
|
||||
let topViewController = !presenting ? screens.to : screens.from
|
||||
let menuViewController = presenting ? toViewController : fromViewController
|
||||
let topViewController = presenting ? fromViewController : toViewController
|
||||
|
||||
let menuView = menuViewController.view
|
||||
let topView = topViewController.view
|
||||
let menuView = menuViewController.view!
|
||||
let topView = topViewController.view!
|
||||
|
||||
// prepare menu items to slide in
|
||||
if presenting {
|
||||
var tapView: UIView?
|
||||
if !SideMenuManager.menuPresentingViewControllerUserInteractionEnabled {
|
||||
tapView = UIView()
|
||||
tapView!.autoresizingMask = [.flexibleHeight, .flexibleWidth]
|
||||
let exitPanGesture = UIPanGestureRecognizer()
|
||||
exitPanGesture.addTarget(SideMenuTransition.self, action:#selector(SideMenuTransition.handleHideMenuPan(_:)))
|
||||
let exitTapGesture = UITapGestureRecognizer()
|
||||
exitTapGesture.addTarget(SideMenuTransition.self, action: #selector(SideMenuTransition.handleHideMenuTap(_:)))
|
||||
tapView!.addGestureRecognizer(exitPanGesture)
|
||||
tapView!.addGestureRecognizer(exitTapGesture)
|
||||
SideMenuTransition.tapView = tapView
|
||||
}
|
||||
|
||||
SideMenuTransition.originalSuperview = topView?.superview
|
||||
SideMenuTransition.originalSuperview = topView.superview
|
||||
|
||||
// add the both views to our view controller
|
||||
switch SideMenuManager.menuPresentMode {
|
||||
case .viewSlideOut, .viewSlideInOut:
|
||||
container.addSubview(menuView!)
|
||||
container.addSubview(topView!)
|
||||
if let tapView = tapView {
|
||||
topView?.addSubview(tapView)
|
||||
}
|
||||
container.addSubview(menuView)
|
||||
container.addSubview(topView)
|
||||
case .menuSlideIn, .menuDissolveIn:
|
||||
container.addSubview(topView!)
|
||||
if let tapView = tapView {
|
||||
container.addSubview(tapView)
|
||||
}
|
||||
container.addSubview(menuView!)
|
||||
container.addSubview(topView)
|
||||
container.addSubview(menuView)
|
||||
}
|
||||
|
||||
|
||||
if SideMenuManager.menuFadeStatusBar {
|
||||
let blackBar = UIView()
|
||||
if let menuShrinkBackgroundColor = SideMenuManager.menuAnimationBackgroundColor {
|
||||
blackBar.backgroundColor = menuShrinkBackgroundColor
|
||||
} else {
|
||||
blackBar.backgroundColor = UIColor.black
|
||||
}
|
||||
blackBar.isUserInteractionEnabled = false
|
||||
container.addSubview(blackBar)
|
||||
SideMenuTransition.statusBarView = blackBar
|
||||
let statusBarView = UIView()
|
||||
SideMenuTransition.statusBarView = statusBarView
|
||||
container.addSubview(statusBarView)
|
||||
}
|
||||
|
||||
SideMenuTransition.hideMenuStart() // offstage for interactive
|
||||
SideMenuTransition.hideMenuStart()
|
||||
}
|
||||
|
||||
// perform the animation!
|
||||
@@ -360,12 +367,14 @@ open class SideMenuTransition: UIPercentDrivenInteractiveTransition, UIViewContr
|
||||
let options: UIViewAnimationOptions = interactive ? .curveLinear : UIViewAnimationOptions()
|
||||
UIView.animate(withDuration: duration, delay: 0, options: options, animations: { () -> Void in
|
||||
if self.presenting {
|
||||
SideMenuTransition.presentMenuStart() // onstage items: slide in
|
||||
SideMenuTransition.presentMenuStart()
|
||||
} else {
|
||||
SideMenuTransition.hideMenuStart()
|
||||
}
|
||||
menuView?.isUserInteractionEnabled = false
|
||||
}) { (finished) -> Void in
|
||||
|
||||
container.isUserInteractionEnabled = true
|
||||
|
||||
// tell our transitionContext object that we've finished animating
|
||||
if transitionContext.transitionWasCancelled {
|
||||
let viewControllerForPresentedMenu = SideMenuTransition.viewControllerForPresentedMenu
|
||||
@@ -375,7 +384,6 @@ open class SideMenuTransition: UIPercentDrivenInteractiveTransition, UIViewContr
|
||||
} else {
|
||||
SideMenuTransition.presentMenuComplete()
|
||||
}
|
||||
menuView?.isUserInteractionEnabled = true
|
||||
|
||||
transitionContext.completeTransition(false)
|
||||
|
||||
@@ -389,13 +397,18 @@ open class SideMenuTransition: UIPercentDrivenInteractiveTransition, UIViewContr
|
||||
|
||||
if self.presenting {
|
||||
SideMenuTransition.presentMenuComplete()
|
||||
menuView?.isUserInteractionEnabled = true
|
||||
if !SideMenuManager.menuPresentingViewControllerUserInteractionEnabled {
|
||||
let tapView = UIView()
|
||||
topView.addSubview(tapView)
|
||||
tapView.frame = topView.bounds
|
||||
SideMenuTransition.tapView = tapView
|
||||
}
|
||||
transitionContext.completeTransition(true)
|
||||
switch SideMenuManager.menuPresentMode {
|
||||
case .viewSlideOut, .viewSlideInOut:
|
||||
container.addSubview(topView!)
|
||||
container.addSubview(topView)
|
||||
case .menuSlideIn, .menuDissolveIn:
|
||||
container.insertSubview(topView!, at: 0)
|
||||
container.insertSubview(topView, at: 0)
|
||||
}
|
||||
if let statusBarView = SideMenuTransition.statusBarView {
|
||||
container.bringSubview(toFront: statusBarView)
|
||||
@@ -406,7 +419,7 @@ open class SideMenuTransition: UIPercentDrivenInteractiveTransition, UIViewContr
|
||||
|
||||
SideMenuTransition.hideMenuComplete()
|
||||
transitionContext.completeTransition(true)
|
||||
menuView?.removeFromSuperview()
|
||||
menuView.removeFromSuperview()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -8,7 +8,7 @@
|
||||
|
||||
Pod::Spec.new do |s|
|
||||
s.name = "SideMenu"
|
||||
s.version = "2.1.3"
|
||||
s.version = "2.1.5"
|
||||
s.summary = "Simple side menu control for iOS in Swift inspired by Facebook. Right and Left sides. No coding required."
|
||||
|
||||
# This description is used to generate tags and improve search results.
|
||||
|
||||
Reference in New Issue
Block a user