Compare commits

..

62 Commits

Author SHA1 Message Date
jonkykong fb25017bc7 Updated podspec 2019-10-31 17:37:16 -07:00
jonkykong 1841827ef9 Fix for interactive regression 2019-10-30 11:36:40 -07:00
jonkykong a5852d8fd0 Refactor 2019-10-30 11:36:15 -07:00
jonkykong 3e4e829ce0 Updated podspec 2019-10-27 23:59:58 -07:00
jonkykong 43d1768175 Fix for in-call status bar height on iOS 12 and lower. 2019-10-27 16:10:21 -07:00
jonkykong 8ecc8ab441 Refactor to move view hierarchy logic out of the presentation controller and into the animation controller. Not moving it to the transition controller since it needs to happen before the animation is fully completed. 2019-10-27 16:09:54 -07:00
jonkykong 4b01b0f874 Update cocoapods and project settings 2019-10-27 16:01:40 -07:00
jonkykong 6b7de92136 Refactor 2019-10-27 16:01:18 -07:00
jonkykong f3c4a22931 Refactor 2019-10-16 23:07:03 -07:00
jonkykong 46c40f081a Refactor 2019-10-16 23:04:45 -07:00
jonkykong 3659e868be Refactor 2019-10-16 22:59:28 -07:00
jonkykong 4e7a35f0b8 Updated cocoapods 2019-10-16 22:56:13 -07:00
jonkykong 082813937e Updated podspec 2019-10-10 21:13:00 -07:00
jonkykong 538e84a26d Updated tests 2019-10-10 21:10:55 -07:00
jonkykong 17b8fcd413 Updated podspec 2019-09-29 13:06:08 -07:00
jonkykong 64f9d0bfbd Bug fix 2019-09-29 13:05:56 -07:00
jonkykong 8dde1951c3 Updated podspec 2019-09-26 01:16:30 -07:00
jonkykong 7d15070513 Scope adjustment 2019-09-26 01:16:14 -07:00
jonkykong b76a39208e Merge branch 'master' of https://github.com/jonkykong/SideMenu
* 'master' of https://github.com/jonkykong/SideMenu:
  Update README.md
2019-09-26 01:15:54 -07:00
Jon Kent 2c496c3c56 Update README.md 2019-09-25 02:17:29 -07:00
jonkykong 37071b5d06 Updated podspec 2019-09-24 22:38:42 -07:00
jonkykong 607260ac2e Fix for view controller views now being clipped causing shadows not to work. 2019-09-24 22:38:27 -07:00
jonkykong 9f3759c90c Updated podspec 2019-09-24 03:07:11 -07:00
jonkykong c346f2e0db Minor refactor 2019-09-24 03:06:02 -07:00
jonkykong 6c72727408 iOS 13 support 2019-09-24 03:05:48 -07:00
jonkykong b649404a7e Refactor 2019-09-21 23:34:26 -07:00
jonkykong 3272a0f63e Refactor 2019-09-21 18:03:30 -07:00
jonkykong 70fa815037 Refactor 2019-09-21 18:03:09 -07:00
jonkykong 794767455a Updated podspec 2019-09-19 00:26:03 -07:00
Matteo Piccina 7359ee6801 Update Package.swift 2019-09-15 15:10:29 +02:00
jonkykong 0b62749bff Updated podspec 2019-09-13 01:49:20 -07:00
Jon Kent 7179713c18 Update README.md 2019-09-13 01:37:51 -07:00
Jon Kent 60f6f204c1 Update README.md 2019-09-13 01:27:26 -07:00
jonkykong 98c5b2b3e3 Updated podspec 2019-09-13 01:12:00 -07:00
jonkykong e8882a952d Reverting swift 4.2 changes. 2019-09-13 01:11:46 -07:00
jonkykong efc2e11fb2 Refactor 2019-09-13 01:10:51 -07:00
jonkykong 36662fa0f3 Merge branch 'pr/540' into 6.2.9
* pr/540:
  Fix File Reference to SideMenu.h
2019-09-13 00:58:08 -07:00
Alex Leeds dce89eb448 Fix File Reference to SideMenu.h 2019-09-11 10:41:21 -04:00
Rafael Francisco 32f1101e86 Fixed notification names 2019-09-10 14:17:50 +01:00
Rafael Francisco d25de76a92 Added SwiftPM support 2019-09-06 15:24:53 +01:00
jonkykong 59faed8ef9 Update podspec 2019-09-06 03:02:08 -07:00
jonkykong 4f990e86a8 Fix and refactor 2019-09-06 03:01:51 -07:00
jonkykong 8200e0d49f correction 2019-09-06 00:09:05 -07:00
jonkykong 5bb2f86b0a Updated podspec 2019-09-06 00:05:52 -07:00
jonkykong c591059fbe Crash fix 2019-09-06 00:05:39 -07:00
jonkykong cf6ec23a7f File structure reorganization 2019-09-05 02:28:46 -07:00
jonkykong 21a7347079 Refactor 2019-09-05 02:18:08 -07:00
jonkykong fc593b0cb7 Cleanup 2019-09-05 02:13:13 -07:00
jonkykong 55bfef578c Cleanup 2019-09-05 02:07:49 -07:00
jonkykong 620b248799 Cleanup 2019-09-05 02:04:47 -07:00
jonkykong 279ba484d3 Fix build issues 2019-09-05 02:01:17 -07:00
jonkykong c46745cef8 Refactor 2019-09-04 23:42:02 -07:00
jonkykong 8cc163dc5f Updated podspec 2019-09-04 23:36:33 -07:00
jonkykong fae34995ab Refactoring 2019-09-04 23:31:08 -07:00
jonkykong 90878cc0d5 Updated podspec 2019-09-04 01:42:39 -07:00
jonkykong 3f78b9bb49 Refactor 2019-09-04 01:40:44 -07:00
Jon Kent 6f8f224e00 Update README.md 2019-08-28 17:28:58 -07:00
jonkykong bc37f1b9cb Updated podspec 2019-08-25 21:07:17 -07:00
jonkykong 8aff2b3627 Merge tag '6.2.3' into 6.2.4
* tag '6.2.3':
  Updated podspec
  Propagate configured onTopShadowOffset to layer
2019-08-25 21:06:55 -07:00
jonkykong 135a3d2a94 Updated podspec 2019-08-20 23:15:01 -07:00
Marius Rackwitz a10b94e351 Propagate configured onTopShadowOffset to layer 2019-08-20 12:50:25 +02:00
Artur Azarau e1bf7c4991 delegate was made public 2019-08-19 14:08:54 +03:00
29 changed files with 1063 additions and 855 deletions
+62 -62
View File
@@ -1,11 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="yAA-s6-Bam">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="15400" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="yAA-s6-Bam">
<device id="retina4_7" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14490.49"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15404"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
@@ -15,7 +13,7 @@
<objects>
<navigationController id="yAA-s6-Bam" sceneMemberID="viewController">
<navigationBar key="navigationBar" contentMode="scaleToFill" barStyle="black" id="Bue-4e-bCJ">
<rect key="frame" x="0.0" y="20" width="375" height="44"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<gestureRecognizers/>
<color key="tintColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
@@ -38,10 +36,10 @@
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="LFJ-SB-Zp9">
<rect key="frame" x="0.0" y="64" width="375" height="571"/>
<rect key="frame" x="0.0" y="44" width="375" height="591"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="iBe-qv-i0y">
<rect key="frame" x="20" y="20" width="335" height="675"/>
<rect key="frame" x="20" y="20" width="335" height="681"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Menu Presentation Style" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Efp-5L-qft">
<rect key="frame" x="0.0" y="0.0" width="335" height="20.5"/>
@@ -50,7 +48,7 @@
<nil key="highlightedColor"/>
</label>
<segmentedControl opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" selectedSegmentIndex="1" translatesAutoresizingMaskIntoConstraints="NO" id="KV2-tN-Aff">
<rect key="frame" x="0.0" y="28.5" width="335" height="29"/>
<rect key="frame" x="0.0" y="28.5" width="335" height="32"/>
<segments>
<segment title="Slide In"/>
<segment title="Slide Out"/>
@@ -62,19 +60,19 @@
</connections>
</segmentedControl>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="wsl-iY-a5K">
<rect key="frame" x="0.0" y="64.5" width="335" height="4"/>
<rect key="frame" x="0.0" y="67.5" width="335" height="4"/>
<constraints>
<constraint firstAttribute="height" constant="4" id="oRw-Gi-ezT"/>
</constraints>
</view>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Menu Blur Style" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="OHe-SA-S0e">
<rect key="frame" x="0.0" y="76.5" width="335" height="20.5"/>
<rect key="frame" x="0.0" y="79.5" width="335" height="20.5"/>
<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>
<segmentedControl opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" translatesAutoresizingMaskIntoConstraints="NO" id="owH-AA-wgw">
<rect key="frame" x="0.0" y="105" width="335" height="29"/>
<rect key="frame" x="0.0" y="108" width="335" height="32"/>
<segments>
<segment title="None"/>
<segment title="Dark"/>
@@ -86,121 +84,121 @@
</connections>
</segmentedControl>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="svy-p5-tiL">
<rect key="frame" x="0.0" y="141" width="335" height="4"/>
<rect key="frame" x="0.0" y="147" width="335" height="4"/>
<constraints>
<constraint firstAttribute="height" constant="4" id="wra-S3-qWU"/>
</constraints>
</view>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Menu Start Alpha" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="tRs-iN-9Ht">
<rect key="frame" x="0.0" y="153" width="335" height="20.5"/>
<rect key="frame" x="0.0" y="159" width="335" height="20.5"/>
<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>
<slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="pqT-4M-nw1">
<rect key="frame" x="-2" y="181.5" width="339" height="31"/>
<rect key="frame" x="-2" y="187.5" width="339" height="31"/>
<color key="thumbTintColor" red="0.25098040700000002" green="0.0" blue="0.50196081400000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<connections>
<action selector="changeControl:" destination="QHN-nZ-kbB" eventType="valueChanged" id="Rfw-ZT-ziI"/>
</connections>
</slider>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="r3M-VQ-eCj">
<rect key="frame" x="0.0" y="219.5" width="335" height="4"/>
<rect key="frame" x="0.0" y="225.5" width="335" height="4"/>
<constraints>
<constraint firstAttribute="height" constant="4" id="RvV-Fo-ext"/>
</constraints>
</view>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Presenting End Alpha" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="NmN-uG-ABp">
<rect key="frame" x="0.0" y="231.5" width="335" height="20.5"/>
<rect key="frame" x="0.0" y="237.5" width="335" height="20.5"/>
<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>
<slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="xlA-NK-mN4">
<rect key="frame" x="-2" y="260" width="339" height="31"/>
<rect key="frame" x="-2" y="266" width="339" height="31"/>
<color key="thumbTintColor" red="0.25098040700000002" green="0.0" blue="0.50196081400000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<connections>
<action selector="changeControl:" destination="QHN-nZ-kbB" eventType="valueChanged" id="ah6-OO-Zh9"/>
</connections>
</slider>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="bjn-LU-15M">
<rect key="frame" x="0.0" y="298" width="335" height="4"/>
<rect key="frame" x="0.0" y="304" width="335" height="4"/>
<constraints>
<constraint firstAttribute="height" constant="4" id="jLL-oP-eBj"/>
</constraints>
</view>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Menu Shadow Opacity" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="2QC-6F-Xpx">
<rect key="frame" x="0.0" y="310" width="335" height="20.5"/>
<rect key="frame" x="0.0" y="316" width="335" height="20.5"/>
<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>
<slider opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="Osf-2d-Znm">
<rect key="frame" x="-2" y="338.5" width="339" height="31"/>
<rect key="frame" x="-2" y="344.5" width="339" height="31"/>
<color key="thumbTintColor" red="0.25098040700000002" green="0.0" blue="0.50196081400000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<connections>
<action selector="changeControl:" destination="QHN-nZ-kbB" eventType="valueChanged" id="Vw7-lT-kal"/>
</connections>
</slider>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="cKX-Y9-C8e">
<rect key="frame" x="0.0" y="376.5" width="335" height="4"/>
<rect key="frame" x="0.0" y="382.5" width="335" height="4"/>
<constraints>
<constraint firstAttribute="height" constant="4" id="6m5-zX-BY6"/>
</constraints>
</view>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Menu Screen Width" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Snj-Mg-6ww">
<rect key="frame" x="0.0" y="388.5" width="335" height="20.5"/>
<rect key="frame" x="0.0" y="394.5" width="335" height="20.5"/>
<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>
<slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="Cor-r1-osR">
<rect key="frame" x="-2" y="417" width="339" height="31"/>
<rect key="frame" x="-2" y="423" width="339" height="31"/>
<color key="thumbTintColor" red="0.25098040700000002" green="0.0" blue="0.50196081400000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<connections>
<action selector="changeControl:" destination="QHN-nZ-kbB" eventType="valueChanged" id="QfP-ZL-gGs"/>
</connections>
</slider>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="03z-3b-0TF">
<rect key="frame" x="0.0" y="455" width="335" height="4"/>
<rect key="frame" x="0.0" y="461" width="335" height="4"/>
<constraints>
<constraint firstAttribute="height" constant="4" id="Kf2-9J-fIV"/>
</constraints>
</view>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Menu Scale Factor" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Tsg-30-YHs">
<rect key="frame" x="0.0" y="467" width="335" height="20.5"/>
<rect key="frame" x="0.0" y="473" width="335" height="20.5"/>
<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>
<slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="0.001" minValue="0.001" maxValue="2" translatesAutoresizingMaskIntoConstraints="NO" id="Xp9-C5-Td1">
<rect key="frame" x="-2" y="495.5" width="339" height="31"/>
<rect key="frame" x="-2" y="501.5" width="339" height="31"/>
<color key="thumbTintColor" red="0.25098040700000002" green="0.0" blue="0.50196081400000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<connections>
<action selector="changeControl:" destination="QHN-nZ-kbB" eventType="valueChanged" id="lNd-9Z-lpP"/>
</connections>
</slider>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="FrH-kR-j43">
<rect key="frame" x="0.0" y="533.5" width="335" height="4"/>
<rect key="frame" x="0.0" y="539.5" width="335" height="4"/>
<constraints>
<constraint firstAttribute="height" constant="4" id="9kG-hd-eZS"/>
</constraints>
</view>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Presenting Scale Factor" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="j7p-7c-wlI">
<rect key="frame" x="0.0" y="545.5" width="335" height="20.5"/>
<rect key="frame" x="0.0" y="551.5" width="335" height="20.5"/>
<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>
<slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="0.001" minValue="0.001" maxValue="2" translatesAutoresizingMaskIntoConstraints="NO" id="Oso-tQ-0MO">
<rect key="frame" x="-2" y="574" width="339" height="31"/>
<rect key="frame" x="-2" y="580" width="339" height="31"/>
<color key="thumbTintColor" red="0.25098040700000002" green="0.0" blue="0.50196081400000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<connections>
<action selector="changeControl:" destination="QHN-nZ-kbB" eventType="valueChanged" id="TuI-Au-hWY"/>
</connections>
</slider>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="DMn-tw-NTB">
<rect key="frame" x="0.0" y="612" width="335" height="63"/>
<rect key="frame" x="0.0" y="618" width="335" height="63"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Menu Fade Status Bar" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Gtc-KE-FIO">
<rect key="frame" x="0.0" y="17.5" width="168.5" height="20.5"/>
@@ -236,7 +234,7 @@
</constraints>
</scrollView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="← Swipe Screen Edges in View →" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ma4-O6-wOT">
<rect key="frame" x="87.5" y="643" width="200.5" height="16"/>
<rect key="frame" x="87" y="643" width="201.5" height="16"/>
<fontDescription key="fontDescription" style="UICTFontTextStyleFootnote"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
@@ -294,6 +292,7 @@
<navigationController storyboardIdentifier="LeftMenuNavigationController" navigationBarHidden="YES" id="DuX-EW-0mP" customClass="SideMenuNavigationController" customModule="SideMenu" sceneMemberID="viewController">
<navigationItem key="navigationItem" id="ipz-Lx-Wgf"/>
<navigationBar key="navigationBar" contentMode="scaleToFill" id="35F-wh-r6h">
<rect key="frame" x="0.0" y="-20" width="0.0" height="0.0"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<userDefinedRuntimeAttributes>
@@ -312,13 +311,13 @@
<objects>
<tableViewController id="V6g-oO-Tbm" customClass="SideMenuTableViewController" customModule="Example" customModuleProvider="target" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" scrollEnabled="NO" dataMode="static" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="28" sectionFooterHeight="28" id="Dqh-bs-m2M">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="647"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<color key="tintColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<inset key="separatorInset" minX="15" minY="0.0" maxX="8" maxY="0.0"/>
<view key="tableFooterView" contentMode="scaleToFill" id="vVB-ag-TnU">
<rect key="frame" x="0.0" y="132" width="375" height="0.0"/>
<rect key="frame" x="0.0" y="188" width="375" height="0.0"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</view>
@@ -326,14 +325,14 @@
<tableViewSection id="gP8-eA-dcW">
<cells>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" textLabel="4WI-Ed-3Gr" style="IBUITableViewCellStyleDefault" id="7tx-O6-zAs" customClass="UITableViewVibrantCell" customModule="SideMenu">
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<rect key="frame" x="0.0" y="28" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="7tx-O6-zAs" id="K0u-J2-Ab7">
<rect key="frame" x="0.0" y="0.0" width="375" height="43.5"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Push View Controller 1" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="4WI-Ed-3Gr">
<rect key="frame" x="15" y="0.0" width="344" height="43.5"/>
<rect key="frame" x="16" y="0.0" width="343" height="44"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="16"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
@@ -347,14 +346,14 @@
</connections>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" textLabel="DpJ-hV-lmw" style="IBUITableViewCellStyleDefault" id="f9Q-QP-TZ6" customClass="UITableViewVibrantCell" customModule="SideMenu">
<rect key="frame" x="0.0" y="44" width="375" height="44"/>
<rect key="frame" x="0.0" y="72" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="f9Q-QP-TZ6" id="i3p-Ya-AvO">
<rect key="frame" x="0.0" y="0.0" width="375" height="43.5"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Push View Controller 2" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="DpJ-hV-lmw">
<rect key="frame" x="15" y="0.0" width="344" height="43.5"/>
<rect key="frame" x="16" y="0.0" width="343" height="44"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="16"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
@@ -368,14 +367,14 @@
</connections>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" textLabel="mAf-mx-C48" style="IBUITableViewCellStyleDefault" id="dc6-l8-0cu" customClass="UITableViewVibrantCell" customModule="SideMenu">
<rect key="frame" x="0.0" y="88" width="375" height="44"/>
<rect key="frame" x="0.0" y="116" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="dc6-l8-0cu" id="gyo-JQ-fx5">
<rect key="frame" x="0.0" y="0.0" width="375" height="43.5"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Push View Controller 3" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="mAf-mx-C48">
<rect key="frame" x="15" y="0.0" width="344" height="43.5"/>
<rect key="frame" x="16" y="0.0" width="343" height="44"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="16"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
@@ -407,7 +406,7 @@
<objects>
<viewController id="BYZ-38-t0r" customClass="PresentedViewController" customModule="Example" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="647"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" red="0.80000001190000003" green="1" blue="0.40000000600000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<viewLayoutGuide key="safeArea" id="tWG-DO-ZIZ"/>
@@ -425,6 +424,7 @@
<objects>
<navigationController storyboardIdentifier="RightMenuNavigationController" navigationBarHidden="YES" id="z7k-fk-pfc" customClass="SideMenuNavigationController" customModule="SideMenu" sceneMemberID="viewController">
<navigationBar key="navigationBar" contentMode="scaleToFill" id="qOd-yQ-2i8">
<rect key="frame" x="0.0" y="-20" width="0.0" height="0.0"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<connections>
@@ -440,12 +440,12 @@
<objects>
<tableViewController id="Ol4-YR-KUL" customClass="SideMenuTableViewController" customModule="Example" customModuleProvider="target" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" scrollEnabled="NO" dataMode="static" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="28" sectionFooterHeight="28" id="49z-eA-JB7">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="647"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
<inset key="separatorInset" minX="0.0" minY="0.0" maxX="15" maxY="0.0"/>
<view key="tableFooterView" contentMode="scaleToFill" id="UXT-t2-k90">
<rect key="frame" x="0.0" y="132" width="375" height="0.0"/>
<rect key="frame" x="0.0" y="188" width="375" height="0.0"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</view>
@@ -453,14 +453,14 @@
<tableViewSection id="xTE-WH-UeX">
<cells>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" textLabel="NLA-8t-ufi" style="IBUITableViewCellStyleDefault" id="8Ng-b4-4hH" customClass="UITableViewVibrantCell" customModule="SideMenu">
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<rect key="frame" x="0.0" y="28" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="8Ng-b4-4hH" id="U5K-l9-XWv">
<rect key="frame" x="0.0" y="0.0" width="375" height="43.5"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Present View Controller 1" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="NLA-8t-ufi">
<rect key="frame" x="15" y="0.0" width="344" height="43.5"/>
<rect key="frame" x="16" y="0.0" width="343" height="44"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="16"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
@@ -470,18 +470,18 @@
</tableViewCellContentView>
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
<connections>
<segue destination="uMV-sw-TbB" kind="presentation" id="7VM-K4-IQ0"/>
<segue destination="uMV-sw-TbB" kind="presentation" modalPresentationStyle="fullScreen" id="7VM-K4-IQ0"/>
</connections>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" textLabel="IdU-2D-zHb" style="IBUITableViewCellStyleDefault" id="Eok-gX-LwQ" customClass="UITableViewVibrantCell" customModule="SideMenu">
<rect key="frame" x="0.0" y="44" width="375" height="44"/>
<rect key="frame" x="0.0" y="72" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Eok-gX-LwQ" id="IOJ-bC-bNt">
<rect key="frame" x="0.0" y="0.0" width="375" height="43.5"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Present View Controller 2" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="IdU-2D-zHb">
<rect key="frame" x="15" y="0.0" width="344" height="43.5"/>
<rect key="frame" x="16" y="0.0" width="343" height="44"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="16"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
@@ -495,14 +495,14 @@
</connections>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" textLabel="6x7-O7-DkG" style="IBUITableViewCellStyleDefault" id="41i-KK-YM3" customClass="UITableViewVibrantCell" customModule="SideMenu">
<rect key="frame" x="0.0" y="88" width="375" height="44"/>
<rect key="frame" x="0.0" y="116" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="41i-KK-YM3" id="629-G3-Agl">
<rect key="frame" x="0.0" y="0.0" width="375" height="43.5"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Present View Controller 3" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="6x7-O7-DkG">
<rect key="frame" x="15" y="0.0" width="344" height="43.5"/>
<rect key="frame" x="16" y="0.0" width="343" height="44"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="16"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
@@ -573,11 +573,11 @@
<objects>
<viewController id="Upx-FH-Mbv" customClass="PresentedViewController" customModule="Example" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="efR-Hd-Gxy">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="647"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="cKk-fD-whk">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="647"/>
<state key="normal" title="Dismiss">
<color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
@@ -612,11 +612,11 @@
<objects>
<viewController id="EG7-2X-5hP" customClass="PresentedViewController" customModule="Example" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="vac-ts-bf9">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="647"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="a17-pq-WAQ">
<rect key="frame" x="0.0" y="20" width="375" height="647"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="647"/>
<state key="normal" title="Dismiss">
<color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
@@ -651,7 +651,7 @@
<objects>
<viewController id="u7M-mb-V6o" customClass="PresentedViewController" customModule="Example" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="9Dr-7n-COJ">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="647"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" red="1" green="0.80000001190000003" blue="0.40000000600000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<viewLayoutGuide key="safeArea" id="hUi-v8-7VE"/>
@@ -669,7 +669,7 @@
<objects>
<viewController id="b5t-IX-0yu" customClass="PresentedViewController" customModule="Example" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="Ias-bH-Sau">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="647"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" red="1" green="0.40000000600000002" blue="0.40000000600000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<viewLayoutGuide key="safeArea" id="bHF-BB-8F0"/>
@@ -6,7 +6,6 @@
// Copyright © 2016 CocoaPods. All rights reserved.
//
import Foundation
import SideMenu
class SideMenuTableViewController: UITableViewController {
+5 -9
View File
@@ -17,9 +17,6 @@ class ExampleTests: XCTestCase {
private var mainViewController: XCUIElement {
return app.navigationBars[swipeHere]
}
private var mainViewControllerNavigation: XCUIElement {
return mainViewController.otherElements[swipeHere]
}
override func setUp() {
// Put setup code here. This method is called before the invocation of each test method in the class.
@@ -55,19 +52,18 @@ class ExampleTests: XCTestCase {
mainViewController.buttons["Right Menu"].tap()
app.tables/*@START_MENU_TOKEN@*/.staticTexts["Present View Controller 1"]/*[[".cells.staticTexts[\"Present View Controller 1\"]",".staticTexts[\"Present View Controller 1\"]"],[[[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/.tap()
app.buttons["Dismiss"].tap()
mainViewController.tap()
validate()
}
}
func testSwiping() {
mainViewControllerNavigation.swipeRight()
let element = app.children(matching: .window).element(boundBy: 0).children(matching: .other).element
element.swipeLeft()
mainViewController.swipeRight()
mainViewController.swipeLeft()
validate()
element.swipeLeft()
mainViewControllerNavigation.swipeLeft()
element.swipeRight()
mainViewController.swipeLeft()
mainViewController.swipeRight()
validate()
}
+17
View File
@@ -0,0 +1,17 @@
// swift-tools-version:5.0
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "SideMenu",
products: [
.library(name: "SideMenu", targets: ["SideMenu"])
],
dependencies: [],
targets: [
.target(name: "SideMenu", path: "Pod/Classes")
],
swiftLanguageVersions: [.v4_2, .v5]
)
+2
View File
@@ -5,6 +5,8 @@
// Created by Jon Kent on 7/3/19.
//
import UIKit
// Deprecations; to be removed at a future date.
extension SideMenuManager {
+39 -7
View File
@@ -5,22 +5,22 @@
// Created by Jon Kent on 7/1/19.
//
import Foundation
import UIKit
extension NSObject: InitializableClass {}
internal extension UIView {
@discardableResult func untransformed(_ block: () -> CGFloat) -> CGFloat {
let transform = self.transform
self.transform = .identity
let t = transform
transform = .identity
let value = block()
self.transform = transform
transform = t
return value
}
func bringToFront() {
self.superview?.bringSubviewToFront(self)
superview?.bringSubviewToFront(self)
}
func untransform(_ block: () -> Void) {
@@ -29,23 +29,44 @@ internal extension UIView {
return 0
}
}
static func animationsEnabled(_ enabled: Bool = true, _ block: () -> Void) {
let a = areAnimationsEnabled
setAnimationsEnabled(enabled)
block()
setAnimationsEnabled(a)
}
}
internal extension UIViewController {
// View controller actively displayed in that layer. It may not be visible if it's presenting another view controller.
var activeViewController: UIViewController {
switch self {
case let navigationController as UINavigationController:
return navigationController.visibleViewController?.activeViewController ?? self
return navigationController.topViewController?.activeViewController ?? self
case let tabBarController as UITabBarController:
return tabBarController.selectedViewController?.activeViewController ?? self
case let splitViewController as UISplitViewController:
return splitViewController.viewControllers.last?.activeViewController ?? self
default:
return presentedViewController?.activeViewController ?? self
return self
}
}
// View controller being displayed on screen to the user.
var topMostViewController: UIViewController {
let activeViewController = self.activeViewController
return activeViewController.presentedViewController?.topMostViewController ?? activeViewController
}
var containerViewController: UIViewController {
return navigationController?.containerViewController ??
tabBarController?.containerViewController ??
splitViewController?.containerViewController ??
self
}
@objc var isHidden: Bool {
return presentingViewController == nil
}
@@ -63,6 +84,10 @@ internal extension UIGestureRecognizer {
guard let view = view else { return nil }
self.init(addTo: view, target: target, action: action)
}
func remove() {
view?.removeGestureRecognizer(self)
}
}
internal extension UIPanGestureRecognizer {
@@ -83,3 +108,10 @@ internal extension UIPanGestureRecognizer {
} ?? 0
}
}
internal extension UIApplication {
var keyWindow: UIWindow? {
return UIApplication.shared.windows.filter { $0.isKeyWindow }.first
}
}
-75
View File
@@ -1,75 +0,0 @@
//
// Models.swift
// SideMenu
//
// Created by Jon Kent on 7/3/19.
//
import Foundation
internal protocol MenuModel: TransitionModel {
/// Prevents the same view controller (or a view controller of the same class) from being pushed more than once. Defaults to true.
var allowPushOfSameClassTwice: Bool { get }
/// Forces menus to always animate when appearing or disappearing, regardless of a pushed view controller's animation.
var alwaysAnimate: Bool { get }
/**
The blur effect style of the menu if the menu's root view controller is a UITableViewController or UICollectionViewController.
- Note: If you want cells in a UITableViewController menu to show vibrancy, make them a subclass of UITableViewVibrantCell.
*/
var blurEffectStyle: UIBlurEffect.Style? { get }
/// Animation curve of the remaining animation when the menu is partially dismissed with gestures. Default is .easeIn.
var completionCurve: UIView.AnimationCurve { get }
/// Automatically dismisses the menu when another view is presented from it.
var dismissOnPresent: Bool { get }
/// Automatically dismisses the menu when another view controller is pushed from it.
var dismissOnPush: Bool { get }
/// Automatically dismisses the menu when the screen is rotated.
var dismissOnRotation: Bool { get }
/// Automatically dismisses the menu when app goes to the background.
var dismissWhenBackgrounded: Bool { get }
/// Enable or disable a swipe gesture that dismisses the menu. Will not be triggered when `presentingViewControllerUserInteractionEnabled` is set to true. Default is true.
var enableSwipeToDismissGesture: Bool { get }
/// Enable or disable a tap gesture that dismisses the menu. Will not be triggered when `presentingViewControllerUserInteractionEnabled` is set to true. Default is true.
var enableTapToDismissGesture: Bool { get }
/**
The push style of the menu.
There are six modes in MenuPushStyle:
- defaultBehavior: The view controller is pushed onto the stack.
- popWhenPossible: If a view controller already in the stack is of the same class as the pushed view controller, the stack is instead popped back to the existing view controller. This behavior can help users from getting lost in a deep navigation stack.
- preserve: If a view controller already in the stack is of the same class as the pushed view controller, the existing view controller is pushed to the end of the stack. This behavior is similar to a UITabBarController.
- preserveAndHideBackButton: Same as .preserve and back buttons are automatically hidden.
- replace: Any existing view controllers are released from the stack and replaced with the pushed view controller. Back buttons are automatically hidden. This behavior is ideal if view controllers require a lot of memory or their state doesn't need to be preserved..
- subMenu: Unlike all other behaviors that push using the menu's presentingViewController, this behavior pushes view controllers within the menu. Use this behavior if you want to display a sub menu.
*/
var pushStyle: SideMenuPushStyle { get }
}
internal protocol TransitionModel: PresentationModel {
/// The animation options when a menu is displayed. Ignored when displayed with a gesture.
var animationOptions: UIView.AnimationOptions { get }
/// Duration of the remaining animation when the menu is partially dismissed with gestures. Default is 0.35 seconds.
var completeGestureDuration: Double { get }
/// Duration of the animation when the menu is dismissed without gestures. Default is 0.35 seconds.
var dismissDuration: Double { get }
/// The animation initial spring velocity when a menu is displayed. Ignored when displayed with a gesture.
var initialSpringVelocity: CGFloat { get }
/// Duration of the animation when the menu is presented without gestures. Default is 0.35 seconds.
var presentDuration: Double { get }
/// The animation spring damping when a menu is displayed. Ignored when displayed with a gesture.
var usingSpringWithDamping: CGFloat { get }
}
internal protocol PresentationModel {
/// Draws `presentStyle.backgroundColor` behind the status bar. Default is 1.
var statusBarEndAlpha: CGFloat { get }
/// Enable or disable interaction with the presenting view controller while the menu is displayed. Enabling may make it difficult to dismiss the menu or cause exceptions if the user tries to present and already presented menu. `presentingViewControllerUseSnapshot` must also set to false. Default is false.
var presentingViewControllerUserInteractionEnabled: Bool { get }
/// Use a snapshot for the presenting vierw controller while the menu is displayed. Useful when layout changes occur during transitions. Not recommended for apps that support rotation. Default is false.
var presentingViewControllerUseSnapshot: Bool { get }
/// The presentation style of the menu.
var presentationStyle: SideMenuPresentationStyle { get }
/// Width of the menu when presented on screen, showing the existing view controller in the remaining space. Default is zero.
var menuWidth: CGFloat { get }
}
@@ -0,0 +1,232 @@
//
// SideMenuAnimationController.swift
// SideMenu
//
// Created by Jon Kent on 10/24/18.
//
import UIKit
internal protocol AnimationModel {
/// The animation options when a menu is displayed. Ignored when displayed with a gesture.
var animationOptions: UIView.AnimationOptions { get }
/// Duration of the remaining animation when the menu is partially dismissed with gestures. Default is 0.35 seconds.
var completeGestureDuration: Double { get }
/// Duration of the animation when the menu is dismissed without gestures. Default is 0.35 seconds.
var dismissDuration: Double { get }
/// The animation initial spring velocity when a menu is displayed. Ignored when displayed with a gesture.
var initialSpringVelocity: CGFloat { get }
/// Duration of the animation when the menu is presented without gestures. Default is 0.35 seconds.
var presentDuration: Double { get }
/// The animation spring damping when a menu is displayed. Ignored when displayed with a gesture.
var usingSpringWithDamping: CGFloat { get }
}
internal protocol SideMenuAnimationControllerDelegate: class {
func sideMenuAnimationController(_ animationController: SideMenuAnimationController, didDismiss viewController: UIViewController)
func sideMenuAnimationController(_ animationController: SideMenuAnimationController, didPresent viewController: UIViewController)
}
internal final class SideMenuAnimationController: NSObject, UIViewControllerAnimatedTransitioning {
typealias Model = AnimationModel & PresentationModel
private var config: Model
private weak var containerView: UIView?
private let leftSide: Bool
private weak var originalSuperview: UIView?
private var presentationController: SideMenuPresentationController!
private unowned var presentedViewController: UIViewController?
private unowned var presentingViewController: UIViewController?
weak var delegate: SideMenuAnimationControllerDelegate?
init(config: Model, leftSide: Bool, delegate: SideMenuAnimationControllerDelegate? = nil) {
self.config = config
self.leftSide = leftSide
self.delegate = delegate
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
guard
let presentedViewController = transitionContext.presentedViewController,
let presentingViewController = transitionContext.presentingViewController
else { return }
if transitionContext.isPresenting {
self.containerView = transitionContext.containerView
self.presentedViewController = presentedViewController
self.presentingViewController = presentingViewController
self.presentationController = SideMenuPresentationController(
config: config,
leftSide: leftSide,
presentedViewController: presentedViewController,
presentingViewController: presentingViewController,
containerView: transitionContext.containerView
)
}
transition(using: transitionContext)
}
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
guard let transitionContext = transitionContext else { return 0 }
return duration(presenting: transitionContext.isPresenting, interactive: transitionContext.isInteractive)
}
func animationEnded(_ transitionCompleted: Bool) {
guard let presentedViewController = presentedViewController else { return }
if presentedViewController.isHidden {
delegate?.sideMenuAnimationController(self, didDismiss: presentedViewController)
} else {
delegate?.sideMenuAnimationController(self, didPresent: presentedViewController)
}
}
func transition(presenting: Bool, animated: Bool = true, interactive: Bool = false, alongsideTransition: (() -> Void)? = nil, complete: Bool = true, completion: ((Bool) -> Void)? = nil) {
prepare(presenting: presenting)
transitionWillBegin(presenting: presenting)
transition(
presenting: presenting,
animated: animated,
interactive: interactive,
animations: { [weak self] in
guard let self = self else { return }
self.transition(presenting: presenting)
alongsideTransition?()
}, completion: { [weak self] _ in
guard let self = self else { return }
if complete {
self.transitionDidEnd(presenting: presenting, completed: true)
self.finish(presenting: presenting, completed: true)
}
completion?(true)
})
}
func layout() {
presentationController.containerViewWillLayoutSubviews()
}
}
private extension SideMenuAnimationController {
func duration(presenting: Bool, interactive: Bool) -> Double {
if interactive { return config.completeGestureDuration }
return presenting ? config.presentDuration : config.dismissDuration
}
func prepare(presenting: Bool) {
guard
presenting,
let presentingViewController = presentingViewController,
let presentedViewController = presentedViewController
else { return }
originalSuperview = presentingViewController.view.superview
containerView?.addSubview(presentingViewController.view)
containerView?.addSubview(presentedViewController.view)
}
func transitionWillBegin(presenting: Bool) {
// prevent any other menu gestures from firing
containerView?.isUserInteractionEnabled = false
if presenting {
presentationController.presentationTransitionWillBegin()
} else {
presentationController.dismissalTransitionWillBegin()
}
}
func transition(presenting: Bool) {
if presenting {
presentationController.presentationTransition()
} else {
presentationController.dismissalTransition()
}
}
func transitionDidEnd(presenting: Bool, completed: Bool) {
if presenting {
presentationController.presentationTransitionDidEnd(completed)
} else {
presentationController.dismissalTransitionDidEnd(completed)
}
containerView?.isUserInteractionEnabled = true
}
func finish(presenting: Bool, completed: Bool) {
guard
presenting != completed,
let presentingViewController = self.presentingViewController
else { return }
presentedViewController?.view.removeFromSuperview()
originalSuperview?.addSubview(presentingViewController.view)
}
func transition(using transitionContext: UIViewControllerContextTransitioning) {
prepare(presenting: transitionContext.isPresenting)
transitionWillBegin(presenting: transitionContext.isPresenting)
transition(
presenting: transitionContext.isPresenting,
animated: transitionContext.isAnimated,
interactive: transitionContext.isInteractive,
animations: { [weak self] in
guard let self = self else { return }
self.transition(presenting: transitionContext.isPresenting)
}, completion: { [weak self] _ in
guard let self = self else { return }
let completed = !transitionContext.transitionWasCancelled
self.transitionDidEnd(presenting: transitionContext.isPresenting, completed: completed)
self.finish(presenting: transitionContext.isPresenting, completed: completed)
// Called last. This causes the transition container to be removed and animationEnded() to be called.
transitionContext.completeTransition(completed)
})
}
func transition(presenting: Bool, animated: Bool = true, interactive: Bool = false, animations: @escaping (() -> Void) = {}, completion: @escaping ((Bool) -> Void) = { _ in }) {
if !animated {
animations()
completion(true)
return
}
let duration = self.duration(presenting: presenting, interactive: interactive)
if interactive {
// IMPORTANT: The non-interactive animation block will not complete if adapted for interactive. The below animation block must be used!
UIView.animate(
withDuration: duration,
delay: duration, // HACK: If zero, the animation briefly flashes in iOS 11.
options: .curveLinear,
animations: animations,
completion: completion
)
return
}
UIView.animate(
withDuration: duration,
delay: 0,
usingSpringWithDamping: config.usingSpringWithDamping,
initialSpringVelocity: config.initialSpringVelocity,
options: config.animationOptions,
animations: animations,
completion: completion
)
}
}
private extension UIViewControllerContextTransitioning {
var isPresenting: Bool {
return viewController(forKey: .from)?.presentedViewController === viewController(forKey: .to)
}
var presentingViewController: UIViewController? {
return viewController(forKey: isPresenting ? .from : .to)
}
var presentedViewController: UIViewController? {
return viewController(forKey: isPresenting ? .to : .from)
}
}
+11 -18
View File
@@ -7,10 +7,6 @@
import UIKit
internal protocol SideMenuInteractable {
func handle(state: SideMenuInteractionController.State)
}
internal final class SideMenuInteractionController: UIPercentDrivenInteractiveTransition {
enum State { case
@@ -44,20 +40,6 @@ internal final class SideMenuInteractionController: UIPercentDrivenInteractiveTr
guard !isCancelled && !isFinished else { return }
super.update(percentComplete)
}
}
private extension SideMenuInteractionController {
@objc func handleNotification(notification: NSNotification) {
switch notification.name {
case UIApplication.didEnterBackgroundNotification:
cancel()
default: break
}
}
}
extension SideMenuInteractionController: SideMenuInteractable {
func handle(state: State) {
switch state {
@@ -70,3 +52,14 @@ extension SideMenuInteractionController: SideMenuInteractable {
}
}
}
private extension SideMenuInteractionController {
@objc func handleNotification(notification: NSNotification) {
switch notification.name {
case UIApplication.didEnterBackgroundNotification:
cancel()
default: break
}
}
}
+5 -7
View File
@@ -151,7 +151,6 @@ private extension SideMenuManager {
let width = activeMenu.menuWidth
let distance = gesture.xTranslation / width
switch (gesture.state) {
case .began: break
case .changed:
if gesture.canSwitch {
switching = (distance > 0 && !activeMenu.leftSide) || (distance < 0 && activeMenu.leftSide)
@@ -171,12 +170,11 @@ private extension SideMenuManager {
} else {
// not sure which way the user is swiping yet, so do nothing
if gesture.xTranslation == 0 { return }
leftSide = gesture.xTranslation > 0
}
guard let menu = menu(forLeftSide: leftSide) else { return }
menu.presentFrom(activeViewController, interactively: true)
menu.present(from: topMostViewController, interactively: true)
}
activeMenu?.handleMenuPan(gesture, true)
@@ -202,7 +200,7 @@ private extension SideMenuManager {
func addScreenEdgeGesture(to view: UIView, edge: UIRectEdge) -> UIScreenEdgePanGestureRecognizer {
if let screenEdgeGestureRecognizer = view.gestureRecognizers?.first(where: { $0 is SideMenuScreenEdgeGestureRecognizer }) as? SideMenuScreenEdgeGestureRecognizer,
screenEdgeGestureRecognizer.edges == edge {
view.removeGestureRecognizer(screenEdgeGestureRecognizer)
screenEdgeGestureRecognizer.remove()
}
return SideMenuScreenEdgeGestureRecognizer(addTo: view, target: self, action: #selector(handlePresentMenuScreenEdge(_:))).with {
$0.edges = edge
@@ -216,8 +214,8 @@ private extension SideMenuManager {
return SideMenuPanGestureRecognizer(addTo: view, target: self, action: #selector(handlePresentMenuPan(_:)))
}
var activeViewController: UIViewController? {
return UIApplication.shared.keyWindow?.rootViewController?.activeViewController
var topMostViewController: UIViewController? {
return UIApplication.shared.keyWindow?.rootViewController?.topMostViewController
}
}
@@ -226,6 +224,6 @@ extension SideMenuManager: SideMenuNavigationControllerTransitionDelegate {
internal func sideMenuTransitionDidDismiss(menu: Menu) {
defer { switching = false }
guard switching, let switchToMenu = self.menu(forLeftSide: !menu.leftSide) else { return }
switchToMenu.presentFrom(activeViewController, interactively: true)
switchToMenu.present(from: topMostViewController, interactively: true)
}
}
+118 -152
View File
@@ -14,6 +14,52 @@ import UIKit
preserveAndHideBackButton,
replace,
subMenu
internal var hidesBackButton: Bool {
switch self {
case .preserveAndHideBackButton, .replace: return true
case .default, .popWhenPossible, .preserve, .subMenu: return false
}
}
}
internal protocol MenuModel {
/// Prevents the same view controller (or a view controller of the same class) from being pushed more than once. Defaults to true.
var allowPushOfSameClassTwice: Bool { get }
/// Forces menus to always animate when appearing or disappearing, regardless of a pushed view controller's animation.
var alwaysAnimate: Bool { get }
/**
The blur effect style of the menu if the menu's root view controller is a UITableViewController or UICollectionViewController.
- Note: If you want cells in a UITableViewController menu to show vibrancy, make them a subclass of UITableViewVibrantCell.
*/
var blurEffectStyle: UIBlurEffect.Style? { get }
/// Animation curve of the remaining animation when the menu is partially dismissed with gestures. Default is .easeIn.
var completionCurve: UIView.AnimationCurve { get }
/// Automatically dismisses the menu when another view is presented from it.
var dismissOnPresent: Bool { get }
/// Automatically dismisses the menu when another view controller is pushed from it.
var dismissOnPush: Bool { get }
/// Automatically dismisses the menu when the screen is rotated.
var dismissOnRotation: Bool { get }
/// Automatically dismisses the menu when app goes to the background.
var dismissWhenBackgrounded: Bool { get }
/// Enable or disable a swipe gesture that dismisses the menu. Will not be triggered when `presentingViewControllerUserInteractionEnabled` is set to true. Default is true.
var enableSwipeToDismissGesture: Bool { get }
/// Enable or disable a tap gesture that dismisses the menu. Will not be triggered when `presentingViewControllerUserInteractionEnabled` is set to true. Default is true.
var enableTapToDismissGesture: Bool { get }
/**
The push style of the menu.
There are six modes in MenuPushStyle:
- defaultBehavior: The view controller is pushed onto the stack.
- popWhenPossible: If a view controller already in the stack is of the same class as the pushed view controller, the stack is instead popped back to the existing view controller. This behavior can help users from getting lost in a deep navigation stack.
- preserve: If a view controller already in the stack is of the same class as the pushed view controller, the existing view controller is pushed to the end of the stack. This behavior is similar to a UITabBarController.
- preserveAndHideBackButton: Same as .preserve and back buttons are automatically hidden.
- replace: Any existing view controllers are released from the stack and replaced with the pushed view controller. Back buttons are automatically hidden. This behavior is ideal if view controllers require a lot of memory or their state doesn't need to be preserved..
- subMenu: Unlike all other behaviors that push using the menu's presentingViewController, this behavior pushes view controllers within the menu. Use this behavior if you want to display a sub menu.
*/
var pushStyle: SideMenuPushStyle { get }
}
@objc public protocol SideMenuNavigationControllerDelegate {
@@ -27,7 +73,7 @@ internal protocol SideMenuNavigationControllerTransitionDelegate: class {
func sideMenuTransitionDidDismiss(menu: Menu)
}
public struct SideMenuSettings: MenuModel, InitializableStruct {
public struct SideMenuSettings: SideMenuNavigationController.Model, InitializableStruct {
public var allowPushOfSameClassTwice: Bool = true
public var alwaysAnimate: Bool = true
public var animationOptions: UIView.AnimationOptions = .curveEaseInOut
@@ -63,6 +109,8 @@ internal typealias Menu = SideMenuNavigationController
@objcMembers
open class SideMenuNavigationController: UINavigationController {
internal typealias Model = MenuModel & PresentationModel & AnimationModel
private lazy var _leftSide = Protected(false) { [weak self] oldValue, newValue in
guard self?.isHidden != false else {
Print.warning(.property, arguments: .leftSide, required: true)
@@ -73,14 +121,13 @@ open class SideMenuNavigationController: UINavigationController {
private weak var _sideMenuManager: SideMenuManager?
private weak var foundViewController: UIViewController?
private weak var interactionController: SideMenuInteractionController?
private var interactive: Bool = false
private var originalBackgroundColor: UIColor?
private var rotating: Bool = false
private var transitionController: SideMenuTransitionController?
private var transitionInteractive: Bool = false
/// Delegate for receiving appear and disappear related events. If `nil` the visible view controller that displays a `SideMenuNavigationController` automatically receives these events.
internal weak var sideMenuDelegate: SideMenuNavigationControllerDelegate?
public weak var sideMenuDelegate: SideMenuNavigationControllerDelegate?
/// The swipe to dismiss gesture.
open private(set) weak var swipeToDismissGesture: UIPanGestureRecognizer? = nil
@@ -105,10 +152,10 @@ open class SideMenuNavigationController: UINavigationController {
didSet {
setupBlur()
if !enableSwipeToDismissGesture {
removeSwipeGesture()
swipeToDismissGesture?.remove()
}
if !enableTapToDismissGesture {
removeTapGesture()
tapToDismissGesture?.remove()
}
}
}
@@ -119,8 +166,8 @@ open class SideMenuNavigationController: UINavigationController {
}
public init(rootViewController: UIViewController, settings: SideMenuSettings = SideMenuSettings()) {
super.init(rootViewController: rootViewController)
self.settings = settings
super.init(rootViewController: rootViewController)
setup()
}
@@ -165,9 +212,7 @@ open class SideMenuNavigationController: UINavigationController {
override open func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
defer {
activeDelegate?.sideMenuWillDisappear?(menu: self, animated: animated)
}
defer { activeDelegate?.sideMenuWillDisappear?(menu: self, animated: animated) }
guard !isBeingDismissed else { return }
@@ -197,7 +242,7 @@ open class SideMenuNavigationController: UINavigationController {
// the view hierarchy leaving the screen black/empty. This is because the transition moves views within a container
// view, but dismissing without animation removes the container view before the original hierarchy is restored.
// This check corrects that.
if let foundViewController = self.visibleViewController(from: presentingViewController), foundViewController.view.window == nil {
if isBeingDismissed {
transitionController?.transition(presenting: false, animated: false)
}
@@ -248,87 +293,51 @@ open class SideMenuNavigationController: UINavigationController {
}
override open func pushViewController(_ viewController: UIViewController, animated: Bool) {
guard viewControllers.count > 0 && pushStyle != .subMenu else {
guard viewControllers.count > 0 else {
// NOTE: pushViewController is called by init(rootViewController: UIViewController)
// so we must perform the normal super method in this case
return super.pushViewController(viewController, animated: animated)
}
let splitViewController = presentingViewController as? UISplitViewController
let tabBarController = presentingViewController as? UITabBarController
let potentialNavigationController = (splitViewController?.viewControllers.first ?? tabBarController?.selectedViewController) ?? presentingViewController
guard let navigationController = potentialNavigationController as? UINavigationController else {
return Print.warning(.cannotPush, arguments: String(describing: potentialNavigationController.self), required: true)
}
// To avoid overlapping dismiss & pop/push calls, create a transaction block where the menu
// is dismissed after showing the appropriate screen
CATransaction.begin()
defer { CATransaction.commit() }
var alongsideTransition: (() -> Void)? = nil
if dismissOnPush {
let animated = animated || alwaysAnimate
if animated {
let areAnimationsEnabled = UIView.areAnimationsEnabled
UIView.setAnimationsEnabled(true)
transitionController?.transition(presenting: false, animated: animated, alongsideTransition: { [weak self] in
guard let self = self else { return }
self.activeDelegate?.sideMenuWillDisappear?(menu: self, animated: animated)
}, completion: { [weak self] _ in
guard let self = self else { return }
self.activeDelegate?.sideMenuDidDisappear?(menu: self, animated: animated)
self.dismiss(animated: false, completion: nil)
self.foundViewController = nil
})
UIView.setAnimationsEnabled(areAnimationsEnabled)
alongsideTransition = { [weak self] in
guard let self = self else { return }
self.dismissAnimation(animated: animated || self.alwaysAnimate)
}
}
if let lastViewController = navigationController.viewControllers.last,
!allowPushOfSameClassTwice && type(of: lastViewController) == type(of: viewController) {
return
}
let pushed = SideMenuPushCoordinator(config:
.init(
allowPushOfSameClassTwice: allowPushOfSameClassTwice,
alongsideTransition: alongsideTransition,
animated: animated,
fromViewController: self,
pushStyle: pushStyle,
toViewController: viewController
)
).start()
switch pushStyle {
case .subMenu: return // handled earlier
case .default: break
case .popWhenPossible:
for subViewController in navigationController.viewControllers.reversed() {
if type(of: subViewController) == type(of: viewController) {
navigationController.popToViewController(subViewController, animated: animated)
return
}
}
case .preserve, .preserveAndHideBackButton:
var viewControllers = navigationController.viewControllers
let filtered = viewControllers.filter { preservedViewController in type(of: preservedViewController) == type(of: viewController) }
if let preservedViewController = filtered.last {
viewControllers = viewControllers.filter { subViewController in subViewController !== preservedViewController }
if pushStyle == .preserveAndHideBackButton {
preservedViewController.navigationItem.hidesBackButton = true
}
viewControllers.append(preservedViewController)
return navigationController.setViewControllers(viewControllers, animated: animated)
}
if pushStyle == .preserveAndHideBackButton {
viewController.navigationItem.hidesBackButton = true
}
case .replace:
viewController.navigationItem.hidesBackButton = true
return navigationController.setViewControllers([viewController], animated: animated)
if !pushed {
super.pushViewController(viewController, animated: animated)
}
navigationController.pushViewController(viewController, animated: animated)
}
override open var transitioningDelegate: UIViewControllerTransitioningDelegate? {
get { return self }
get {
guard transitionController == nil else { return transitionController }
transitionController = SideMenuTransitionController(leftSide: leftSide, config: settings)
transitionController?.delegate = self
transitionController?.interactive = transitionInteractive
transitionInteractive = false
return transitionController
}
set { Print.warning(.transitioningDelegate, required: true) }
}
}
// Interface
extension SideMenuNavigationController: MenuModel {
extension SideMenuNavigationController: SideMenuNavigationController.Model {
@IBInspectable open var allowPushOfSameClassTwice: Bool {
get { return settings.allowPushOfSameClassTwice }
@@ -452,46 +461,14 @@ extension SideMenuNavigationController: MenuModel {
}
}
// IMPORTANT: These methods must be declared open or they will not be called.
extension SideMenuNavigationController: UIViewControllerTransitioningDelegate {
open func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
transitionController = SideMenuTransitionController(
config: self,
leftSide: leftSide,
delegate: self)
return transitionController
}
open func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return transitionController
}
open func interactionControllerForPresentation(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? {
return interactionController(using: animator)
}
open func interactionControllerForDismissal(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? {
return interactionController(using: animator)
}
private func interactionController(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? {
guard interactive else { return nil }
interactive = false
let interactionController = SideMenuInteractionController(cancelWhenBackgrounded: dismissWhenBackgrounded, completionCurve: completionCurve)
self.interactionController = interactionController
return interactionController
}
}
extension SideMenuNavigationController: SideMenuTransitionControllerDelegate {
internal func sideMenuTransitionController(_ transitionController: SideMenuTransitionController, didDismiss viewController: UIViewController) {
func sideMenuTransitionController(_ transitionController: SideMenuTransitionController, didDismiss viewController: UIViewController) {
sideMenuManager.sideMenuTransitionDidDismiss(menu: self)
}
internal func sideMenuTransitionController(_ transitionController: SideMenuTransitionController, didPresent viewController: UIViewController) {
removeSwipeGesture()
func sideMenuTransitionController(_ transitionController: SideMenuTransitionController, didPresent viewController: UIViewController) {
swipeToDismissGesture?.remove()
swipeToDismissGesture = addSwipeToDismissGesture(to: view.superview)
tapToDismissGesture = addTapToDismissGesture(to: view.superview)
}
@@ -508,33 +485,33 @@ internal extension SideMenuNavigationController {
if !presenting {
dismissMenu(interactively: true)
}
interactionController?.handle(state: .update(progress: progress))
fallthrough
case .changed:
interactionController?.handle(state: .update(progress: progress))
transitionController?.handle(state: .update(progress: progress))
case .ended:
let velocity = gesture.xVelocity * factor(presenting)
let finished = velocity >= 100 || velocity >= -50 && abs(progress) >= 0.5
interactionController?.handle(state: finished ? .finish : .cancel)
transitionController?.handle(state: finished ? .finish : .cancel)
default:
interactionController?.handle(state: .cancel)
transitionController?.handle(state: .cancel)
}
}
func cancelMenuPan(_ gesture: UIPanGestureRecognizer) {
interactionController?.handle(state: .cancel)
transitionController?.handle(state: .cancel)
}
func dismissMenu(animated flag: Bool = true, interactively interactive: Bool = false, completion: (() -> Void)? = nil) {
func dismissMenu(animated flag: Bool = true, interactively: Bool = false, completion: (() -> Void)? = nil) {
guard !isHidden else { return }
self.interactive = interactive
transitionController?.interactive = interactively
dismiss(animated: flag, completion: completion)
}
// Note: although this method is syntactically reversed it allows the interactive property to scoped privately
func presentFrom(_ viewControllerToPresentFrom: UIViewController?, interactively interactive: Bool, completion: (() -> Void)? = nil) {
guard let viewControllerToPresentFrom = viewControllerToPresentFrom else { return }
self.interactive = interactive
viewControllerToPresentFrom.present(self, animated: true, completion: completion)
func present(from viewController: UIViewController?, interactively: Bool, completion: (() -> Void)? = nil) {
guard let viewController = viewController else { return }
transitionInteractive = interactively
viewController.present(self, animated: true, completion: completion)
}
}
@@ -542,35 +519,34 @@ private extension SideMenuNavigationController {
weak var activeDelegate: SideMenuNavigationControllerDelegate? {
guard !view.isHidden else { return nil }
if let sideMenuDelegate = sideMenuDelegate {
return sideMenuDelegate
}
return visibleViewController(from: presentingViewController) as? SideMenuNavigationControllerDelegate
if let sideMenuDelegate = sideMenuDelegate { return sideMenuDelegate }
return findViewController as? SideMenuNavigationControllerDelegate
}
func visibleViewController(from: UIViewController?) -> UIViewController? {
if let foundDelegate = foundViewController {
return foundDelegate
}
if let navigationController = from as? UINavigationController {
return visibleViewController(from: navigationController.topViewController)
}
if let tabBarController = from as? UITabBarController {
return visibleViewController(from: tabBarController.selectedViewController)
}
if let splitViewController = from as? UISplitViewController {
return visibleViewController(from: splitViewController.viewControllers.last)
}
var findViewController: UIViewController? {
foundViewController = foundViewController ?? presentingViewController?.activeViewController
return foundViewController
}
foundViewController = from
return from
func dismissAnimation(animated: Bool) {
transitionController?.transition(presenting: false, animated: animated, alongsideTransition: { [weak self] in
guard let self = self else { return }
self.activeDelegate?.sideMenuWillDisappear?(menu: self, animated: animated)
}, completion: { [weak self] _ in
guard let self = self else { return }
self.activeDelegate?.sideMenuDidDisappear?(menu: self, animated: animated)
self.dismiss(animated: false, completion: nil)
self.foundViewController = nil
})
}
func setup() {
modalPresentationStyle = .overFullScreen
setupBlur()
registerForNotifications()
if #available(iOS 13.0, *) {} else {
registerForNotifications()
}
}
func setupBlur() {
@@ -616,27 +592,17 @@ private extension SideMenuNavigationController {
}
}
func removeSwipeGesture() {
if let swipeToDismissGesture = swipeToDismissGesture {
swipeToDismissGesture.view?.removeGestureRecognizer(swipeToDismissGesture)
}
}
func removeTapGesture() {
if let tapToDismissGesture = tapToDismissGesture {
tapToDismissGesture.view?.removeGestureRecognizer(tapToDismissGesture)
}
}
@available(iOS, deprecated: 13.0)
func registerForNotifications() {
NotificationCenter.default.removeObserver(self)
[UIApplication.willChangeStatusBarFrameNotification,
UIApplication.didEnterBackgroundNotification].forEach {
UIApplication.didEnterBackgroundNotification].forEach {
NotificationCenter.default.addObserver(self, selector: #selector(handleNotification), name: $0, object: nil)
}
}
@available(iOS, deprecated: 13.0)
@objc func handleNotification(notification: NSNotification) {
guard isHidden else { return }
@@ -7,6 +7,19 @@
import UIKit
internal protocol PresentationModel {
/// Draws `presentStyle.backgroundColor` behind the status bar. Default is 1.
var statusBarEndAlpha: CGFloat { get }
/// Enable or disable interaction with the presenting view controller while the menu is displayed. Enabling may make it difficult to dismiss the menu or cause exceptions if the user tries to present and already presented menu. `presentingViewControllerUseSnapshot` must also set to false. Default is false.
var presentingViewControllerUserInteractionEnabled: Bool { get }
/// Use a snapshot for the presenting vierw controller while the menu is displayed. Useful when layout changes occur during transitions. Not recommended for apps that support rotation. Default is false.
var presentingViewControllerUseSnapshot: Bool { get }
/// The presentation style of the menu.
var presentationStyle: SideMenuPresentationStyle { get }
/// Width of the menu when presented on screen, showing the existing view controller in the remaining space. Default is zero.
var menuWidth: CGFloat { get }
}
internal protocol SideMenuPresentationControllerDelegate: class {
func sideMenuPresentationControllerDidTap(_ presentationController: SideMenuPresentationController)
func sideMenuPresentationController(_ presentationController: SideMenuPresentationController, didPanWith gesture: UIPanGestureRecognizer)
@@ -17,8 +30,8 @@ internal final class SideMenuPresentationController {
private let config: PresentationModel
private unowned var containerView: UIView
private var interactivePopGestureRecognizerEnabled: Bool?
private var clipsToBounds: Bool?
private let leftSide: Bool
private weak var originalSuperview: UIView?
private unowned var presentedViewController: UIViewController
private unowned var presentingViewController: UIViewController
@@ -59,32 +72,19 @@ internal final class SideMenuPresentationController {
dismissalTransitionDidEnd(true)
}
var frameOfPresentedViewInContainerView: CGRect {
var rect = containerView.frame
rect.origin.x = leftSide ? 0 : rect.width - config.menuWidth
rect.size.width = config.menuWidth
return rect
}
func containerViewWillLayoutSubviews() {
presentedViewController.view.untransform {
presentedViewController.view.frame = frameOfPresentedViewInContainerView
}
presentingViewController.view.untransform {
presentingViewController.view.frame = containerView.frame
snapshotView?.frame = containerView.frame
presentingViewController.view.frame = frameOfPresentingViewInContainerView
snapshotView?.frame = presentingViewController.view.bounds
}
guard let statusBarView = statusBarView else { return }
let statusBarOffset = containerView.frame.size.height - presentedViewController.view.bounds.height
var statusBarFrame = UIApplication.shared.statusBarFrame
// For in-call status bar, height is normally 40, which overlaps view. Instead, calculate height difference
// of view and set height to fill in remaining space.
if statusBarOffset >= CGFloat.ulpOfOne {
statusBarFrame.size.height = statusBarOffset
}
var statusBarFrame: CGRect = self.statusBarFrame
statusBarFrame.size.height -= containerView.frame.minY
statusBarView.frame = statusBarFrame
}
@@ -95,10 +95,6 @@ internal final class SideMenuPresentationController {
presentingViewController.view.isUserInteractionEnabled = config.presentingViewControllerUserInteractionEnabled
containerView.backgroundColor = config.presentationStyle.backgroundColor
originalSuperview = presentingViewController.view.superview
containerView.addSubview(presentingViewController.view)
containerView.addSubview(presentedViewController.view)
layerViews()
@@ -170,18 +166,14 @@ internal final class SideMenuPresentationController {
}
statusBarView?.removeFromSuperview()
presentedViewController.view.removeFromSuperview()
presentingViewController.view.motionEffects.removeAll()
presentingViewController.view.layer.shadowOpacity = 0
presentedViewController.view.layer.shadowOpacity = 0
removeStyles(from: presentingViewController.containerViewController.view)
if let interactivePopGestureRecognizerEnabled = interactivePopGestureRecognizerEnabled,
let topNavigationController = presentingViewController as? UINavigationController {
topNavigationController.interactivePopGestureRecognizer?.isEnabled = interactivePopGestureRecognizerEnabled
}
originalSuperview?.addSubview(presentingViewController.view)
presentingViewController.view.isUserInteractionEnabled = true
config.presentationStyle.dismissalTransitionDidEnd(to: presentedViewController, from: presentingViewController, completed)
}
@@ -189,6 +181,31 @@ internal final class SideMenuPresentationController {
private extension SideMenuPresentationController {
var statusBarFrame: CGRect {
if #available(iOS 13.0, *) {
return containerView.window?.windowScene?.statusBarManager?.statusBarFrame ?? .zero
} else {
return UIApplication.shared.statusBarFrame
}
}
var frameOfPresentedViewInContainerView: CGRect {
var rect = containerView.bounds
rect.origin.x = leftSide ? 0 : rect.width - config.menuWidth
rect.size.width = config.menuWidth
return rect
}
var frameOfPresentingViewInContainerView: CGRect {
var rect = containerView.frame
if containerView.superview != nil, containerView.frame.minY > .ulpOfOne {
let statusBarOffset = statusBarFrame.height - rect.minY
rect.origin.y = statusBarOffset
rect.size.height -= statusBarOffset
}
return rect
}
func transition(to: UIViewController, from: UIViewController, alpha: CGFloat, statusBarAlpha: CGFloat, scale: CGFloat, translate: CGFloat) {
containerViewWillLayoutSubviews()
@@ -221,7 +238,9 @@ private extension SideMenuPresentationController {
view.layer.shadowColor = config.presentationStyle.onTopShadowColor.cgColor
view.layer.shadowRadius = config.presentationStyle.onTopShadowRadius
view.layer.shadowOpacity = config.presentationStyle.onTopShadowOpacity
view.layer.shadowOffset = CGSize(width: 0, height: 0)
view.layer.shadowOffset = config.presentationStyle.onTopShadowOffset
clipsToBounds = clipsToBounds ?? view.clipsToBounds
view.clipsToBounds = false
}
func addParallax(to view: UIView) {
@@ -250,4 +269,12 @@ private extension SideMenuPresentationController {
view.addMotionEffect(group)
}
}
func removeStyles(from view: UIView) {
view.motionEffects.removeAll()
view.layer.shadowOpacity = 0
view.layer.shadowOpacity = 0
view.clipsToBounds = clipsToBounds ?? true
clipsToBounds = false
}
}
+20 -20
View File
@@ -5,51 +5,51 @@
// Created by Jon Kent on 7/2/19.
//
import Foundation
import UIKit
@objcMembers
open class SideMenuPresentationStyle: InitializableClass {
/// Background color behind the views and status bar color
public var backgroundColor: UIColor = .black
open var backgroundColor: UIColor = .black
/// The starting alpha value of the menu before it appears
public var menuStartAlpha: CGFloat = 1
open var menuStartAlpha: CGFloat = 1
/// Whether or not the menu is on top. If false, the presenting view is on top. Shadows are applied to the view on top.
public var menuOnTop: Bool = false
open var menuOnTop: Bool = false
/// The amount the menu is translated along the x-axis. Zero is stationary, negative values are off-screen, positive values are on screen.
public var menuTranslateFactor: CGFloat = 0
open var menuTranslateFactor: CGFloat = 0
/// The amount the menu is scaled. Less than one shrinks the view, larger than one grows the view.
public var menuScaleFactor: CGFloat = 1
open var menuScaleFactor: CGFloat = 1
/// The color of the shadow applied to the top most view.
public var onTopShadowColor: UIColor = .black
open var onTopShadowColor: UIColor = .black
/// The radius of the shadow applied to the top most view.
public var onTopShadowRadius: CGFloat = 5
open var onTopShadowRadius: CGFloat = 5
/// The opacity of the shadow applied to the top most view.
public var onTopShadowOpacity: Float = 0
open var onTopShadowOpacity: Float = 0
/// The offset of the shadow applied to the top most view.
public var onTopShadowOffset: CGSize = .zero
open var onTopShadowOffset: CGSize = .zero
/// The ending alpha of the presenting view when the menu is fully displayed.
public var presentingEndAlpha: CGFloat = 1
open var presentingEndAlpha: CGFloat = 1
/// The amount the presenting view is translated along the x-axis. Zero is stationary, negative values are off-screen, positive values are on screen.
public var presentingTranslateFactor: CGFloat = 0
open var presentingTranslateFactor: CGFloat = 0
/// The amount the presenting view is scaled. Less than one shrinks the view, larger than one grows the view.
public var presentingScaleFactor: CGFloat = 1
open var presentingScaleFactor: CGFloat = 1
/// The strength of the parallax effect on the presenting view once the menu is displayed.
public var presentingParallaxStrength: CGSize = .zero
open var presentingParallaxStrength: CGSize = .zero
required public init() {}
/// This method is called just before the presentation transition begins. Use this to setup any animations. The super method does not need to be called.
func presentationTransitionWillBegin(to presentedViewController: UIViewController, from presentingViewController: UIViewController) {}
open func presentationTransitionWillBegin(to presentedViewController: UIViewController, from presentingViewController: UIViewController) {}
/// This method is called during the presentation animation. Use this to animate anything alongside the menu animation. The super method does not need to be called.
func presentationTransition(to presentedViewController: UIViewController, from presentingViewController: UIViewController) {}
open func presentationTransition(to presentedViewController: UIViewController, from presentingViewController: UIViewController) {}
/// This method is called when the presentation transition ends. Use this to finish any animations. The super method does not need to be called.
func presentationTransitionDidEnd(to presentedViewController: UIViewController, from presentingViewController: UIViewController, _ completed: Bool) {}
open func presentationTransitionDidEnd(to presentedViewController: UIViewController, from presentingViewController: UIViewController, _ completed: Bool) {}
/// This method is called just before the dismissal transition begins. Use this to setup any animations. The super method does not need to be called.
func dismissalTransitionWillBegin(to presentedViewController: UIViewController, from presentingViewController: UIViewController) {}
open func dismissalTransitionWillBegin(to presentedViewController: UIViewController, from presentingViewController: UIViewController) {}
/// This method is called during the dismissal animation. Use this to animate anything alongside the menu animation. The super method does not need to be called.
func dismissalTransition(to presentedViewController: UIViewController, from presentingViewController: UIViewController) {}
open func dismissalTransition(to presentedViewController: UIViewController, from presentingViewController: UIViewController) {}
/// This method is called when the dismissal transition ends. Use this to finish any animations. The super method does not need to be called.
func dismissalTransitionDidEnd(to presentedViewController: UIViewController, from presentingViewController: UIViewController, _ completed: Bool) {}
open func dismissalTransitionDidEnd(to presentedViewController: UIViewController, from presentingViewController: UIViewController, _ completed: Bool) {}
}
public extension SideMenuPresentationStyle {
+107
View File
@@ -0,0 +1,107 @@
//
// PushCoordinator.swift
// SideMenu
//
// Created by Jon Kent on 9/4/19.
//
import UIKit
protocol CoordinatorModel {
var animated: Bool { get }
var fromViewController: UIViewController { get }
var toViewController: UIViewController { get }
}
protocol Coordinator {
associatedtype Model: CoordinatorModel
init(config: Model)
@discardableResult func start() -> Bool
}
internal final class SideMenuPushCoordinator: Coordinator {
struct Model: CoordinatorModel {
var allowPushOfSameClassTwice: Bool
var alongsideTransition: (() -> Void)?
var animated: Bool
var fromViewController: UIViewController
var pushStyle: SideMenuPushStyle
var toViewController: UIViewController
}
private let config: Model
init(config: Model) {
self.config = config
}
@discardableResult func start() -> Bool {
guard config.pushStyle != .subMenu,
let fromNavigationController = config.fromViewController as? UINavigationController else {
return false
}
let toViewController = config.toViewController
let presentingViewController = fromNavigationController.presentingViewController
let splitViewController = presentingViewController as? UISplitViewController
let tabBarController = presentingViewController as? UITabBarController
let potentialNavigationController = (splitViewController?.viewControllers.first ?? tabBarController?.selectedViewController) ?? presentingViewController
guard let navigationController = potentialNavigationController as? UINavigationController else {
Print.warning(.cannotPush, arguments: String(describing: potentialNavigationController.self), required: true)
return false
}
// To avoid overlapping dismiss & pop/push calls, create a transaction block where the menu
// is dismissed after showing the appropriate screen
CATransaction.begin()
defer { CATransaction.commit() }
UIView.animationsEnabled { [weak self] in
self?.config.alongsideTransition?()
}
if let lastViewController = navigationController.viewControllers.last,
!config.allowPushOfSameClassTwice && type(of: lastViewController) == type(of: toViewController) {
return false
}
toViewController.navigationItem.hidesBackButton = config.pushStyle.hidesBackButton
switch config.pushStyle {
case .default:
navigationController.pushViewController(toViewController, animated: config.animated)
return true
// subMenu handled earlier
case .subMenu:
return false
case .popWhenPossible:
for subViewController in navigationController.viewControllers.reversed() {
if type(of: subViewController) == type(of: toViewController) {
navigationController.popToViewController(subViewController, animated: config.animated)
return true
}
}
navigationController.pushViewController(toViewController, animated: config.animated)
return true
case .preserve, .preserveAndHideBackButton:
var viewControllers = navigationController.viewControllers
let filtered = viewControllers.filter { preservedViewController in type(of: preservedViewController) == type(of: toViewController) }
guard let preservedViewController = filtered.last else {
navigationController.pushViewController(toViewController, animated: config.animated)
return true
}
viewControllers = viewControllers.filter { subViewController in subViewController !== preservedViewController }
viewControllers.append(preservedViewController)
navigationController.setViewControllers(viewControllers, animated: config.animated)
return true
case .replace:
navigationController.setViewControllers([toViewController], animated: config.animated)
return true
}
}
}
+58 -152
View File
@@ -1,8 +1,9 @@
//
// SideMenuAnimationController.swift
// SideMenuTransitioningDelegate.swift
// SideMenu
//
// Created by Jon Kent on 10/24/18.
// Created by Jon Kent on 8/29/19.
// Copyright © 2019 jonkykong. All rights reserved.
//
import UIKit
@@ -12,176 +13,81 @@ internal protocol SideMenuTransitionControllerDelegate: class {
func sideMenuTransitionController(_ transitionController: SideMenuTransitionController, didPresent viewController: UIViewController)
}
internal final class SideMenuTransitionController: NSObject, UIViewControllerAnimatedTransitioning {
internal final class SideMenuTransitionController: NSObject, UIViewControllerTransitioningDelegate {
typealias Model = MenuModel & AnimationModel & PresentationModel
private var config: TransitionModel
private weak var containerView: UIView?
private let leftSide: Bool
private var presentationController: SideMenuPresentationController!
private unowned var presentedViewController: UIViewController?
private unowned var presentingViewController: UIViewController?
private let config: Model
private var animationController: SideMenuAnimationController?
private weak var interactionController: SideMenuInteractionController?
var interactive: Bool = false
weak var delegate: SideMenuTransitionControllerDelegate?
init(config: TransitionModel, leftSide: Bool, delegate: SideMenuTransitionControllerDelegate? = nil) {
self.config = config
init(leftSide: Bool, config: Model) {
self.leftSide = leftSide
self.delegate = delegate
self.config = config
super.init()
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
guard
let presentedViewController = transitionContext.presentedViewController,
let presentingViewController = transitionContext.presentingViewController
else { return }
if transitionContext.isPresenting {
self.containerView = transitionContext.containerView
self.presentedViewController = presentedViewController
self.presentingViewController = presentingViewController
self.presentationController = SideMenuPresentationController(
config: config,
leftSide: leftSide,
presentedViewController: presentedViewController,
presentingViewController: presentingViewController,
containerView: transitionContext.containerView
)
}
transition(using: transitionContext)
func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
animationController = SideMenuAnimationController(
config: config,
leftSide: leftSide,
delegate: self)
return animationController
}
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
guard let transitionContext = transitionContext else { return 0 }
return duration(presenting: transitionContext.isPresenting, interactive: transitionContext.isInteractive)
func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return animationController
}
func animationEnded(_ transitionCompleted: Bool) {
guard let presentedViewController = presentedViewController else { return }
if presentedViewController.isHidden {
delegate?.sideMenuTransitionController(self, didDismiss: presentedViewController)
} else {
delegate?.sideMenuTransitionController(self, didPresent: presentedViewController)
}
func interactionControllerForPresentation(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? {
return interactionController(using: animator)
}
func transition(presenting: Bool, animated: Bool = true, interactive: Bool = false, alongsideTransition: (() -> Void)? = nil, complete: Bool = true, completion: ((Bool) -> Void)? = nil) {
transitionWillBegin(presenting: presenting)
transition(presenting: presenting,
animated: animated,
interactive: interactive,
animations: { [weak self] in
guard let self = self else { return }
self.transition(presenting: presenting)
alongsideTransition?()
}, completion: { [weak self] _ in
guard let self = self else { return }
if complete {
self.transitionDidEnd(presenting: presenting, completed: true)
}
completion?(true)
})
func interactionControllerForDismissal(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? {
return interactionController(using: animator)
}
internal func handle(state: SideMenuInteractionController.State) {
interactionController?.handle(state: state)
}
func layout() {
presentationController.containerViewWillLayoutSubviews()
animationController?.layout()
}
func transition(presenting: Bool, animated: Bool = true, interactive: Bool = false, alongsideTransition: (() -> Void)? = nil, complete: Bool = true, completion: ((Bool) -> Void)? = nil) {
animationController?.transition(
presenting: presenting,
animated: animated,
interactive: interactive,
alongsideTransition: alongsideTransition,
complete: complete, completion: completion
)
}
}
extension SideMenuTransitionController: SideMenuAnimationControllerDelegate {
internal func sideMenuAnimationController(_ animationController: SideMenuAnimationController, didDismiss viewController: UIViewController) {
delegate?.sideMenuTransitionController(self, didDismiss: viewController)
}
internal func sideMenuAnimationController(_ animationController: SideMenuAnimationController, didPresent viewController: UIViewController) {
delegate?.sideMenuTransitionController(self, didPresent: viewController)
}
}
private extension SideMenuTransitionController {
func duration(presenting: Bool, interactive: Bool) -> Double {
if interactive { return config.completeGestureDuration }
return presenting ? config.presentDuration : config.dismissDuration
}
func transitionWillBegin(presenting: Bool) {
// prevent any other menu gestures from firing
containerView?.isUserInteractionEnabled = false
if presenting {
presentationController.presentationTransitionWillBegin()
} else {
presentationController.dismissalTransitionWillBegin()
}
}
func transition(presenting: Bool) {
if presenting {
presentationController.presentationTransition()
} else {
presentationController.dismissalTransition()
}
}
func transitionDidEnd(presenting: Bool, completed: Bool) {
if presenting {
presentationController.presentationTransitionDidEnd(completed)
} else {
presentationController.dismissalTransitionDidEnd(completed)
}
containerView?.isUserInteractionEnabled = true
}
func transition(using transitionContext: UIViewControllerContextTransitioning) {
transitionWillBegin(presenting: transitionContext.isPresenting)
transition(presenting: transitionContext.isPresenting,
animated: transitionContext.isAnimated,
interactive: transitionContext.isInteractive,
animations: { [weak self] in
guard let self = self else { return }
self.transition(presenting: transitionContext.isPresenting)
}, completion: { [weak self] _ in
guard let self = self else { return }
let completed = !transitionContext.transitionWasCancelled
self.transitionDidEnd(presenting: transitionContext.isPresenting, completed: completed)
transitionContext.completeTransition(completed)
})
}
func transition(presenting: Bool, animated: Bool = true, interactive: Bool = false, animations: @escaping (() -> Void) = {}, completion: @escaping ((Bool) -> Void) = { _ in }) {
if !animated {
animations()
completion(true)
return
}
let duration = self.duration(presenting: presenting, interactive: interactive)
if interactive {
// IMPORTANT: The non-interactive animation block will not complete if adapted for interactive. The below animation block must be used!
UIView.animate(
withDuration: duration,
delay: duration, // HACK: If zero, the animation briefly flashes in iOS 11.
options: .curveLinear,
animations: animations,
completion: completion
)
return
}
UIView.animate(
withDuration: duration,
delay: 0,
usingSpringWithDamping: config.usingSpringWithDamping,
initialSpringVelocity: config.initialSpringVelocity,
options: config.animationOptions,
animations: animations,
completion: completion
)
}
}
private extension UIViewControllerContextTransitioning {
var isPresenting: Bool {
return viewController(forKey: .from)?.presentedViewController === viewController(forKey: .to)
}
var presentingViewController: UIViewController? {
return viewController(forKey: isPresenting ? .from : .to)
}
var presentedViewController: UIViewController? {
return viewController(forKey: isPresenting ? .to : .from)
func interactionController(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? {
guard interactive else { return nil }
interactive = false
let interactionController = SideMenuInteractionController(cancelWhenBackgrounded: config.dismissWhenBackgrounded, completionCurve: config.completionCurve)
self.interactionController = interactionController
return interactionController
}
}
+3 -3
View File
@@ -10,9 +10,9 @@ import UIKit
open class UITableViewVibrantCell: UITableViewCell {
private var vibrancyView:UIVisualEffectView = UIVisualEffectView()
private var vibrancySelectedBackgroundView:UIVisualEffectView = UIVisualEffectView()
private var defaultSelectedBackgroundView:UIView?
private var vibrancyView: UIVisualEffectView = UIVisualEffectView()
private var vibrancySelectedBackgroundView: UIVisualEffectView = UIVisualEffectView()
private var defaultSelectedBackgroundView: UIView?
open var blurEffectStyle: UIBlurEffect.Style? {
didSet {
updateBlur()
+3 -3
View File
@@ -1,5 +1,5 @@
PODS:
- SideMenu (6.0.0)
- SideMenu (6.4.4)
DEPENDENCIES:
- SideMenu (from `.`)
@@ -9,8 +9,8 @@ EXTERNAL SOURCES:
:path: "."
SPEC CHECKSUMS:
SideMenu: 1b826b95cc7db1a3c7d164f8a6e6e92506ffb0f5
SideMenu: e49a7d61d1f50e9bdaa866bbb9fc7d903c6400ed
PODFILE CHECKSUM: 863f183ea1ab6f64dc8553590349c586faf8e4a1
COCOAPODS: 1.7.4
COCOAPODS: 1.8.4
+4 -4
View File
@@ -1,6 +1,6 @@
{
"name": "SideMenu",
"version": "6.0.0",
"version": "6.4.4",
"summary": "Simple side menu control for iOS in Swift inspired by Facebook. Right and Left sides. No coding required.",
"description": "SideMenu is a simple and versatile side menu control. It's highly customizable, but can also be implemented in storyboard without a single line of code. The are three standard animation styles to choose from along with several other options for further customization if desired. Just type SideMenuManager.menu... and code completion will show you everything you can customize.",
"homepage": "https://github.com/jonkykong/SideMenu",
@@ -19,12 +19,12 @@
},
"source": {
"git": "https://github.com/jonkykong/SideMenu.git",
"tag": "6.0.0"
"tag": "6.4.4"
},
"platforms": {
"ios": "10.0"
},
"swift_versions": "5",
"swift_versions": "5.0",
"source_files": "Pod/Classes/**/*",
"swift_version": "5"
"swift_version": "5.0"
}
+3 -3
View File
@@ -1,5 +1,5 @@
PODS:
- SideMenu (6.0.0)
- SideMenu (6.4.4)
DEPENDENCIES:
- SideMenu (from `.`)
@@ -9,8 +9,8 @@ EXTERNAL SOURCES:
:path: "."
SPEC CHECKSUMS:
SideMenu: 1b826b95cc7db1a3c7d164f8a6e6e92506ffb0f5
SideMenu: e49a7d61d1f50e9bdaa866bbb9fc7d903c6400ed
PODFILE CHECKSUM: 863f183ea1ab6f64dc8553590349c586faf8e4a1
COCOAPODS: 1.7.4
COCOAPODS: 1.8.4
+189 -194
View File
@@ -7,25 +7,26 @@
objects = {
/* Begin PBXBuildFile section */
032FEB01E4C88E7C87032FCF9780FC7C /* SideMenuNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F8B09C72B577EFDB20A3EFF4F0C668A /* SideMenuNavigationController.swift */; };
0D2D410A6087D4E0A54642165913EF30 /* Models.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5F10B146FA49E99D07F0FA0E38ABE8F /* Models.swift */; };
08B5B89F28224381711F45A680C292D9 /* SideMenu-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 483ED806593206DE8305C4A1D90A247C /* SideMenu-dummy.m */; };
09A0A5D3733F69E93F553ABBCF02FB77 /* SideMenuTransitionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E213616E2B0DBF0F42616AB3755F06FE /* SideMenuTransitionController.swift */; };
0F9F3CABB81269CF711A73BAD21E7976 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */; };
287FA1360FD3EF72D700C54856C685C1 /* SideMenuManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FE7B8C8447DD35D435B2AF4A23E221C /* SideMenuManager.swift */; };
31E79D7BA42208D00E73C18CBAF1598E /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1B25193EDCA447F119795F68F75BF05 /* Extensions.swift */; };
384CBA8850C8BF3A7AAB3A3D78844B1E /* Protected.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13846826E721392191757B9033D6F63F /* Protected.swift */; };
45A647715262A70BB9F2F4E7C1439C58 /* UITableViewVibrantCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3ACA278071ED85D04DA83677D6C60528 /* UITableViewVibrantCell.swift */; };
5B0A5C9933D0FCD08E12CFFB56145333 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */; };
614FC39555CB129D97FC24B2D953A427 /* SideMenuPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61AFB3209BCB97295281AC6437FB346B /* SideMenuPresentationController.swift */; };
6E6E17C0E8351D23CB4B20332C70BE61 /* Print.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CB39D726F07EA27650309A1A3213412 /* Print.swift */; };
8428210422E0540800C6F2D8 /* Deprecations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8428210022E0448700C6F2D8 /* Deprecations.swift */; };
27D830F1CAC60B99CC0A135F583BFFF2 /* SideMenuPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4478DA100E870015396A31E34EAE85C6 /* SideMenuPresentationController.swift */; };
2ED518A3FA8DCBE08E621AC5C32844A9 /* SideMenuPushCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E4DF7E2DE51F48991657318A6A794E5 /* SideMenuPushCoordinator.swift */; };
3846AFE38D1B63A9F0D9073C4ABC6DAA /* SideMenuNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC840BDAF4C7A797D47AE168A4772B30 /* SideMenuNavigationController.swift */; };
3E18B004D34ED5441A193684EEB25BD3 /* SideMenuPresentationStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D3D2B7A778661E171282A7ED20D2877 /* SideMenuPresentationStyle.swift */; };
4E88B70410F6837FBD463EA4B6C33155 /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68E9F03EED707BCF042E05DA2A517C05 /* Extensions.swift */; };
77AF2098DDCCAAE0CE4A20725C466905 /* SideMenuManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E04B549B5C8D967EABDD06CCFBB2EAA /* SideMenuManager.swift */; };
890FF25D0CCFF9BADECBA64DCCEFF4FF /* SideMenuAnimationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A190CEABB276E98D2E2E42A0782D0B3 /* SideMenuAnimationController.swift */; };
89B2CFA98A07964FBD2D7775FF5FB98D /* Pods-Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D6D7C498FA339E02BD53ECB8916CEA8E /* Pods-Example-dummy.m */; };
A2ACFE2D997BC8F1DA4EE3064A4270DD /* SideMenuInteractionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB64592703EA9A196B5C0F07BA1A918A /* SideMenuInteractionController.swift */; };
BD5C0C12B6BB0BF6DA294E095B35E38D /* Initializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00F847D27577EF5335081BFA43A0BFA3 /* Initializable.swift */; };
D0B45D0F0E7B359807CAFB744FB80CE4 /* SideMenuPresentationStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = D154DB98A04C7BD96E4EFBBD3FE0008A /* SideMenuPresentationStyle.swift */; };
8C06632AA14D12278B1277AC0CC6A0B2 /* SideMenuInteractionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8F4E65F1D9783878DE723C047254F7F /* SideMenuInteractionController.swift */; };
905A503F069C27E841BAD9F4EFD4F1AF /* Protected.swift in Sources */ = {isa = PBXBuildFile; fileRef = A76A15DD83119DF3D02A409BE549EE37 /* Protected.swift */; };
B27B12C5D2EF1BE7B3CBBBC8FA98110E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */; };
C798DA148F7F666F393F2009DDF73E35 /* Initializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8C7241018AD9D83F0C848AF4D15BB6F /* Initializable.swift */; };
C96A55C2A869A97AC4CA628A7F2A2A21 /* UITableViewVibrantCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6CA37E6BFFB55EA182A49309AA4FF2A /* UITableViewVibrantCell.swift */; };
D1BD7393C7934049B3E51D9C5A5CD8A0 /* Print.swift in Sources */ = {isa = PBXBuildFile; fileRef = F92AD41B8E1CE93D7087AF683AACC13B /* Print.swift */; };
D3D22BB8C279DC03EA91BFE3F5412477 /* Deprecations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1236622179F2E6E2CB9F9238372E178F /* Deprecations.swift */; };
D777716F0B6C0754B7B0230531743BC4 /* SideMenu-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 55355E067C04A719E5FBD54DC604AB00 /* SideMenu-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
D7BD58D0FF7BF7E887B6D70D4651D70B /* Pods-Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 7825A90E082A1582EB16256B0E722B3F /* Pods-Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
DA6F42990A37DF6179D6386008BB87F8 /* SideMenu-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 36C5772477B00653D86343BABD123EF3 /* SideMenu-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
F1967413D21BCA08963F09969D47E152 /* SideMenu-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9CF977D7FB42D367F2810037EBA59B7D /* SideMenu-dummy.m */; };
FCBFE25630B6309DF3213AE0F6F34D1A /* SideMenuTransitionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30C3188EE68841BE36716860BE079AF8 /* SideMenuTransitionController.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -39,41 +40,42 @@
/* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */
00F847D27577EF5335081BFA43A0BFA3 /* Initializable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Initializable.swift; path = Pod/Classes/Initializable.swift; sourceTree = "<group>"; };
0FD529BD299167F85338CB5BB3463BED /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
105D784922AF9F627D902729C7D0E3CA /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = LICENSE; sourceTree = "<group>"; };
13846826E721392191757B9033D6F63F /* Protected.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Protected.swift; path = Pod/Classes/Protected.swift; sourceTree = "<group>"; };
1D01FD908F7943A6131CA6F66DD0CA68 /* SideMenu-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SideMenu-Info.plist"; sourceTree = "<group>"; };
1F667CC0E19EAF34E5A4119E2121F585 /* Pods_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; };
1FE7B8C8447DD35D435B2AF4A23E221C /* SideMenuManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SideMenuManager.swift; path = Pod/Classes/SideMenuManager.swift; sourceTree = "<group>"; };
03D51F4E3DB2BA91628B99A4A9922F8C /* SideMenu-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SideMenu-Info.plist"; sourceTree = "<group>"; };
0E4DF7E2DE51F48991657318A6A794E5 /* SideMenuPushCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SideMenuPushCoordinator.swift; path = Pod/Classes/SideMenuPushCoordinator.swift; sourceTree = "<group>"; };
1236622179F2E6E2CB9F9238372E178F /* Deprecations.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Deprecations.swift; path = Pod/Classes/Deprecations.swift; sourceTree = "<group>"; };
1A190CEABB276E98D2E2E42A0782D0B3 /* SideMenuAnimationController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SideMenuAnimationController.swift; path = Pod/Classes/SideMenuAnimationController.swift; sourceTree = "<group>"; };
1F667CC0E19EAF34E5A4119E2121F585 /* Pods_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_Example.framework; path = "Pods-Example.framework"; sourceTree = BUILT_PRODUCTS_DIR; };
243410B9535472556EA4BB6DBC133A0D /* Pods-Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Example.release.xcconfig"; sourceTree = "<group>"; };
2CB39D726F07EA27650309A1A3213412 /* Print.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Print.swift; path = Pod/Classes/Print.swift; sourceTree = "<group>"; };
30C3188EE68841BE36716860BE079AF8 /* SideMenuTransitionController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SideMenuTransitionController.swift; path = Pod/Classes/SideMenuTransitionController.swift; sourceTree = "<group>"; };
319D06AA0D1D0BA345459C039040A1ED /* SideMenu.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SideMenu.framework; sourceTree = BUILT_PRODUCTS_DIR; };
2D3D2B7A778661E171282A7ED20D2877 /* SideMenuPresentationStyle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SideMenuPresentationStyle.swift; path = Pod/Classes/SideMenuPresentationStyle.swift; sourceTree = "<group>"; };
319D06AA0D1D0BA345459C039040A1ED /* SideMenu.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SideMenu.framework; path = SideMenu.framework; sourceTree = BUILT_PRODUCTS_DIR; };
31C1D37707DFAA5E6A164BCC07834264 /* Pods-Example-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Example-Info.plist"; sourceTree = "<group>"; };
3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
32A195DE78A8DB13D93B3F7B4BE04865 /* SideMenu-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SideMenu-prefix.pch"; sourceTree = "<group>"; };
35C305D3797C284E6F5BAA1D3E6F9BF8 /* Pods-Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-Example.modulemap"; sourceTree = "<group>"; };
36C5772477B00653D86343BABD123EF3 /* SideMenu-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SideMenu-umbrella.h"; sourceTree = "<group>"; };
3ACA278071ED85D04DA83677D6C60528 /* UITableViewVibrantCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UITableViewVibrantCell.swift; path = Pod/Classes/UITableViewVibrantCell.swift; sourceTree = "<group>"; };
441854E35F81731E63E53DC7E4EEAD9D /* Pods-Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-Example-acknowledgements.markdown"; sourceTree = "<group>"; };
61AFB3209BCB97295281AC6437FB346B /* SideMenuPresentationController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SideMenuPresentationController.swift; path = Pod/Classes/SideMenuPresentationController.swift; sourceTree = "<group>"; };
4478DA100E870015396A31E34EAE85C6 /* SideMenuPresentationController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SideMenuPresentationController.swift; path = Pod/Classes/SideMenuPresentationController.swift; sourceTree = "<group>"; };
483ED806593206DE8305C4A1D90A247C /* SideMenu-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SideMenu-dummy.m"; sourceTree = "<group>"; };
4E04B549B5C8D967EABDD06CCFBB2EAA /* SideMenuManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SideMenuManager.swift; path = Pod/Classes/SideMenuManager.swift; sourceTree = "<group>"; };
55355E067C04A719E5FBD54DC604AB00 /* SideMenu-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SideMenu-umbrella.h"; sourceTree = "<group>"; };
654DD97AF16A95330BAC230F687DE2D0 /* SideMenu.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SideMenu.modulemap; sourceTree = "<group>"; };
68E9F03EED707BCF042E05DA2A517C05 /* Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Extensions.swift; path = Pod/Classes/Extensions.swift; sourceTree = "<group>"; };
7825A90E082A1582EB16256B0E722B3F /* Pods-Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-Example-umbrella.h"; sourceTree = "<group>"; };
8428210022E0448700C6F2D8 /* Deprecations.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Deprecations.swift; path = Pod/Classes/Deprecations.swift; sourceTree = "<group>"; };
8F8B09C72B577EFDB20A3EFF4F0C668A /* SideMenuNavigationController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SideMenuNavigationController.swift; path = Pod/Classes/SideMenuNavigationController.swift; sourceTree = "<group>"; };
9CF977D7FB42D367F2810037EBA59B7D /* SideMenu-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SideMenu-dummy.m"; sourceTree = "<group>"; };
9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
AB64592703EA9A196B5C0F07BA1A918A /* SideMenuInteractionController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SideMenuInteractionController.swift; path = Pod/Classes/SideMenuInteractionController.swift; sourceTree = "<group>"; };
9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
A4302206527AC510E3D7B412DE3F4B9F /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = "<group>"; };
A76A15DD83119DF3D02A409BE549EE37 /* Protected.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Protected.swift; path = Pod/Classes/Protected.swift; sourceTree = "<group>"; };
A8C7241018AD9D83F0C848AF4D15BB6F /* Initializable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Initializable.swift; path = Pod/Classes/Initializable.swift; sourceTree = "<group>"; };
AC840BDAF4C7A797D47AE168A4772B30 /* SideMenuNavigationController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SideMenuNavigationController.swift; path = Pod/Classes/SideMenuNavigationController.swift; sourceTree = "<group>"; };
AFECBC24E09D0D25F822C27BD944AFD4 /* Pods-Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Example-frameworks.sh"; sourceTree = "<group>"; };
B45138496B85A072654D1D0F8EBBEDE5 /* Pods-Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Example.debug.xcconfig"; sourceTree = "<group>"; };
B5F10B146FA49E99D07F0FA0E38ABE8F /* Models.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Models.swift; path = Pod/Classes/Models.swift; sourceTree = "<group>"; };
BB1EC6DFBB713FC2F280D596714173EC /* SideMenu.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SideMenu.xcconfig; sourceTree = "<group>"; };
BD4CEC04022777F53C1CA2113A43FACE /* SideMenu-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SideMenu-prefix.pch"; sourceTree = "<group>"; };
BE262D79CAE897127A1984945DCE9FEE /* SideMenu.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; path = SideMenu.podspec; sourceTree = "<group>"; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
D154DB98A04C7BD96E4EFBBD3FE0008A /* SideMenuPresentationStyle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SideMenuPresentationStyle.swift; path = Pod/Classes/SideMenuPresentationStyle.swift; sourceTree = "<group>"; };
C8F4E65F1D9783878DE723C047254F7F /* SideMenuInteractionController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SideMenuInteractionController.swift; path = Pod/Classes/SideMenuInteractionController.swift; sourceTree = "<group>"; };
D6D7C498FA339E02BD53ECB8916CEA8E /* Pods-Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Example-dummy.m"; sourceTree = "<group>"; };
E656C89A7C466C66F803FC806E30B29E /* SideMenu.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SideMenu.modulemap; sourceTree = "<group>"; };
E213616E2B0DBF0F42616AB3755F06FE /* SideMenuTransitionController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SideMenuTransitionController.swift; path = Pod/Classes/SideMenuTransitionController.swift; sourceTree = "<group>"; };
E6CA37E6BFFB55EA182A49309AA4FF2A /* UITableViewVibrantCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UITableViewVibrantCell.swift; path = Pod/Classes/UITableViewVibrantCell.swift; sourceTree = "<group>"; };
EA21B344259B58996DB73382B1B1521F /* Pods-Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Example-acknowledgements.plist"; sourceTree = "<group>"; };
F1B25193EDCA447F119795F68F75BF05 /* Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Extensions.swift; path = Pod/Classes/Extensions.swift; sourceTree = "<group>"; };
EA92790C234A2F98F6C18448D9F42528 /* SideMenu.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = SideMenu.podspec; sourceTree = "<group>"; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
EFCCF6914C835E490A4AD98BF8E7B0C1 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = "<group>"; };
F6FC615909FE86F0CAC222360D567BAE /* SideMenu.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SideMenu.xcconfig; sourceTree = "<group>"; };
F92AD41B8E1CE93D7087AF683AACC13B /* Print.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Print.swift; path = Pod/Classes/Print.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -85,11 +87,11 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
B55A7DF9A704D60A5DE58A98398D7779 /* Frameworks */ = {
D9D87C2BC8D3C4B8382407D4C6B16014 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
5B0A5C9933D0FCD08E12CFFB56145333 /* Foundation.framework in Frameworks */,
B27B12C5D2EF1BE7B3CBBBC8FA98110E /* Foundation.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -105,12 +107,44 @@
name = Products;
sourceTree = "<group>";
};
71A499AE33E397EBD7FA1A9D5B8440BA /* Pod */ = {
0F452C367D07FDEE3104601DDFF26220 /* SideMenu */ = {
isa = PBXGroup;
children = (
105D784922AF9F627D902729C7D0E3CA /* LICENSE */,
0FD529BD299167F85338CB5BB3463BED /* README.md */,
BE262D79CAE897127A1984945DCE9FEE /* SideMenu.podspec */,
1236622179F2E6E2CB9F9238372E178F /* Deprecations.swift */,
68E9F03EED707BCF042E05DA2A517C05 /* Extensions.swift */,
A8C7241018AD9D83F0C848AF4D15BB6F /* Initializable.swift */,
F92AD41B8E1CE93D7087AF683AACC13B /* Print.swift */,
A76A15DD83119DF3D02A409BE549EE37 /* Protected.swift */,
1A190CEABB276E98D2E2E42A0782D0B3 /* SideMenuAnimationController.swift */,
C8F4E65F1D9783878DE723C047254F7F /* SideMenuInteractionController.swift */,
4E04B549B5C8D967EABDD06CCFBB2EAA /* SideMenuManager.swift */,
AC840BDAF4C7A797D47AE168A4772B30 /* SideMenuNavigationController.swift */,
4478DA100E870015396A31E34EAE85C6 /* SideMenuPresentationController.swift */,
2D3D2B7A778661E171282A7ED20D2877 /* SideMenuPresentationStyle.swift */,
0E4DF7E2DE51F48991657318A6A794E5 /* SideMenuPushCoordinator.swift */,
E213616E2B0DBF0F42616AB3755F06FE /* SideMenuTransitionController.swift */,
E6CA37E6BFFB55EA182A49309AA4FF2A /* UITableViewVibrantCell.swift */,
332826286A892AB914FDDEECA277FF40 /* Pod */,
CE045EEBF674BD95DAEDB7C2EEECF5CE /* Support Files */,
);
name = SideMenu;
path = ..;
sourceTree = "<group>";
};
2A7F78FEA350BF62EE25FB7AA75683E2 /* Development Pods */ = {
isa = PBXGroup;
children = (
0F452C367D07FDEE3104601DDFF26220 /* SideMenu */,
);
name = "Development Pods";
sourceTree = "<group>";
};
332826286A892AB914FDDEECA277FF40 /* Pod */ = {
isa = PBXGroup;
children = (
A4302206527AC510E3D7B412DE3F4B9F /* LICENSE */,
EFCCF6914C835E490A4AD98BF8E7B0C1 /* README.md */,
EA92790C234A2F98F6C18448D9F42528 /* SideMenu.podspec */,
);
name = Pod;
sourceTree = "<group>";
@@ -132,43 +166,6 @@
path = "Target Support Files/Pods-Example";
sourceTree = "<group>";
};
B2A94553E0F1BCEBF406CC59D290924B /* SideMenu */ = {
isa = PBXGroup;
children = (
71A499AE33E397EBD7FA1A9D5B8440BA /* Pod */,
B5D061624D54AFB703E72CCF860BDB15 /* Support Files */,
8428210022E0448700C6F2D8 /* Deprecations.swift */,
F1B25193EDCA447F119795F68F75BF05 /* Extensions.swift */,
00F847D27577EF5335081BFA43A0BFA3 /* Initializable.swift */,
B5F10B146FA49E99D07F0FA0E38ABE8F /* Models.swift */,
2CB39D726F07EA27650309A1A3213412 /* Print.swift */,
13846826E721392191757B9033D6F63F /* Protected.swift */,
AB64592703EA9A196B5C0F07BA1A918A /* SideMenuInteractionController.swift */,
1FE7B8C8447DD35D435B2AF4A23E221C /* SideMenuManager.swift */,
61AFB3209BCB97295281AC6437FB346B /* SideMenuPresentationController.swift */,
D154DB98A04C7BD96E4EFBBD3FE0008A /* SideMenuPresentationStyle.swift */,
30C3188EE68841BE36716860BE079AF8 /* SideMenuTransitionController.swift */,
8F8B09C72B577EFDB20A3EFF4F0C668A /* SideMenuNavigationController.swift */,
3ACA278071ED85D04DA83677D6C60528 /* UITableViewVibrantCell.swift */,
);
name = SideMenu;
path = ..;
sourceTree = "<group>";
};
B5D061624D54AFB703E72CCF860BDB15 /* Support Files */ = {
isa = PBXGroup;
children = (
E656C89A7C466C66F803FC806E30B29E /* SideMenu.modulemap */,
BB1EC6DFBB713FC2F280D596714173EC /* SideMenu.xcconfig */,
9CF977D7FB42D367F2810037EBA59B7D /* SideMenu-dummy.m */,
1D01FD908F7943A6131CA6F66DD0CA68 /* SideMenu-Info.plist */,
BD4CEC04022777F53C1CA2113A43FACE /* SideMenu-prefix.pch */,
36C5772477B00653D86343BABD123EF3 /* SideMenu-umbrella.h */,
);
name = "Support Files";
path = "Pods/Target Support Files/SideMenu";
sourceTree = "<group>";
};
C0834CEBB1379A84116EF29F93051C60 /* iOS */ = {
isa = PBXGroup;
children = (
@@ -177,6 +174,20 @@
name = iOS;
sourceTree = "<group>";
};
CE045EEBF674BD95DAEDB7C2EEECF5CE /* Support Files */ = {
isa = PBXGroup;
children = (
654DD97AF16A95330BAC230F687DE2D0 /* SideMenu.modulemap */,
F6FC615909FE86F0CAC222360D567BAE /* SideMenu.xcconfig */,
483ED806593206DE8305C4A1D90A247C /* SideMenu-dummy.m */,
03D51F4E3DB2BA91628B99A4A9922F8C /* SideMenu-Info.plist */,
32A195DE78A8DB13D93B3F7B4BE04865 /* SideMenu-prefix.pch */,
55355E067C04A719E5FBD54DC604AB00 /* SideMenu-umbrella.h */,
);
name = "Support Files";
path = "Pods/Target Support Files/SideMenu";
sourceTree = "<group>";
};
CE2E825F08D3AD0FD76E6D78D7512ED0 /* Targets Support Files */ = {
isa = PBXGroup;
children = (
@@ -189,7 +200,7 @@
isa = PBXGroup;
children = (
9D940727FF8FB9C785EB98E56350EF41 /* Podfile */,
E72796DEAFDB67EE8F2BEAFC93FCD96A /* Development Pods */,
2A7F78FEA350BF62EE25FB7AA75683E2 /* Development Pods */,
D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */,
0161DC4DC33723D9E6F365301D5BEA4B /* Products */,
CE2E825F08D3AD0FD76E6D78D7512ED0 /* Targets Support Files */,
@@ -204,14 +215,6 @@
name = Frameworks;
sourceTree = "<group>";
};
E72796DEAFDB67EE8F2BEAFC93FCD96A /* Development Pods */ = {
isa = PBXGroup;
children = (
B2A94553E0F1BCEBF406CC59D290924B /* SideMenu */,
);
name = "Development Pods";
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */
@@ -223,11 +226,11 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
E1521144D8813A046F85E2C67424FCEC /* Headers */ = {
28761BD3C505CCB36997450A19676357 /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
DA6F42990A37DF6179D6386008BB87F8 /* SideMenu-umbrella.h in Headers */,
D777716F0B6C0754B7B0230531743BC4 /* SideMenu-umbrella.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -255,12 +258,12 @@
};
C4A0A7D8591B67FB75E2E8D215E3735B /* SideMenu */ = {
isa = PBXNativeTarget;
buildConfigurationList = 935F4F1CC68EF5CF6D65BEC30B4BF4DD /* Build configuration list for PBXNativeTarget "SideMenu" */;
buildConfigurationList = 92707F899E1CD6FD63DCC66A3882B68C /* Build configuration list for PBXNativeTarget "SideMenu" */;
buildPhases = (
E1521144D8813A046F85E2C67424FCEC /* Headers */,
0F01CC2B72C51E08DB4D032E8D7612D3 /* Sources */,
B55A7DF9A704D60A5DE58A98398D7779 /* Frameworks */,
4F04DC9108B63EA99399A1A2B583B21F /* Resources */,
28761BD3C505CCB36997450A19676357 /* Headers */,
8B7A6B51F5DD73DE3F3F294B1BF713BE /* Sources */,
D9D87C2BC8D3C4B8382407D4C6B16014 /* Frameworks */,
E880A6A8817A45BC1BDE085DEC3399E0 /* Resources */,
);
buildRules = (
);
@@ -279,11 +282,6 @@
attributes = {
LastSwiftUpdateCheck = 1100;
LastUpgradeCheck = 1100;
TargetAttributes = {
0AEE99A309977BD12A049FF48AF9BA4B = {
LastSwiftMigration = 1020;
};
};
};
buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */;
compatibilityVersion = "Xcode 3.2";
@@ -304,7 +302,7 @@
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
4F04DC9108B63EA99399A1A2B583B21F /* Resources */ = {
E880A6A8817A45BC1BDE085DEC3399E0 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
@@ -321,24 +319,25 @@
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
0F01CC2B72C51E08DB4D032E8D7612D3 /* Sources */ = {
8B7A6B51F5DD73DE3F3F294B1BF713BE /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
8428210422E0540800C6F2D8 /* Deprecations.swift in Sources */,
31E79D7BA42208D00E73C18CBAF1598E /* Extensions.swift in Sources */,
BD5C0C12B6BB0BF6DA294E095B35E38D /* Initializable.swift in Sources */,
0D2D410A6087D4E0A54642165913EF30 /* Models.swift in Sources */,
6E6E17C0E8351D23CB4B20332C70BE61 /* Print.swift in Sources */,
384CBA8850C8BF3A7AAB3A3D78844B1E /* Protected.swift in Sources */,
F1967413D21BCA08963F09969D47E152 /* SideMenu-dummy.m in Sources */,
A2ACFE2D997BC8F1DA4EE3064A4270DD /* SideMenuInteractionController.swift in Sources */,
287FA1360FD3EF72D700C54856C685C1 /* SideMenuManager.swift in Sources */,
614FC39555CB129D97FC24B2D953A427 /* SideMenuPresentationController.swift in Sources */,
D0B45D0F0E7B359807CAFB744FB80CE4 /* SideMenuPresentationStyle.swift in Sources */,
FCBFE25630B6309DF3213AE0F6F34D1A /* SideMenuTransitionController.swift in Sources */,
032FEB01E4C88E7C87032FCF9780FC7C /* SideMenuNavigationController.swift in Sources */,
45A647715262A70BB9F2F4E7C1439C58 /* UITableViewVibrantCell.swift in Sources */,
D3D22BB8C279DC03EA91BFE3F5412477 /* Deprecations.swift in Sources */,
4E88B70410F6837FBD463EA4B6C33155 /* Extensions.swift in Sources */,
C798DA148F7F666F393F2009DDF73E35 /* Initializable.swift in Sources */,
D1BD7393C7934049B3E51D9C5A5CD8A0 /* Print.swift in Sources */,
905A503F069C27E841BAD9F4EFD4F1AF /* Protected.swift in Sources */,
08B5B89F28224381711F45A680C292D9 /* SideMenu-dummy.m in Sources */,
890FF25D0CCFF9BADECBA64DCCEFF4FF /* SideMenuAnimationController.swift in Sources */,
8C06632AA14D12278B1277AC0CC6A0B2 /* SideMenuInteractionController.swift in Sources */,
77AF2098DDCCAAE0CE4A20725C466905 /* SideMenuManager.swift in Sources */,
3846AFE38D1B63A9F0D9073C4ABC6DAA /* SideMenuNavigationController.swift in Sources */,
27D830F1CAC60B99CC0A135F583BFFF2 /* SideMenuPresentationController.swift in Sources */,
3E18B004D34ED5441A193684EEB25BD3 /* SideMenuPresentationStyle.swift in Sources */,
2ED518A3FA8DCBE08E621AC5C32844A9 /* SideMenuPushCoordinator.swift in Sources */,
09A0A5D3733F69E93F553ABBCF02FB77 /* SideMenuTransitionController.swift in Sources */,
C96A55C2A869A97AC4CA628A7F2A2A21 /* UITableViewVibrantCell.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -362,38 +361,6 @@
/* End PBXTargetDependency section */
/* Begin XCBuildConfiguration section */
03F2FCB145390B05104D185513A47C8B /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = BB1EC6DFBB713FC2F280D596714173EC /* SideMenu.xcconfig */;
buildSettings = {
CLANG_ENABLE_OBJC_WEAK = NO;
CODE_SIGN_IDENTITY = "";
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
CURRENT_PROJECT_VERSION = 1;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
GCC_PREFIX_HEADER = "Target Support Files/SideMenu/SideMenu-prefix.pch";
INFOPLIST_FILE = "Target Support Files/SideMenu/SideMenu-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
MODULEMAP_FILE = "Target Support Files/SideMenu/SideMenu.modulemap";
PRODUCT_MODULE_NAME = SideMenu;
PRODUCT_NAME = SideMenu;
SDKROOT = iphoneos;
SKIP_INSTALL = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
SWIFT_VERSION = 5;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Debug;
};
196DFA3E4A09A28224918543529A1885 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
@@ -463,7 +430,6 @@
baseConfigurationReference = 243410B9535472556EA4BB6DBC133A0D /* Pods-Example.release.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_WEAK = NO;
CODE_SIGN_IDENTITY = "";
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
@@ -487,6 +453,38 @@
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SDKROOT = iphoneos;
SKIP_INSTALL = YES;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Release;
};
770B68DA9F16B41CD7CDCD9737A856A2 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = F6FC615909FE86F0CAC222360D567BAE /* SideMenu.xcconfig */;
buildSettings = {
CLANG_ENABLE_OBJC_WEAK = NO;
CODE_SIGN_IDENTITY = "";
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
CURRENT_PROJECT_VERSION = 1;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
GCC_PREFIX_HEADER = "Target Support Files/SideMenu/SideMenu-prefix.pch";
INFOPLIST_FILE = "Target Support Files/SideMenu/SideMenu-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
MODULEMAP_FILE = "Target Support Files/SideMenu/SideMenu.modulemap";
PRODUCT_MODULE_NAME = SideMenu;
PRODUCT_NAME = SideMenu;
SDKROOT = iphoneos;
SKIP_INSTALL = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
@@ -495,6 +493,38 @@
};
name = Release;
};
8AF578EF61A3CC4C0D8327F2F282B110 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = F6FC615909FE86F0CAC222360D567BAE /* SideMenu.xcconfig */;
buildSettings = {
CLANG_ENABLE_OBJC_WEAK = NO;
CODE_SIGN_IDENTITY = "";
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
CURRENT_PROJECT_VERSION = 1;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
GCC_PREFIX_HEADER = "Target Support Files/SideMenu/SideMenu-prefix.pch";
INFOPLIST_FILE = "Target Support Files/SideMenu/SideMenu-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
MODULEMAP_FILE = "Target Support Files/SideMenu/SideMenu.modulemap";
PRODUCT_MODULE_NAME = SideMenu;
PRODUCT_NAME = SideMenu;
SDKROOT = iphoneos;
SKIP_INSTALL = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Debug;
};
B01D14FDC83DCF9D4BE53066BEA96D05 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
@@ -548,7 +578,8 @@
MTL_FAST_MATH = YES;
PRODUCT_NAME = "$(TARGET_NAME)";
STRIP_INSTALLED_PRODUCT = NO;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
SWIFT_VERSION = 5.0;
SYMROOT = "${SRCROOT}/../build";
};
@@ -559,7 +590,6 @@
baseConfigurationReference = B45138496B85A072654D1D0F8EBBEDE5 /* Pods-Example.debug.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_WEAK = NO;
CODE_SIGN_IDENTITY = "";
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
@@ -583,47 +613,12 @@
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SDKROOT = iphoneos;
SKIP_INSTALL = YES;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Debug;
};
FBB85502D70521CFA4D8AC919973525E /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = BB1EC6DFBB713FC2F280D596714173EC /* SideMenu.xcconfig */;
buildSettings = {
CLANG_ENABLE_OBJC_WEAK = NO;
CODE_SIGN_IDENTITY = "";
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
CURRENT_PROJECT_VERSION = 1;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
GCC_PREFIX_HEADER = "Target Support Files/SideMenu/SideMenu-prefix.pch";
INFOPLIST_FILE = "Target Support Files/SideMenu/SideMenu-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
MODULEMAP_FILE = "Target Support Files/SideMenu/SideMenu.modulemap";
PRODUCT_MODULE_NAME = SideMenu;
PRODUCT_NAME = SideMenu;
SDKROOT = iphoneos;
SKIP_INSTALL = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
SWIFT_VERSION = 5;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
@@ -645,11 +640,11 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
935F4F1CC68EF5CF6D65BEC30B4BF4DD /* Build configuration list for PBXNativeTarget "SideMenu" */ = {
92707F899E1CD6FD63DCC66A3882B68C /* Build configuration list for PBXNativeTarget "SideMenu" */ = {
isa = XCConfigurationList;
buildConfigurations = (
03F2FCB145390B05104D185513A47C8B /* Debug */,
FBB85502D70521CFA4D8AC919973525E /* Release */,
8AF578EF61A3CC4C0D8327F2F282B110 /* Debug */,
770B68DA9F16B41CD7CDCD9737A856A2 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@@ -1,16 +0,0 @@
#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
FOUNDATION_EXPORT double Pods_ExampleVersionNumber;
FOUNDATION_EXPORT const unsigned char Pods_ExampleVersionString[];
@@ -9,3 +9,4 @@ PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
PODS_ROOT = ${SRCROOT}/Pods
USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
@@ -9,3 +9,4 @@ PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
PODS_ROOT = ${SRCROOT}/Pods
USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
-16
View File
@@ -1,16 +0,0 @@
#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
FOUNDATION_EXPORT double SideMenuVersionNumber;
FOUNDATION_EXPORT const unsigned char SideMenuVersionString[];
+1
View File
@@ -7,3 +7,4 @@ PODS_ROOT = ${SRCROOT}
PODS_TARGET_SRCROOT = ${PODS_ROOT}/..
PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
SKIP_INSTALL = YES
USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
+15 -2
View File
@@ -19,6 +19,7 @@
* **[Installation](#installation)**
* [CocoaPods](#cocoapods)
* [Carthage](#carthage)
* [Swift Package Manager](#swift-package-manager)
* **[Usage](#usage)**
* [Code-less Storyboard Implementation](#code-less-storyboard-implementation)
* [Code Implementation](#code-implementation)
@@ -35,7 +36,7 @@
SideMenu is a simple and versatile side menu control written in Swift.
- [x] **It can be implemented in storyboard without a single line of [code](#code-less-storyboard-implementation).**
- [x] Four standard animation styles to choose from (there's even a parallax effect if you want to get weird).
- [x] Eight standard animation styles to choose from (there's even a parallax effect if you want to get weird).
- [x] Highly customizable without needing to write tons of custom code.
- [x] Supports continuous swiping between side menus on boths sides in a single gesture.
- [x] Global menu configuration. Set-up once and be done for all screens.
@@ -50,7 +51,7 @@ Check out the example project to see it in action!
| ![](https://raw.githubusercontent.com/jonkykong/SideMenu/master/etc/SlideOut.gif) | ![](https://raw.githubusercontent.com/jonkykong/SideMenu/master/etc/SlideIn.gif) | ![](https://raw.githubusercontent.com/jonkykong/SideMenu/master/etc/Dissolve.gif) | ![](https://raw.githubusercontent.com/jonkykong/SideMenu/master/etc/InOut.gif) |
## Requirements
- [x] Xcode 10.
- [x] Xcode 11.
- [x] Swift 5.
- [x] iOS 10 or higher.
@@ -102,6 +103,18 @@ To integrate SideMenu into your Xcode project using Carthage, specify it in your
github "jonkykong/SideMenu" "master"
```
### Swift Package Manager
The [Swift Package Manager](https://swift.org/package-manager/) is a tool for automating the distribution of Swift code and is integrated into the `swift` compiler. It is in early development, but SideMenu does support its use on supported platforms.
Once you have your Swift package set up, adding SideMenu as a dependency is as easy as adding it to the `dependencies` value of your `Package.swift`.
```swift
dependencies: [
.package(url: "https://github.com/jonkykong/SideMenu.git", from: "6.0.0")
]
```
## Usage
### Code-less Storyboard Implementation
1. Create a Navigation Controller for a side menu. Set the `Custom Class` of the Navigation Controller to be `SideMenuNavigationController` in the **Identity Inspector**. Set the `Module` to `SideMenu` (ignore this step if you've manually added SideMenu to your project). Create a Root View Controller for the Navigation Controller (shown as a UITableViewController below). Set up any Triggered Segues you want in that view controller.
+1 -1
View File
@@ -8,7 +8,7 @@
Pod::Spec.new do |s|
s.name = "SideMenu"
s.version = "6.2.2"
s.version = "6.4.6"
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.
+88 -69
View File
@@ -7,7 +7,7 @@
objects = {
/* Begin PBXBuildFile section */
65FF1B3E1DE321D8007B0845 /* SideMenu.h in Headers */ = {isa = PBXBuildFile; fileRef = 65FF1B3D1DE321D8007B0845 /* SideMenu.h */; settings = {ATTRIBUTES = (Public, ); }; };
055AE0A193A9EA88D3279D68 /* Pods_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 38DA39CCF181EA30E4346328 /* Pods_Example.framework */; };
7B48A0D61DCB2487002990A1 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B48A0D51DCB2487002990A1 /* AppDelegate.swift */; };
7B48A0DD1DCB2487002990A1 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7B48A0DC1DCB2487002990A1 /* Assets.xcassets */; };
7B48A0F61DCB2518002990A1 /* MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B48A0F31DCB2518002990A1 /* MainViewController.swift */; };
@@ -15,24 +15,25 @@
7B48A0F81DCB2518002990A1 /* SideMenuTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B48A0F51DCB2518002990A1 /* SideMenuTableViewController.swift */; };
7B552D5D1DCC65830010301C /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7B552D5C1DCC65830010301C /* Launch Screen.storyboard */; };
7B5FA9B61DCB269700278DF6 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7B5FA9B51DCB269700278DF6 /* Main.storyboard */; };
84276D8A2282929A0095B7C5 /* SideMenuManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84276D892282929A0095B7C5 /* SideMenuManager.swift */; };
842820EF22DDD1BC00C6F2D8 /* Protected.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842820EE22DDD1BC00C6F2D8 /* Protected.swift */; };
842820F622DDD1E800C6F2D8 /* SideMenuPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842820F022DDD1E800C6F2D8 /* SideMenuPresentationController.swift */; };
842820F722DDD1E800C6F2D8 /* Models.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842820F122DDD1E800C6F2D8 /* Models.swift */; };
842820F822DDD1E800C6F2D8 /* SideMenuTransitionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842820F222DDD1E800C6F2D8 /* SideMenuTransitionController.swift */; };
842820F922DDD1E800C6F2D8 /* Print.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842820F322DDD1E800C6F2D8 /* Print.swift */; };
842820FA22DDD1E800C6F2D8 /* Initializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842820F422DDD1E800C6F2D8 /* Initializable.swift */; };
842820FB22DDD1E800C6F2D8 /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842820F522DDD1E800C6F2D8 /* Extensions.swift */; };
842820FD22DDD21100C6F2D8 /* SideMenuPresentationStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842820FC22DDD21100C6F2D8 /* SideMenuPresentationStyle.swift */; };
842820FF22DDD24200C6F2D8 /* SideMenuInteractionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842820FE22DDD24200C6F2D8 /* SideMenuInteractionController.swift */; };
8428210322E0449300C6F2D8 /* Deprecations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8428210222E0449300C6F2D8 /* Deprecations.swift */; };
8432CC0422FFBCF5003D2BBD /* ExampleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8432CC0322FFBCF5003D2BBD /* ExampleTests.swift */; };
8461A2D51E145A08001DA4F8 /* SideMenuNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8461A2D11E145A08001DA4F8 /* SideMenuNavigationController.swift */; };
8461A2D61E145A08001DA4F8 /* UITableViewVibrantCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8461A2D21E145A08001DA4F8 /* UITableViewVibrantCell.swift */; };
849F7B9623210C9A005DEB6A /* UITableViewVibrantCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B8823210C9A005DEB6A /* UITableViewVibrantCell.swift */; };
849F7B9723210C9A005DEB6A /* SideMenuTransitionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B8923210C9A005DEB6A /* SideMenuTransitionController.swift */; };
849F7B9823210C9A005DEB6A /* SideMenuAnimationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B8A23210C9A005DEB6A /* SideMenuAnimationController.swift */; };
849F7B9923210C9A005DEB6A /* SideMenuInteractionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B8B23210C9A005DEB6A /* SideMenuInteractionController.swift */; };
849F7B9A23210C9A005DEB6A /* Initializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B8C23210C9A005DEB6A /* Initializable.swift */; };
849F7B9B23210C9A005DEB6A /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B8D23210C9A005DEB6A /* Extensions.swift */; };
849F7B9C23210C9A005DEB6A /* SideMenuPresentationStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B8E23210C9A005DEB6A /* SideMenuPresentationStyle.swift */; };
849F7B9D23210C9A005DEB6A /* SideMenuNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B8F23210C9A005DEB6A /* SideMenuNavigationController.swift */; };
849F7B9E23210C9A005DEB6A /* SideMenuPushCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B9023210C9A005DEB6A /* SideMenuPushCoordinator.swift */; };
849F7B9F23210C9A005DEB6A /* Deprecations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B9123210C9A005DEB6A /* Deprecations.swift */; };
849F7BA023210C9A005DEB6A /* Print.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B9223210C9A005DEB6A /* Print.swift */; };
849F7BA123210C9A005DEB6A /* SideMenuPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B9323210C9A005DEB6A /* SideMenuPresentationController.swift */; };
849F7BA223210C9A005DEB6A /* SideMenuManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B9423210C9A005DEB6A /* SideMenuManager.swift */; };
849F7BA323210C9A005DEB6A /* Protected.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849F7B9523210C9A005DEB6A /* Protected.swift */; };
849F7BA423225F7F005DEB6A /* SideMenu.h in Headers */ = {isa = PBXBuildFile; fileRef = 849F7B67232104BD005DEB6A /* SideMenu.h */; settings = {ATTRIBUTES = (Public, ); }; };
84B489B51DD469B000D6CB43 /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = 84B489B21DD469B000D6CB43 /* LICENSE */; };
84B489B71DD469B000D6CB43 /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = 84B489B41DD469B000D6CB43 /* README.md */; };
84B489BA1DD469DA00D6CB43 /* SideMenu.podspec in Resources */ = {isa = PBXBuildFile; fileRef = 84B489B91DD469DA00D6CB43 /* SideMenu.podspec */; };
ACD6DAED90DE36FEA68CDF38 /* Pods_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 47896ABC5C8830D88945A8D3 /* Pods_Example.framework */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -43,14 +44,19 @@
remoteGlobalIDString = 7B48A0D21DCB2487002990A1;
remoteInfo = Example;
};
84418E042362E364002DE07F /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 7B9DC8FB1DC6E8C1000D4007 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 7B9DC9031DC6E8C1000D4007;
remoteInfo = SideMenu;
};
/* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */
1F17B9D56ADA958C611FAA83 /* Pods-Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Example/Pods-Example.debug.xcconfig"; sourceTree = "<group>"; };
281FB58A39C022692CEEBF0D /* Pods-Example-ExampleTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example-ExampleTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Example-ExampleTests/Pods-Example-ExampleTests.debug.xcconfig"; sourceTree = "<group>"; };
47896ABC5C8830D88945A8D3 /* Pods_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; };
52C8DD7BE43A8987854CA726 /* Pods_Example_ExampleTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Example_ExampleTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
65FF1B3D1DE321D8007B0845 /* SideMenu.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SideMenu.h; path = SideMenu/SideMenu.h; sourceTree = "<group>"; };
38DA39CCF181EA30E4346328 /* Pods_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; };
7B48A0D31DCB2487002990A1 /* Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Example.app; sourceTree = BUILT_PRODUCTS_DIR; };
7B48A0D51DCB2487002990A1 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
7B48A0DC1DCB2487002990A1 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
@@ -61,30 +67,33 @@
7B552D5C1DCC65830010301C /* Launch Screen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = "Launch Screen.storyboard"; sourceTree = "<group>"; };
7B5FA9B51DCB269700278DF6 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = "<group>"; };
7B9DC9041DC6E8C1000D4007 /* SideMenu.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SideMenu.framework; sourceTree = BUILT_PRODUCTS_DIR; };
84276D892282929A0095B7C5 /* SideMenuManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SideMenuManager.swift; path = Pod/Classes/SideMenuManager.swift; sourceTree = "<group>"; };
842820EE22DDD1BC00C6F2D8 /* Protected.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Protected.swift; path = Pod/Classes/Protected.swift; sourceTree = "<group>"; };
842820F022DDD1E800C6F2D8 /* SideMenuPresentationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SideMenuPresentationController.swift; path = Pod/Classes/SideMenuPresentationController.swift; sourceTree = "<group>"; };
842820F122DDD1E800C6F2D8 /* Models.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Models.swift; path = Pod/Classes/Models.swift; sourceTree = "<group>"; };
842820F222DDD1E800C6F2D8 /* SideMenuTransitionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SideMenuTransitionController.swift; path = Pod/Classes/SideMenuTransitionController.swift; sourceTree = "<group>"; };
842820F322DDD1E800C6F2D8 /* Print.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Print.swift; path = Pod/Classes/Print.swift; sourceTree = "<group>"; };
842820F422DDD1E800C6F2D8 /* Initializable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Initializable.swift; path = Pod/Classes/Initializable.swift; sourceTree = "<group>"; };
842820F522DDD1E800C6F2D8 /* Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Extensions.swift; path = Pod/Classes/Extensions.swift; sourceTree = "<group>"; };
842820FC22DDD21100C6F2D8 /* SideMenuPresentationStyle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SideMenuPresentationStyle.swift; path = Pod/Classes/SideMenuPresentationStyle.swift; sourceTree = "<group>"; };
842820FE22DDD24200C6F2D8 /* SideMenuInteractionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SideMenuInteractionController.swift; path = Pod/Classes/SideMenuInteractionController.swift; sourceTree = "<group>"; };
8428210222E0449300C6F2D8 /* Deprecations.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Deprecations.swift; path = Pod/Classes/Deprecations.swift; sourceTree = "<group>"; };
8432CC0122FFBCF4003D2BBD /* ExampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ExampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
8432CC0322FFBCF5003D2BBD /* ExampleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExampleTests.swift; sourceTree = "<group>"; };
8432CC0522FFBCF5003D2BBD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
8461A2D11E145A08001DA4F8 /* SideMenuNavigationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SideMenuNavigationController.swift; path = Pod/Classes/SideMenuNavigationController.swift; sourceTree = "<group>"; };
8461A2D21E145A08001DA4F8 /* UITableViewVibrantCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = UITableViewVibrantCell.swift; path = Pod/Classes/UITableViewVibrantCell.swift; sourceTree = "<group>"; };
849F7B67232104BD005DEB6A /* SideMenu.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SideMenu.h; path = SideMenu/SideMenu.h; sourceTree = "<group>"; };
849F7B8823210C9A005DEB6A /* UITableViewVibrantCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = UITableViewVibrantCell.swift; path = Pod/Classes/UITableViewVibrantCell.swift; sourceTree = "<group>"; };
849F7B8923210C9A005DEB6A /* SideMenuTransitionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SideMenuTransitionController.swift; path = Pod/Classes/SideMenuTransitionController.swift; sourceTree = "<group>"; };
849F7B8A23210C9A005DEB6A /* SideMenuAnimationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SideMenuAnimationController.swift; path = Pod/Classes/SideMenuAnimationController.swift; sourceTree = "<group>"; };
849F7B8B23210C9A005DEB6A /* SideMenuInteractionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SideMenuInteractionController.swift; path = Pod/Classes/SideMenuInteractionController.swift; sourceTree = "<group>"; };
849F7B8C23210C9A005DEB6A /* Initializable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Initializable.swift; path = Pod/Classes/Initializable.swift; sourceTree = "<group>"; };
849F7B8D23210C9A005DEB6A /* Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Extensions.swift; path = Pod/Classes/Extensions.swift; sourceTree = "<group>"; };
849F7B8E23210C9A005DEB6A /* SideMenuPresentationStyle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SideMenuPresentationStyle.swift; path = Pod/Classes/SideMenuPresentationStyle.swift; sourceTree = "<group>"; };
849F7B8F23210C9A005DEB6A /* SideMenuNavigationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SideMenuNavigationController.swift; path = Pod/Classes/SideMenuNavigationController.swift; sourceTree = "<group>"; };
849F7B9023210C9A005DEB6A /* SideMenuPushCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SideMenuPushCoordinator.swift; path = Pod/Classes/SideMenuPushCoordinator.swift; sourceTree = "<group>"; };
849F7B9123210C9A005DEB6A /* Deprecations.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Deprecations.swift; path = Pod/Classes/Deprecations.swift; sourceTree = "<group>"; };
849F7B9223210C9A005DEB6A /* Print.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Print.swift; path = Pod/Classes/Print.swift; sourceTree = "<group>"; };
849F7B9323210C9A005DEB6A /* SideMenuPresentationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SideMenuPresentationController.swift; path = Pod/Classes/SideMenuPresentationController.swift; sourceTree = "<group>"; };
849F7B9423210C9A005DEB6A /* SideMenuManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SideMenuManager.swift; path = Pod/Classes/SideMenuManager.swift; sourceTree = "<group>"; };
849F7B9523210C9A005DEB6A /* Protected.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Protected.swift; path = Pod/Classes/Protected.swift; sourceTree = "<group>"; };
84B489B21DD469B000D6CB43 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = "<group>"; };
84B489B41DD469B000D6CB43 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
84B489B91DD469DA00D6CB43 /* SideMenu.podspec */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = SideMenu.podspec; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
84FFB98523556C1600E241DA /* SideMenu.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SideMenu.framework; sourceTree = BUILT_PRODUCTS_DIR; };
84FFB98723556C4400E241DA /* SideMenu.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SideMenu.framework; sourceTree = BUILT_PRODUCTS_DIR; };
C5943C005BBB10263AFAC91E /* Pods-ExampleTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ExampleTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ExampleTests/Pods-ExampleTests.debug.xcconfig"; sourceTree = "<group>"; };
C7DA85E73FE6228663AD9236 /* Pods-Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example.release.xcconfig"; path = "Pods/Target Support Files/Pods-Example/Pods-Example.release.xcconfig"; sourceTree = "<group>"; };
C9E09E1C686BF24AD4976EA7 /* Pods-ExampleTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ExampleTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-ExampleTests/Pods-ExampleTests.release.xcconfig"; sourceTree = "<group>"; };
CAE41BBB5F14E59C1FA0A821 /* Pods-Example-ExampleTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example-ExampleTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-Example-ExampleTests/Pods-Example-ExampleTests.release.xcconfig"; sourceTree = "<group>"; };
D1435FAD2F735E43F383BE96 /* Pods_ExampleTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ExampleTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -92,7 +101,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
ACD6DAED90DE36FEA68CDF38 /* Pods_Example.framework in Frameworks */,
055AE0A193A9EA88D3279D68 /* Pods_Example.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -125,20 +134,21 @@
65FF1B3F1DE33097007B0845 /* Source */ = {
isa = PBXGroup;
children = (
8428210222E0449300C6F2D8 /* Deprecations.swift */,
842820F522DDD1E800C6F2D8 /* Extensions.swift */,
842820F422DDD1E800C6F2D8 /* Initializable.swift */,
842820F122DDD1E800C6F2D8 /* Models.swift */,
842820F322DDD1E800C6F2D8 /* Print.swift */,
842820EE22DDD1BC00C6F2D8 /* Protected.swift */,
65FF1B3D1DE321D8007B0845 /* SideMenu.h */,
842820FE22DDD24200C6F2D8 /* SideMenuInteractionController.swift */,
84276D892282929A0095B7C5 /* SideMenuManager.swift */,
842820F022DDD1E800C6F2D8 /* SideMenuPresentationController.swift */,
842820FC22DDD21100C6F2D8 /* SideMenuPresentationStyle.swift */,
842820F222DDD1E800C6F2D8 /* SideMenuTransitionController.swift */,
8461A2D11E145A08001DA4F8 /* SideMenuNavigationController.swift */,
8461A2D21E145A08001DA4F8 /* UITableViewVibrantCell.swift */,
849F7B67232104BD005DEB6A /* SideMenu.h */,
849F7B9123210C9A005DEB6A /* Deprecations.swift */,
849F7B8D23210C9A005DEB6A /* Extensions.swift */,
849F7B8C23210C9A005DEB6A /* Initializable.swift */,
849F7B9223210C9A005DEB6A /* Print.swift */,
849F7B9523210C9A005DEB6A /* Protected.swift */,
849F7B8A23210C9A005DEB6A /* SideMenuAnimationController.swift */,
849F7B8B23210C9A005DEB6A /* SideMenuInteractionController.swift */,
849F7B9423210C9A005DEB6A /* SideMenuManager.swift */,
849F7B8F23210C9A005DEB6A /* SideMenuNavigationController.swift */,
849F7B9323210C9A005DEB6A /* SideMenuPresentationController.swift */,
849F7B8E23210C9A005DEB6A /* SideMenuPresentationStyle.swift */,
849F7B9023210C9A005DEB6A /* SideMenuPushCoordinator.swift */,
849F7B8923210C9A005DEB6A /* SideMenuTransitionController.swift */,
849F7B8823210C9A005DEB6A /* UITableViewVibrantCell.swift */,
);
name = Source;
sourceTree = "<group>";
@@ -166,7 +176,7 @@
8432CC0222FFBCF5003D2BBD /* ExampleTests */,
7B9DC9051DC6E8C1000D4007 /* Products */,
9FB98148377EAEC00E35AC14 /* Pods */,
9C94EEEBD250FF394115AAFC /* Frameworks */,
84FFB98323556BD900E241DA /* Frameworks */,
);
sourceTree = "<group>";
};
@@ -199,12 +209,12 @@
name = "Podspec Metadata";
sourceTree = "<group>";
};
9C94EEEBD250FF394115AAFC /* Frameworks */ = {
84FFB98323556BD900E241DA /* Frameworks */ = {
isa = PBXGroup;
children = (
47896ABC5C8830D88945A8D3 /* Pods_Example.framework */,
D1435FAD2F735E43F383BE96 /* Pods_ExampleTests.framework */,
52C8DD7BE43A8987854CA726 /* Pods_Example_ExampleTests.framework */,
84FFB98723556C4400E241DA /* SideMenu.framework */,
84FFB98523556C1600E241DA /* SideMenu.framework */,
38DA39CCF181EA30E4346328 /* Pods_Example.framework */,
);
name = Frameworks;
sourceTree = "<group>";
@@ -229,7 +239,7 @@
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
65FF1B3E1DE321D8007B0845 /* SideMenu.h in Headers */,
849F7BA423225F7F005DEB6A /* SideMenu.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -249,6 +259,7 @@
buildRules = (
);
dependencies = (
84418E052362E364002DE07F /* PBXTargetDependency */,
);
name = Example;
productName = Example;
@@ -309,7 +320,7 @@
};
7B9DC9031DC6E8C1000D4007 = {
CreatedOnToolsVersion = 8.0;
LastSwiftMigration = 0900;
LastSwiftMigration = 1030;
ProvisioningStyle = Automatic;
};
8432CC0022FFBCF4003D2BBD = {
@@ -426,19 +437,20 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
842820EF22DDD1BC00C6F2D8 /* Protected.swift in Sources */,
8461A2D51E145A08001DA4F8 /* SideMenuNavigationController.swift in Sources */,
842820FD22DDD21100C6F2D8 /* SideMenuPresentationStyle.swift in Sources */,
842820F822DDD1E800C6F2D8 /* SideMenuTransitionController.swift in Sources */,
842820FF22DDD24200C6F2D8 /* SideMenuInteractionController.swift in Sources */,
842820F922DDD1E800C6F2D8 /* Print.swift in Sources */,
84276D8A2282929A0095B7C5 /* SideMenuManager.swift in Sources */,
842820FB22DDD1E800C6F2D8 /* Extensions.swift in Sources */,
842820F722DDD1E800C6F2D8 /* Models.swift in Sources */,
842820F622DDD1E800C6F2D8 /* SideMenuPresentationController.swift in Sources */,
842820FA22DDD1E800C6F2D8 /* Initializable.swift in Sources */,
8428210322E0449300C6F2D8 /* Deprecations.swift in Sources */,
8461A2D61E145A08001DA4F8 /* UITableViewVibrantCell.swift in Sources */,
849F7B9923210C9A005DEB6A /* SideMenuInteractionController.swift in Sources */,
849F7B9B23210C9A005DEB6A /* Extensions.swift in Sources */,
849F7BA323210C9A005DEB6A /* Protected.swift in Sources */,
849F7B9F23210C9A005DEB6A /* Deprecations.swift in Sources */,
849F7B9A23210C9A005DEB6A /* Initializable.swift in Sources */,
849F7BA223210C9A005DEB6A /* SideMenuManager.swift in Sources */,
849F7B9E23210C9A005DEB6A /* SideMenuPushCoordinator.swift in Sources */,
849F7BA123210C9A005DEB6A /* SideMenuPresentationController.swift in Sources */,
849F7B9C23210C9A005DEB6A /* SideMenuPresentationStyle.swift in Sources */,
849F7B9823210C9A005DEB6A /* SideMenuAnimationController.swift in Sources */,
849F7BA023210C9A005DEB6A /* Print.swift in Sources */,
849F7B9723210C9A005DEB6A /* SideMenuTransitionController.swift in Sources */,
849F7B9623210C9A005DEB6A /* UITableViewVibrantCell.swift in Sources */,
849F7B9D23210C9A005DEB6A /* SideMenuNavigationController.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -458,6 +470,11 @@
target = 7B48A0D21DCB2487002990A1 /* Example */;
targetProxy = 8432CC0622FFBCF5003D2BBD /* PBXContainerItemProxy */;
};
84418E052362E364002DE07F /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 7B9DC9031DC6E8C1000D4007 /* SideMenu */;
targetProxy = 84418E042362E364002DE07F /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin XCBuildConfiguration section */
@@ -465,9 +482,9 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 1F17B9D56ADA958C611FAA83 /* Pods-Example.debug.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
INFOPLIST_FILE = Example/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.jonkykong.Example;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -479,9 +496,9 @@
isa = XCBuildConfiguration;
baseConfigurationReference = C7DA85E73FE6228663AD9236 /* Pods-Example.release.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
INFOPLIST_FILE = Example/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.jonkykong.Example;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -523,6 +540,7 @@
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1;
DEBUG_INFORMATION_FORMAT = dwarf;
DEFINES_MODULE = YES;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
@@ -586,6 +604,7 @@
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEFINES_MODULE = YES;
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
@@ -6,6 +6,20 @@
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C4A0A7D8591B67FB75E2E8D215E3735B"
BuildableName = "SideMenu.framework"
BlueprintName = "SideMenu"
ReferencedContainer = "container:Pods/Pods.xcodeproj">
</BuildableReference>
</BuildActionEntry>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
@@ -27,6 +41,15 @@
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "7B48A0D21DCB2487002990A1"
BuildableName = "Example.app"
BlueprintName = "Example"
ReferencedContainer = "container:SideMenu.xcodeproj">
</BuildableReference>
</MacroExpansion>
<Testables>
<TestableReference
skipped = "NO">
@@ -39,17 +62,6 @@
</BuildableReference>
</TestableReference>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "7B48A0D21DCB2487002990A1"
BuildableName = "Example.app"
BlueprintName = "Example"
ReferencedContainer = "container:SideMenu.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
@@ -71,8 +83,6 @@
ReferencedContainer = "container:SideMenu.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"