├── .gitignore ├── Example ├── MNFloatBtn.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ └── xcshareddata │ │ └── xcschemes │ │ └── MNFloatBtn-Example.xcscheme ├── MNFloatBtn.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── MNFloatBtn │ ├── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard │ ├── Images.xcassets │ │ ├── AppIcon.appiconset │ │ │ └── Contents.json │ │ └── Contents.json │ ├── MNAppDelegate.h │ ├── MNAppDelegate.m │ ├── MNFloatBtn-Info.plist │ ├── MNFloatBtn-Prefix.pch │ ├── MNViewController.h │ ├── MNViewController.m │ ├── OneViewController.h │ ├── OneViewController.m │ ├── en.lproj │ │ └── InfoPlist.strings │ └── main.m ├── Podfile ├── Podfile.lock └── Pods │ ├── Local Podspecs │ └── MNFloatBtn.podspec.json │ ├── MNFloatBtn │ ├── LICENSE │ ├── MNFloatBtn │ │ ├── MNFloatBtn.bundle │ │ │ ├── Root.plist │ │ │ ├── en.lproj │ │ │ │ └── Root.strings │ │ │ ├── mn_placeholder@2x.png │ │ │ └── mn_placeholder@3x.png │ │ ├── MNFloatBtn.h │ │ ├── MNFloatBtn.m │ │ ├── NSDate+MNDate.h │ │ └── NSDate+MNDate.m │ └── README.md │ ├── Manifest.lock │ ├── Pods.xcodeproj │ └── project.pbxproj │ └── Target Support Files │ ├── MNFloatBtn │ ├── MNFloatBtn-Info.plist │ ├── MNFloatBtn-dummy.m │ ├── MNFloatBtn-prefix.pch │ ├── MNFloatBtn-umbrella.h │ ├── MNFloatBtn.modulemap │ └── MNFloatBtn.xcconfig │ ├── Pods-MNFloatBtn_Example │ ├── Info.plist │ ├── Pods-MNFloatBtn_Example-Info.plist │ ├── Pods-MNFloatBtn_Example-acknowledgements.markdown │ ├── Pods-MNFloatBtn_Example-acknowledgements.plist │ ├── Pods-MNFloatBtn_Example-dummy.m │ ├── Pods-MNFloatBtn_Example-frameworks.sh │ ├── Pods-MNFloatBtn_Example-resources.sh │ ├── Pods-MNFloatBtn_Example-umbrella.h │ ├── Pods-MNFloatBtn_Example.debug.xcconfig │ ├── Pods-MNFloatBtn_Example.modulemap │ └── Pods-MNFloatBtn_Example.release.xcconfig │ └── Pods-MNFloatBtn_Tests │ ├── Info.plist │ ├── Pods-MNFloatBtn_Tests-Info.plist │ ├── Pods-MNFloatBtn_Tests-acknowledgements.markdown │ ├── Pods-MNFloatBtn_Tests-acknowledgements.plist │ ├── Pods-MNFloatBtn_Tests-dummy.m │ ├── Pods-MNFloatBtn_Tests-frameworks.sh │ ├── Pods-MNFloatBtn_Tests-resources.sh │ ├── Pods-MNFloatBtn_Tests-umbrella.h │ ├── Pods-MNFloatBtn_Tests.debug.xcconfig │ ├── Pods-MNFloatBtn_Tests.modulemap │ └── Pods-MNFloatBtn_Tests.release.xcconfig ├── LICENSE ├── MNFloatBtn.podspec ├── MNFloatBtn ├── MNFloatBtn.bundle │ ├── Root.plist │ ├── en.lproj │ │ └── Root.strings │ ├── mn_placeholder@2x.png │ └── mn_placeholder@3x.png ├── MNFloatBtn.h ├── MNFloatBtn.m ├── MNFloatContentBtn.h ├── MNFloatContentBtn.m ├── NSDate+MNDate.h └── NSDate+MNDate.m ├── README.md └── Resources ├── demo.gif └── demo2.gif /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## Build generated 6 | build/ 7 | DerivedData/ 8 | 9 | ## Various settings 10 | *.pbxuser 11 | !default.pbxuser 12 | *.mode1v3 13 | !default.mode1v3 14 | *.mode2v3 15 | !default.mode2v3 16 | *.perspectivev3 17 | !default.perspectivev3 18 | xcuserdata/ 19 | 20 | ## Other 21 | *.moved-aside 22 | *.xccheckout 23 | *.xcscmblueprint 24 | 25 | ## Obj-C/Swift specific 26 | *.hmap 27 | *.ipa 28 | *.dSYM.zip 29 | *.dSYM 30 | 31 | # CocoaPods 32 | # 33 | # We recommend against adding the Pods directory to your .gitignore. However 34 | # you should judge for yourself, the pros and cons are mentioned at: 35 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 36 | # 37 | # Pods/ 38 | 39 | # Carthage 40 | # 41 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 42 | # Carthage/Checkouts 43 | 44 | Carthage/Build 45 | 46 | # fastlane 47 | # 48 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 49 | # screenshots whenever they are needed. 50 | # For more information about the recommended setup visit: 51 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 52 | 53 | fastlane/report.xml 54 | fastlane/Preview.html 55 | fastlane/screenshots 56 | fastlane/test_output 57 | 58 | # Code Injection 59 | # 60 | # After new code Injection tools there's a generated folder /iOSInjectionProject 61 | # https://github.com/johnno1962/injectionforxcode 62 | 63 | iOSInjectionProject/ 64 | -------------------------------------------------------------------------------- /Example/MNFloatBtn.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 58B2BB4422390FB3005ED735 /* NSDate+MNDate.m in Sources */ = {isa = PBXBuildFile; fileRef = 58B2BB4122390FB3005ED735 /* NSDate+MNDate.m */; }; 11 | 58B2BB4522390FB3005ED735 /* MNFloatBtn.m in Sources */ = {isa = PBXBuildFile; fileRef = 58B2BB4222390FB3005ED735 /* MNFloatBtn.m */; }; 12 | 58B2BB4622390FB3005ED735 /* MNFloatBtn.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 58B2BB4322390FB3005ED735 /* MNFloatBtn.bundle */; }; 13 | 6003F58E195388D20070C39A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58D195388D20070C39A /* Foundation.framework */; }; 14 | 6003F590195388D20070C39A /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58F195388D20070C39A /* CoreGraphics.framework */; }; 15 | 6003F592195388D20070C39A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F591195388D20070C39A /* UIKit.framework */; }; 16 | 6003F598195388D20070C39A /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6003F596195388D20070C39A /* InfoPlist.strings */; }; 17 | 6003F59A195388D20070C39A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F599195388D20070C39A /* main.m */; }; 18 | 6003F59E195388D20070C39A /* MNAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F59D195388D20070C39A /* MNAppDelegate.m */; }; 19 | 6003F5A7195388D20070C39A /* MNViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F5A6195388D20070C39A /* MNViewController.m */; }; 20 | 6003F5A9195388D20070C39A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6003F5A8195388D20070C39A /* Images.xcassets */; }; 21 | 6003F5B0195388D20070C39A /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F5AF195388D20070C39A /* XCTest.framework */; }; 22 | 6003F5B1195388D20070C39A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58D195388D20070C39A /* Foundation.framework */; }; 23 | 6003F5B2195388D20070C39A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F591195388D20070C39A /* UIKit.framework */; }; 24 | 71719F9F1E33DC2100824A3D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 71719F9D1E33DC2100824A3D /* LaunchScreen.storyboard */; }; 25 | 873B8AEB1B1F5CCA007FD442 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 873B8AEA1B1F5CCA007FD442 /* Main.storyboard */; }; 26 | A7B4238B219717D400C20287 /* OneViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A7B4238A219717D300C20287 /* OneViewController.m */; }; 27 | BECCFC883A024E630155EEC8 /* Pods_MNFloatBtn_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B8F867C28DAF1704F15CE2AF /* Pods_MNFloatBtn_Tests.framework */; }; 28 | FF3F5C007C4F2D0C7379C089 /* Pods_MNFloatBtn_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 216653D39542B61925B2CCB3 /* Pods_MNFloatBtn_Example.framework */; }; 29 | /* End PBXBuildFile section */ 30 | 31 | /* Begin PBXContainerItemProxy section */ 32 | 6003F5B3195388D20070C39A /* PBXContainerItemProxy */ = { 33 | isa = PBXContainerItemProxy; 34 | containerPortal = 6003F582195388D10070C39A /* Project object */; 35 | proxyType = 1; 36 | remoteGlobalIDString = 6003F589195388D20070C39A; 37 | remoteInfo = MNFloatBtn; 38 | }; 39 | /* End PBXContainerItemProxy section */ 40 | 41 | /* Begin PBXFileReference section */ 42 | 216653D39542B61925B2CCB3 /* Pods_MNFloatBtn_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MNFloatBtn_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 43 | 58B2BB3F22390FB3005ED735 /* MNFloatBtn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MNFloatBtn.h; sourceTree = ""; }; 44 | 58B2BB4022390FB3005ED735 /* NSDate+MNDate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDate+MNDate.h"; sourceTree = ""; }; 45 | 58B2BB4122390FB3005ED735 /* NSDate+MNDate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDate+MNDate.m"; sourceTree = ""; }; 46 | 58B2BB4222390FB3005ED735 /* MNFloatBtn.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MNFloatBtn.m; sourceTree = ""; }; 47 | 58B2BB4322390FB3005ED735 /* MNFloatBtn.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = MNFloatBtn.bundle; sourceTree = ""; }; 48 | 6003F58A195388D20070C39A /* MNFloatBtn_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MNFloatBtn_Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 49 | 6003F58D195388D20070C39A /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 50 | 6003F58F195388D20070C39A /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 51 | 6003F591195388D20070C39A /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 52 | 6003F595195388D20070C39A /* MNFloatBtn-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "MNFloatBtn-Info.plist"; sourceTree = ""; }; 53 | 6003F597195388D20070C39A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 54 | 6003F599195388D20070C39A /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 55 | 6003F59B195388D20070C39A /* MNFloatBtn-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MNFloatBtn-Prefix.pch"; sourceTree = ""; }; 56 | 6003F59C195388D20070C39A /* MNAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MNAppDelegate.h; sourceTree = ""; }; 57 | 6003F59D195388D20070C39A /* MNAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MNAppDelegate.m; sourceTree = ""; }; 58 | 6003F5A5195388D20070C39A /* MNViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MNViewController.h; sourceTree = ""; }; 59 | 6003F5A6195388D20070C39A /* MNViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MNViewController.m; sourceTree = ""; }; 60 | 6003F5A8195388D20070C39A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 61 | 6003F5AE195388D20070C39A /* MNFloatBtn_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MNFloatBtn_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 62 | 6003F5AF195388D20070C39A /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 63 | 71719F9E1E33DC2100824A3D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 64 | 773A5637FC6A607D1066CDC5 /* Pods-MNFloatBtn_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MNFloatBtn_Example.release.xcconfig"; path = "Pods/Target Support Files/Pods-MNFloatBtn_Example/Pods-MNFloatBtn_Example.release.xcconfig"; sourceTree = ""; }; 65 | 873B8AEA1B1F5CCA007FD442 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = Main.storyboard; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 66 | 8B631F8CD1EF7980CE886F2F /* Pods-MNFloatBtn_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MNFloatBtn_Example.debug.xcconfig"; path = "Pods/Target Support Files/Pods-MNFloatBtn_Example/Pods-MNFloatBtn_Example.debug.xcconfig"; sourceTree = ""; }; 67 | 992C1192803C1C8771711035 /* Pods-MNFloatBtn_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MNFloatBtn_Tests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-MNFloatBtn_Tests/Pods-MNFloatBtn_Tests.debug.xcconfig"; sourceTree = ""; }; 68 | A7B42389219717CD00C20287 /* OneViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OneViewController.h; sourceTree = ""; }; 69 | A7B4238A219717D300C20287 /* OneViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OneViewController.m; sourceTree = ""; }; 70 | B8F867C28DAF1704F15CE2AF /* Pods_MNFloatBtn_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MNFloatBtn_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 71 | F69E4B8DBA442EF09A728460 /* Pods-MNFloatBtn_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MNFloatBtn_Tests.release.xcconfig"; path = "Pods/Target Support Files/Pods-MNFloatBtn_Tests/Pods-MNFloatBtn_Tests.release.xcconfig"; sourceTree = ""; }; 72 | /* End PBXFileReference section */ 73 | 74 | /* Begin PBXFrameworksBuildPhase section */ 75 | 6003F587195388D20070C39A /* Frameworks */ = { 76 | isa = PBXFrameworksBuildPhase; 77 | buildActionMask = 2147483647; 78 | files = ( 79 | 6003F590195388D20070C39A /* CoreGraphics.framework in Frameworks */, 80 | 6003F592195388D20070C39A /* UIKit.framework in Frameworks */, 81 | 6003F58E195388D20070C39A /* Foundation.framework in Frameworks */, 82 | FF3F5C007C4F2D0C7379C089 /* Pods_MNFloatBtn_Example.framework in Frameworks */, 83 | ); 84 | runOnlyForDeploymentPostprocessing = 0; 85 | }; 86 | 6003F5AB195388D20070C39A /* Frameworks */ = { 87 | isa = PBXFrameworksBuildPhase; 88 | buildActionMask = 2147483647; 89 | files = ( 90 | 6003F5B0195388D20070C39A /* XCTest.framework in Frameworks */, 91 | 6003F5B2195388D20070C39A /* UIKit.framework in Frameworks */, 92 | 6003F5B1195388D20070C39A /* Foundation.framework in Frameworks */, 93 | BECCFC883A024E630155EEC8 /* Pods_MNFloatBtn_Tests.framework in Frameworks */, 94 | ); 95 | runOnlyForDeploymentPostprocessing = 0; 96 | }; 97 | /* End PBXFrameworksBuildPhase section */ 98 | 99 | /* Begin PBXGroup section */ 100 | 552E2A930F53B25A0BD47B1D /* Pods */ = { 101 | isa = PBXGroup; 102 | children = ( 103 | 8B631F8CD1EF7980CE886F2F /* Pods-MNFloatBtn_Example.debug.xcconfig */, 104 | 773A5637FC6A607D1066CDC5 /* Pods-MNFloatBtn_Example.release.xcconfig */, 105 | 992C1192803C1C8771711035 /* Pods-MNFloatBtn_Tests.debug.xcconfig */, 106 | F69E4B8DBA442EF09A728460 /* Pods-MNFloatBtn_Tests.release.xcconfig */, 107 | ); 108 | name = Pods; 109 | sourceTree = ""; 110 | }; 111 | 58B2BB3E22390FB3005ED735 /* MNFloatBtn */ = { 112 | isa = PBXGroup; 113 | children = ( 114 | 58B2BB3F22390FB3005ED735 /* MNFloatBtn.h */, 115 | 58B2BB4222390FB3005ED735 /* MNFloatBtn.m */, 116 | 58B2BB4022390FB3005ED735 /* NSDate+MNDate.h */, 117 | 58B2BB4122390FB3005ED735 /* NSDate+MNDate.m */, 118 | 58B2BB4322390FB3005ED735 /* MNFloatBtn.bundle */, 119 | ); 120 | name = MNFloatBtn; 121 | path = ../../MNFloatBtn; 122 | sourceTree = ""; 123 | }; 124 | 6003F581195388D10070C39A = { 125 | isa = PBXGroup; 126 | children = ( 127 | 6003F593195388D20070C39A /* Example for MNFloatBtn */, 128 | 6003F58C195388D20070C39A /* Frameworks */, 129 | 6003F58B195388D20070C39A /* Products */, 130 | 552E2A930F53B25A0BD47B1D /* Pods */, 131 | ); 132 | sourceTree = ""; 133 | }; 134 | 6003F58B195388D20070C39A /* Products */ = { 135 | isa = PBXGroup; 136 | children = ( 137 | 6003F58A195388D20070C39A /* MNFloatBtn_Example.app */, 138 | 6003F5AE195388D20070C39A /* MNFloatBtn_Tests.xctest */, 139 | ); 140 | name = Products; 141 | sourceTree = ""; 142 | }; 143 | 6003F58C195388D20070C39A /* Frameworks */ = { 144 | isa = PBXGroup; 145 | children = ( 146 | 6003F58D195388D20070C39A /* Foundation.framework */, 147 | 6003F58F195388D20070C39A /* CoreGraphics.framework */, 148 | 6003F591195388D20070C39A /* UIKit.framework */, 149 | 6003F5AF195388D20070C39A /* XCTest.framework */, 150 | 216653D39542B61925B2CCB3 /* Pods_MNFloatBtn_Example.framework */, 151 | B8F867C28DAF1704F15CE2AF /* Pods_MNFloatBtn_Tests.framework */, 152 | ); 153 | name = Frameworks; 154 | sourceTree = ""; 155 | }; 156 | 6003F593195388D20070C39A /* Example for MNFloatBtn */ = { 157 | isa = PBXGroup; 158 | children = ( 159 | 58B2BB3E22390FB3005ED735 /* MNFloatBtn */, 160 | A7B4238C219717D600C20287 /* DemoViewController */, 161 | 6003F59C195388D20070C39A /* MNAppDelegate.h */, 162 | 6003F59D195388D20070C39A /* MNAppDelegate.m */, 163 | 873B8AEA1B1F5CCA007FD442 /* Main.storyboard */, 164 | 71719F9D1E33DC2100824A3D /* LaunchScreen.storyboard */, 165 | 6003F5A8195388D20070C39A /* Images.xcassets */, 166 | 6003F594195388D20070C39A /* Supporting Files */, 167 | ); 168 | name = "Example for MNFloatBtn"; 169 | path = MNFloatBtn; 170 | sourceTree = ""; 171 | }; 172 | 6003F594195388D20070C39A /* Supporting Files */ = { 173 | isa = PBXGroup; 174 | children = ( 175 | 6003F595195388D20070C39A /* MNFloatBtn-Info.plist */, 176 | 6003F596195388D20070C39A /* InfoPlist.strings */, 177 | 6003F599195388D20070C39A /* main.m */, 178 | 6003F59B195388D20070C39A /* MNFloatBtn-Prefix.pch */, 179 | ); 180 | name = "Supporting Files"; 181 | sourceTree = ""; 182 | }; 183 | A7B4238C219717D600C20287 /* DemoViewController */ = { 184 | isa = PBXGroup; 185 | children = ( 186 | 6003F5A5195388D20070C39A /* MNViewController.h */, 187 | 6003F5A6195388D20070C39A /* MNViewController.m */, 188 | A7B42389219717CD00C20287 /* OneViewController.h */, 189 | A7B4238A219717D300C20287 /* OneViewController.m */, 190 | ); 191 | name = DemoViewController; 192 | sourceTree = ""; 193 | }; 194 | /* End PBXGroup section */ 195 | 196 | /* Begin PBXNativeTarget section */ 197 | 6003F589195388D20070C39A /* MNFloatBtn_Example */ = { 198 | isa = PBXNativeTarget; 199 | buildConfigurationList = 6003F5BF195388D20070C39A /* Build configuration list for PBXNativeTarget "MNFloatBtn_Example" */; 200 | buildPhases = ( 201 | 411DC933A8BED4123A6C2C83 /* [CP] Check Pods Manifest.lock */, 202 | 6003F586195388D20070C39A /* Sources */, 203 | 6003F587195388D20070C39A /* Frameworks */, 204 | 6003F588195388D20070C39A /* Resources */, 205 | 0C863CA4156A1B1228AB5D2C /* [CP] Embed Pods Frameworks */, 206 | ); 207 | buildRules = ( 208 | ); 209 | dependencies = ( 210 | ); 211 | name = MNFloatBtn_Example; 212 | productName = MNFloatBtn; 213 | productReference = 6003F58A195388D20070C39A /* MNFloatBtn_Example.app */; 214 | productType = "com.apple.product-type.application"; 215 | }; 216 | 6003F5AD195388D20070C39A /* MNFloatBtn_Tests */ = { 217 | isa = PBXNativeTarget; 218 | buildConfigurationList = 6003F5C2195388D20070C39A /* Build configuration list for PBXNativeTarget "MNFloatBtn_Tests" */; 219 | buildPhases = ( 220 | 31D1319D5B76C017FB7C15DB /* [CP] Check Pods Manifest.lock */, 221 | 6003F5AA195388D20070C39A /* Sources */, 222 | 6003F5AB195388D20070C39A /* Frameworks */, 223 | 6003F5AC195388D20070C39A /* Resources */, 224 | ); 225 | buildRules = ( 226 | ); 227 | dependencies = ( 228 | 6003F5B4195388D20070C39A /* PBXTargetDependency */, 229 | ); 230 | name = MNFloatBtn_Tests; 231 | productName = MNFloatBtnTests; 232 | productReference = 6003F5AE195388D20070C39A /* MNFloatBtn_Tests.xctest */; 233 | productType = "com.apple.product-type.bundle.unit-test"; 234 | }; 235 | /* End PBXNativeTarget section */ 236 | 237 | /* Begin PBXProject section */ 238 | 6003F582195388D10070C39A /* Project object */ = { 239 | isa = PBXProject; 240 | attributes = { 241 | CLASSPREFIX = MN; 242 | LastUpgradeCheck = 0720; 243 | ORGANIZATIONNAME = miniLV; 244 | TargetAttributes = { 245 | 6003F589195388D20070C39A = { 246 | DevelopmentTeam = 32F3APKGGM; 247 | ProvisioningStyle = Automatic; 248 | }; 249 | 6003F5AD195388D20070C39A = { 250 | TestTargetID = 6003F589195388D20070C39A; 251 | }; 252 | }; 253 | }; 254 | buildConfigurationList = 6003F585195388D10070C39A /* Build configuration list for PBXProject "MNFloatBtn" */; 255 | compatibilityVersion = "Xcode 3.2"; 256 | developmentRegion = English; 257 | hasScannedForEncodings = 0; 258 | knownRegions = ( 259 | en, 260 | Base, 261 | ); 262 | mainGroup = 6003F581195388D10070C39A; 263 | productRefGroup = 6003F58B195388D20070C39A /* Products */; 264 | projectDirPath = ""; 265 | projectRoot = ""; 266 | targets = ( 267 | 6003F589195388D20070C39A /* MNFloatBtn_Example */, 268 | 6003F5AD195388D20070C39A /* MNFloatBtn_Tests */, 269 | ); 270 | }; 271 | /* End PBXProject section */ 272 | 273 | /* Begin PBXResourcesBuildPhase section */ 274 | 6003F588195388D20070C39A /* Resources */ = { 275 | isa = PBXResourcesBuildPhase; 276 | buildActionMask = 2147483647; 277 | files = ( 278 | 873B8AEB1B1F5CCA007FD442 /* Main.storyboard in Resources */, 279 | 71719F9F1E33DC2100824A3D /* LaunchScreen.storyboard in Resources */, 280 | 6003F5A9195388D20070C39A /* Images.xcassets in Resources */, 281 | 58B2BB4622390FB3005ED735 /* MNFloatBtn.bundle in Resources */, 282 | 6003F598195388D20070C39A /* InfoPlist.strings in Resources */, 283 | ); 284 | runOnlyForDeploymentPostprocessing = 0; 285 | }; 286 | 6003F5AC195388D20070C39A /* Resources */ = { 287 | isa = PBXResourcesBuildPhase; 288 | buildActionMask = 2147483647; 289 | files = ( 290 | ); 291 | runOnlyForDeploymentPostprocessing = 0; 292 | }; 293 | /* End PBXResourcesBuildPhase section */ 294 | 295 | /* Begin PBXShellScriptBuildPhase section */ 296 | 0C863CA4156A1B1228AB5D2C /* [CP] Embed Pods Frameworks */ = { 297 | isa = PBXShellScriptBuildPhase; 298 | buildActionMask = 2147483647; 299 | files = ( 300 | ); 301 | inputFileListPaths = ( 302 | ); 303 | inputPaths = ( 304 | "${PODS_ROOT}/Target Support Files/Pods-MNFloatBtn_Example/Pods-MNFloatBtn_Example-frameworks.sh", 305 | "${BUILT_PRODUCTS_DIR}/MNFloatBtn/MNFloatBtn.framework", 306 | ); 307 | name = "[CP] Embed Pods Frameworks"; 308 | outputFileListPaths = ( 309 | ); 310 | outputPaths = ( 311 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MNFloatBtn.framework", 312 | ); 313 | runOnlyForDeploymentPostprocessing = 0; 314 | shellPath = /bin/sh; 315 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-MNFloatBtn_Example/Pods-MNFloatBtn_Example-frameworks.sh\"\n"; 316 | showEnvVarsInLog = 0; 317 | }; 318 | 31D1319D5B76C017FB7C15DB /* [CP] Check Pods Manifest.lock */ = { 319 | isa = PBXShellScriptBuildPhase; 320 | buildActionMask = 2147483647; 321 | files = ( 322 | ); 323 | inputPaths = ( 324 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 325 | "${PODS_ROOT}/Manifest.lock", 326 | ); 327 | name = "[CP] Check Pods Manifest.lock"; 328 | outputPaths = ( 329 | "$(DERIVED_FILE_DIR)/Pods-MNFloatBtn_Tests-checkManifestLockResult.txt", 330 | ); 331 | runOnlyForDeploymentPostprocessing = 0; 332 | shellPath = /bin/sh; 333 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 334 | showEnvVarsInLog = 0; 335 | }; 336 | 411DC933A8BED4123A6C2C83 /* [CP] Check Pods Manifest.lock */ = { 337 | isa = PBXShellScriptBuildPhase; 338 | buildActionMask = 2147483647; 339 | files = ( 340 | ); 341 | inputPaths = ( 342 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 343 | "${PODS_ROOT}/Manifest.lock", 344 | ); 345 | name = "[CP] Check Pods Manifest.lock"; 346 | outputPaths = ( 347 | "$(DERIVED_FILE_DIR)/Pods-MNFloatBtn_Example-checkManifestLockResult.txt", 348 | ); 349 | runOnlyForDeploymentPostprocessing = 0; 350 | shellPath = /bin/sh; 351 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 352 | showEnvVarsInLog = 0; 353 | }; 354 | /* End PBXShellScriptBuildPhase section */ 355 | 356 | /* Begin PBXSourcesBuildPhase section */ 357 | 6003F586195388D20070C39A /* Sources */ = { 358 | isa = PBXSourcesBuildPhase; 359 | buildActionMask = 2147483647; 360 | files = ( 361 | A7B4238B219717D400C20287 /* OneViewController.m in Sources */, 362 | 6003F59E195388D20070C39A /* MNAppDelegate.m in Sources */, 363 | 58B2BB4422390FB3005ED735 /* NSDate+MNDate.m in Sources */, 364 | 6003F5A7195388D20070C39A /* MNViewController.m in Sources */, 365 | 58B2BB4522390FB3005ED735 /* MNFloatBtn.m in Sources */, 366 | 6003F59A195388D20070C39A /* main.m in Sources */, 367 | ); 368 | runOnlyForDeploymentPostprocessing = 0; 369 | }; 370 | 6003F5AA195388D20070C39A /* Sources */ = { 371 | isa = PBXSourcesBuildPhase; 372 | buildActionMask = 2147483647; 373 | files = ( 374 | ); 375 | runOnlyForDeploymentPostprocessing = 0; 376 | }; 377 | /* End PBXSourcesBuildPhase section */ 378 | 379 | /* Begin PBXTargetDependency section */ 380 | 6003F5B4195388D20070C39A /* PBXTargetDependency */ = { 381 | isa = PBXTargetDependency; 382 | target = 6003F589195388D20070C39A /* MNFloatBtn_Example */; 383 | targetProxy = 6003F5B3195388D20070C39A /* PBXContainerItemProxy */; 384 | }; 385 | /* End PBXTargetDependency section */ 386 | 387 | /* Begin PBXVariantGroup section */ 388 | 6003F596195388D20070C39A /* InfoPlist.strings */ = { 389 | isa = PBXVariantGroup; 390 | children = ( 391 | 6003F597195388D20070C39A /* en */, 392 | ); 393 | name = InfoPlist.strings; 394 | sourceTree = ""; 395 | }; 396 | 71719F9D1E33DC2100824A3D /* LaunchScreen.storyboard */ = { 397 | isa = PBXVariantGroup; 398 | children = ( 399 | 71719F9E1E33DC2100824A3D /* Base */, 400 | ); 401 | name = LaunchScreen.storyboard; 402 | sourceTree = ""; 403 | }; 404 | /* End PBXVariantGroup section */ 405 | 406 | /* Begin XCBuildConfiguration section */ 407 | 6003F5BD195388D20070C39A /* Debug */ = { 408 | isa = XCBuildConfiguration; 409 | buildSettings = { 410 | ALWAYS_SEARCH_USER_PATHS = NO; 411 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 412 | CLANG_CXX_LIBRARY = "libc++"; 413 | CLANG_ENABLE_MODULES = YES; 414 | CLANG_ENABLE_OBJC_ARC = YES; 415 | CLANG_WARN_BOOL_CONVERSION = YES; 416 | CLANG_WARN_CONSTANT_CONVERSION = YES; 417 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 418 | CLANG_WARN_EMPTY_BODY = YES; 419 | CLANG_WARN_ENUM_CONVERSION = YES; 420 | CLANG_WARN_INT_CONVERSION = YES; 421 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 422 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 423 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 424 | COPY_PHASE_STRIP = NO; 425 | ENABLE_TESTABILITY = YES; 426 | GCC_C_LANGUAGE_STANDARD = gnu99; 427 | GCC_DYNAMIC_NO_PIC = NO; 428 | GCC_OPTIMIZATION_LEVEL = 0; 429 | GCC_PREPROCESSOR_DEFINITIONS = ( 430 | "DEBUG=1", 431 | "$(inherited)", 432 | ); 433 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 434 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 435 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 436 | GCC_WARN_UNDECLARED_SELECTOR = YES; 437 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 438 | GCC_WARN_UNUSED_FUNCTION = YES; 439 | GCC_WARN_UNUSED_VARIABLE = YES; 440 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 441 | ONLY_ACTIVE_ARCH = YES; 442 | SDKROOT = iphoneos; 443 | TARGETED_DEVICE_FAMILY = "1,2"; 444 | }; 445 | name = Debug; 446 | }; 447 | 6003F5BE195388D20070C39A /* Release */ = { 448 | isa = XCBuildConfiguration; 449 | buildSettings = { 450 | ALWAYS_SEARCH_USER_PATHS = NO; 451 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 452 | CLANG_CXX_LIBRARY = "libc++"; 453 | CLANG_ENABLE_MODULES = YES; 454 | CLANG_ENABLE_OBJC_ARC = YES; 455 | CLANG_WARN_BOOL_CONVERSION = YES; 456 | CLANG_WARN_CONSTANT_CONVERSION = YES; 457 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 458 | CLANG_WARN_EMPTY_BODY = YES; 459 | CLANG_WARN_ENUM_CONVERSION = YES; 460 | CLANG_WARN_INT_CONVERSION = YES; 461 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 462 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 463 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 464 | COPY_PHASE_STRIP = YES; 465 | ENABLE_NS_ASSERTIONS = NO; 466 | GCC_C_LANGUAGE_STANDARD = gnu99; 467 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 468 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 469 | GCC_WARN_UNDECLARED_SELECTOR = YES; 470 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 471 | GCC_WARN_UNUSED_FUNCTION = YES; 472 | GCC_WARN_UNUSED_VARIABLE = YES; 473 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 474 | SDKROOT = iphoneos; 475 | TARGETED_DEVICE_FAMILY = "1,2"; 476 | VALIDATE_PRODUCT = YES; 477 | }; 478 | name = Release; 479 | }; 480 | 6003F5C0195388D20070C39A /* Debug */ = { 481 | isa = XCBuildConfiguration; 482 | baseConfigurationReference = 8B631F8CD1EF7980CE886F2F /* Pods-MNFloatBtn_Example.debug.xcconfig */; 483 | buildSettings = { 484 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 485 | CODE_SIGN_IDENTITY = "iPhone Developer"; 486 | CODE_SIGN_STYLE = Automatic; 487 | DEVELOPMENT_TEAM = 32F3APKGGM; 488 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 489 | GCC_PREFIX_HEADER = "MNFloatBtn/MNFloatBtn-Prefix.pch"; 490 | INFOPLIST_FILE = "MNFloatBtn/MNFloatBtn-Info.plist"; 491 | MODULE_NAME = ExampleApp; 492 | PRODUCT_BUNDLE_IDENTIFIER = com.miniLV.MNFloatBtn123; 493 | PRODUCT_NAME = "$(TARGET_NAME)"; 494 | PROVISIONING_PROFILE_SPECIFIER = ""; 495 | WRAPPER_EXTENSION = app; 496 | }; 497 | name = Debug; 498 | }; 499 | 6003F5C1195388D20070C39A /* Release */ = { 500 | isa = XCBuildConfiguration; 501 | baseConfigurationReference = 773A5637FC6A607D1066CDC5 /* Pods-MNFloatBtn_Example.release.xcconfig */; 502 | buildSettings = { 503 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 504 | CODE_SIGN_IDENTITY = "iPhone Developer"; 505 | CODE_SIGN_STYLE = Automatic; 506 | DEVELOPMENT_TEAM = 32F3APKGGM; 507 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 508 | GCC_PREFIX_HEADER = "MNFloatBtn/MNFloatBtn-Prefix.pch"; 509 | INFOPLIST_FILE = "MNFloatBtn/MNFloatBtn-Info.plist"; 510 | MODULE_NAME = ExampleApp; 511 | PRODUCT_BUNDLE_IDENTIFIER = com.miniLV.MNFloatBtn123; 512 | PRODUCT_NAME = "$(TARGET_NAME)"; 513 | PROVISIONING_PROFILE_SPECIFIER = ""; 514 | WRAPPER_EXTENSION = app; 515 | }; 516 | name = Release; 517 | }; 518 | 6003F5C3195388D20070C39A /* Debug */ = { 519 | isa = XCBuildConfiguration; 520 | baseConfigurationReference = 992C1192803C1C8771711035 /* Pods-MNFloatBtn_Tests.debug.xcconfig */; 521 | buildSettings = { 522 | BUNDLE_LOADER = "$(TEST_HOST)"; 523 | FRAMEWORK_SEARCH_PATHS = ( 524 | "$(SDKROOT)/Developer/Library/Frameworks", 525 | "$(inherited)", 526 | "$(DEVELOPER_FRAMEWORKS_DIR)", 527 | ); 528 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 529 | GCC_PREFIX_HEADER = "Tests/Tests-Prefix.pch"; 530 | GCC_PREPROCESSOR_DEFINITIONS = ( 531 | "DEBUG=1", 532 | "$(inherited)", 533 | ); 534 | INFOPLIST_FILE = "Tests/Tests-Info.plist"; 535 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; 536 | PRODUCT_NAME = "$(TARGET_NAME)"; 537 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/MNFloatBtn_Example.app/MNFloatBtn_Example"; 538 | WRAPPER_EXTENSION = xctest; 539 | }; 540 | name = Debug; 541 | }; 542 | 6003F5C4195388D20070C39A /* Release */ = { 543 | isa = XCBuildConfiguration; 544 | baseConfigurationReference = F69E4B8DBA442EF09A728460 /* Pods-MNFloatBtn_Tests.release.xcconfig */; 545 | buildSettings = { 546 | BUNDLE_LOADER = "$(TEST_HOST)"; 547 | FRAMEWORK_SEARCH_PATHS = ( 548 | "$(SDKROOT)/Developer/Library/Frameworks", 549 | "$(inherited)", 550 | "$(DEVELOPER_FRAMEWORKS_DIR)", 551 | ); 552 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 553 | GCC_PREFIX_HEADER = "Tests/Tests-Prefix.pch"; 554 | INFOPLIST_FILE = "Tests/Tests-Info.plist"; 555 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; 556 | PRODUCT_NAME = "$(TARGET_NAME)"; 557 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/MNFloatBtn_Example.app/MNFloatBtn_Example"; 558 | WRAPPER_EXTENSION = xctest; 559 | }; 560 | name = Release; 561 | }; 562 | /* End XCBuildConfiguration section */ 563 | 564 | /* Begin XCConfigurationList section */ 565 | 6003F585195388D10070C39A /* Build configuration list for PBXProject "MNFloatBtn" */ = { 566 | isa = XCConfigurationList; 567 | buildConfigurations = ( 568 | 6003F5BD195388D20070C39A /* Debug */, 569 | 6003F5BE195388D20070C39A /* Release */, 570 | ); 571 | defaultConfigurationIsVisible = 0; 572 | defaultConfigurationName = Release; 573 | }; 574 | 6003F5BF195388D20070C39A /* Build configuration list for PBXNativeTarget "MNFloatBtn_Example" */ = { 575 | isa = XCConfigurationList; 576 | buildConfigurations = ( 577 | 6003F5C0195388D20070C39A /* Debug */, 578 | 6003F5C1195388D20070C39A /* Release */, 579 | ); 580 | defaultConfigurationIsVisible = 0; 581 | defaultConfigurationName = Release; 582 | }; 583 | 6003F5C2195388D20070C39A /* Build configuration list for PBXNativeTarget "MNFloatBtn_Tests" */ = { 584 | isa = XCConfigurationList; 585 | buildConfigurations = ( 586 | 6003F5C3195388D20070C39A /* Debug */, 587 | 6003F5C4195388D20070C39A /* Release */, 588 | ); 589 | defaultConfigurationIsVisible = 0; 590 | defaultConfigurationName = Release; 591 | }; 592 | /* End XCConfigurationList section */ 593 | }; 594 | rootObject = 6003F582195388D10070C39A /* Project object */; 595 | } 596 | -------------------------------------------------------------------------------- /Example/MNFloatBtn.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Example/MNFloatBtn.xcodeproj/xcshareddata/xcschemes/MNFloatBtn-Example.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 49 | 50 | 51 | 52 | 53 | 54 | 64 | 66 | 72 | 73 | 74 | 75 | 76 | 77 | 83 | 85 | 91 | 92 | 93 | 94 | 96 | 97 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /Example/MNFloatBtn.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Example/MNFloatBtn.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Example/MNFloatBtn/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /Example/MNFloatBtn/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /Example/MNFloatBtn/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "size" : "1024x1024", 91 | "scale" : "1x" 92 | } 93 | ], 94 | "info" : { 95 | "version" : 1, 96 | "author" : "xcode" 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /Example/MNFloatBtn/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Example/MNFloatBtn/MNAppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // MNAppDelegate.h 3 | // MNFloatBtn 4 | // 5 | // Created by miniLV on 11/10/2018. 6 | // Copyright (c) 2018 miniLV. All rights reserved. 7 | // 8 | 9 | @import UIKit; 10 | 11 | @interface MNAppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /Example/MNFloatBtn/MNAppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // MNAppDelegate.m 3 | // MNFloatBtn 4 | // 5 | // Created by miniLV on 11/10/2018. 6 | // Copyright (c) 2018 miniLV. All rights reserved. 7 | // 8 | 9 | #import "MNAppDelegate.h" 10 | #import "MNViewController.h" 11 | #import "MNFloatBtn.h" 12 | 13 | @implementation MNAppDelegate 14 | 15 | 16 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 17 | 18 | MNViewController *vc = [[MNViewController alloc]init]; 19 | UINavigationController *navi = [[UINavigationController alloc]initWithRootViewController:vc]; 20 | self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 21 | self.window.rootViewController = navi; 22 | [self.window makeKeyAndVisible]; 23 | //延迟加载VersionBtn - 避免wimdow还没出现就往上加控件造成的crash 24 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 25 | [self setVersionBtn]; 26 | }); 27 | 28 | return YES; 29 | } 30 | 31 | -(void)setVersionBtn{ 32 | 33 | //最普通的显示 34 | [MNFloatBtn show]; 35 | 36 | //是否显示截图当天的日期 37 | [[MNFloatBtn sharedBtn]setBuildShowDate:YES]; 38 | 39 | //假设是宏定义的Base url 40 | //#define kAddress @"testapi.miniLV.com" 41 | //#define kAddress @"devapi.miniLV.com" 42 | //#define kAddress @"api.miniLV.com" 43 | 44 | /**这里的宏定义 kAddress 用自己项目中的宏定义替换即可, 45 | 如果你项目用的是 “WahahaBaseUrl”, 46 | 用 `#define WahahaBaseUrl` 替换下面的`#define kAddress`即可 47 | */ 48 | #ifdef DEBUG 49 | //如果要实现MNFloatBtn 的切换环境功能,必须这样设置 50 | #define kAddress [[NSUserDefaults standardUserDefaults]objectForKey:@"MNBaseUrl"] 51 | #else 52 | //正式环境地址 53 | #define kAddress @"api.miniLV.com" 54 | #endif 55 | 56 | NSDictionary *envMap = @{ 57 | @"测试":@"testapi.miniLV.com", 58 | @"开发":@"devapi.miniLV.com", 59 | @"生产":@"api.miniLV.com" 60 | }; 61 | 62 | [MNFloatBtn showDebugModeWithType:MNAssistiveTypeNone]; 63 | 64 | //设置不同环境下,要展示的不同title,以及当前的Base Url 65 | NSString *baseUrl = kAddress; 66 | [MNFloatBtn setEnvironmentMap:envMap currentEnv:baseUrl]; 67 | 68 | /**点击事件 - 用'[MNFloatBtn sharedBtn].btnClick'触发 69 | 如果不需要自定义点击事件的话,可以不赋值. 70 | ==> 这样会实现内部的点击事件操作:点击按钮==>自动切换开发环境 71 | */ 72 | 73 | //自定义点击事件 74 | //[MNFloatBtn sharedBtn].btnClick = ^(UIButton *sender) { 75 | // NSLog(@" btn.btnClick ~"); 76 | //}; 77 | } 78 | 79 | 80 | @end 81 | -------------------------------------------------------------------------------- /Example/MNFloatBtn/MNFloatBtn-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 20181111 25 | LSRequiresIPhoneOS 26 | 27 | UILaunchStoryboardName 28 | LaunchScreen 29 | UIMainStoryboardFile 30 | Main 31 | UIRequiredDeviceCapabilities 32 | 33 | armv7 34 | 35 | UISupportedInterfaceOrientations 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationLandscapeLeft 39 | UIInterfaceOrientationLandscapeRight 40 | 41 | UISupportedInterfaceOrientations~ipad 42 | 43 | UIInterfaceOrientationPortrait 44 | UIInterfaceOrientationPortraitUpsideDown 45 | UIInterfaceOrientationLandscapeLeft 46 | UIInterfaceOrientationLandscapeRight 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /Example/MNFloatBtn/MNFloatBtn-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header 3 | // 4 | // The contents of this file are implicitly included at the beginning of every source file. 5 | // 6 | 7 | #import 8 | 9 | #ifndef __IPHONE_5_0 10 | #warning "This project uses features only available in iOS SDK 5.0 and later." 11 | #endif 12 | 13 | #ifdef __OBJC__ 14 | @import UIKit; 15 | @import Foundation; 16 | #endif 17 | -------------------------------------------------------------------------------- /Example/MNFloatBtn/MNViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // MNViewController.h 3 | // MNFloatBtn 4 | // 5 | // Created by miniLV on 11/10/2018. 6 | // Copyright (c) 2018 miniLV. All rights reserved. 7 | // 8 | 9 | @import UIKit; 10 | 11 | @interface MNViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Example/MNFloatBtn/MNViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // MNViewController.m 3 | // MNFloatBtn 4 | // 5 | // Created by miniLV on 11/10/2018. 6 | // Copyright (c) 2018 miniLV. All rights reserved. 7 | // 8 | 9 | #import "MNViewController.h" 10 | #import "OneViewController.h" 11 | @interface MNViewController () 12 | 13 | @end 14 | 15 | @implementation MNViewController 16 | 17 | - (void)viewDidLoad { 18 | [super viewDidLoad]; 19 | 20 | [self baseSetting]; 21 | 22 | [self setupUI]; 23 | } 24 | 25 | #pragma mark - baseSetting 26 | - (void)baseSetting{ 27 | self.title = @"startDemo"; 28 | self.view.backgroundColor = [UIColor whiteColor]; 29 | } 30 | 31 | #pragma mark - setupUI 32 | - (void)setupUI{ 33 | UIButton *btn = [UIButton buttonWithType:UIButtonTypeContactAdd]; 34 | btn.center = self.view.center; 35 | [btn addTarget:self action:@selector(pushToNext) forControlEvents:UIControlEventTouchUpInside]; 36 | [self.view addSubview:btn]; 37 | 38 | UIButton *btn2 = [[UIButton alloc]init]; 39 | [btn2 setTitle:@"show current env" forState:UIControlStateNormal]; 40 | btn2.frame = CGRectMake(100, 200, 200, 30); 41 | [btn2 setBackgroundColor:[UIColor lightGrayColor]]; 42 | [btn2 addTarget:self action:@selector(showCurrentEnvUrl) forControlEvents:UIControlEventTouchUpInside]; 43 | [self.view addSubview:btn2]; 44 | } 45 | 46 | - (void)showCurrentEnvUrl{ 47 | //检验修改宏是否成功 48 | #define kAddress [[NSUserDefaults standardUserDefaults]objectForKey:@"MNBaseUrl"] 49 | NSLog(@"envUrl = %@", kAddress); 50 | UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"当前API环境" message:kAddress delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil]; 51 | [alert show]; 52 | } 53 | 54 | - (void)pushToNext{ 55 | 56 | OneViewController *nextVC = [[OneViewController alloc]init]; 57 | [self presentViewController:nextVC animated:YES completion:nil]; 58 | } 59 | 60 | @end 61 | -------------------------------------------------------------------------------- /Example/MNFloatBtn/OneViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // OneViewController.h 3 | // LevitationButtonDemo 4 | // 5 | // Created by Lyh on 2018/3/8. 6 | // Copyright © 2018年 xmhccf. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "MNViewController.h" 11 | @interface OneViewController : MNViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Example/MNFloatBtn/OneViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // OneViewController.m 3 | // LevitationButtonDemo 4 | // 5 | // Created by Lyh on 2018/3/8. 6 | // Copyright © 2018年 xmhccf. All rights reserved. 7 | // 8 | 9 | #import "OneViewController.h" 10 | #import "MNFloatBtn.h" 11 | @interface OneViewController () 12 | 13 | @end 14 | 15 | @implementation OneViewController 16 | 17 | 18 | - (void)viewDidLoad { 19 | [super viewDidLoad]; 20 | self.title = @"nextVC"; 21 | UIColor *randomColor = [UIColor colorWithRed:arc4random_uniform(255)/255.0 green:arc4random_uniform(255)/255.0 blue:arc4random_uniform(255)/255.0 alpha:1]; 22 | self.view.backgroundColor = randomColor; 23 | 24 | UIButton *removeBtn = [[UIButton alloc]init]; 25 | removeBtn.frame = CGRectMake(0, 100, 150, 40); 26 | [removeBtn setTitle:@"remove" forState:UIControlStateNormal]; 27 | [removeBtn setTitle:@"show" forState:UIControlStateSelected]; 28 | [removeBtn addTarget:self action:@selector(p_removeBtn:) forControlEvents:UIControlEventTouchUpInside]; 29 | [self.view addSubview:removeBtn]; 30 | 31 | //弹框测试 32 | UIButton *alertBtn = [[UIButton alloc]init]; 33 | alertBtn.frame = CGRectMake(0, 200, 150, 40); 34 | [alertBtn setTitle:@"alert" forState:UIControlStateNormal]; 35 | [alertBtn addTarget:self action:@selector(p_alertBtn) forControlEvents:UIControlEventTouchUpInside]; 36 | [self.view addSubview:alertBtn]; 37 | 38 | //window添加一个测试view 39 | UIButton *windowTestBtn = [[UIButton alloc]init]; 40 | windowTestBtn.frame = CGRectMake(0, 300, 150, 40); 41 | [windowTestBtn setTitle:@"windowTestBtn" forState:UIControlStateNormal]; 42 | [windowTestBtn addTarget:self action:@selector(p_windowTestBtn) forControlEvents:UIControlEventTouchUpInside]; 43 | [self.view addSubview:windowTestBtn]; 44 | } 45 | 46 | - (void)p_removeBtn:(UIButton *)sender{ 47 | 48 | sender.selected = !sender.selected; 49 | 50 | sender.selected ? [MNFloatBtn hidden] : [MNFloatBtn show]; 51 | } 52 | 53 | - (void)p_alertBtn{ 54 | UIAlertController *alertView = [UIAlertController alertControllerWithTitle:@"test" message:@"test message" preferredStyle:UIAlertControllerStyleAlert]; 55 | 56 | [alertView addAction:[UIAlertAction actionWithTitle:@"cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) { 57 | [alertView dismissViewControllerAnimated:YES completion:nil]; 58 | }]]; 59 | [self presentViewController:alertView animated:YES completion:nil]; 60 | } 61 | 62 | - (void)p_windowTestBtn{ 63 | 64 | UIWindow *window = [UIApplication sharedApplication].keyWindow; 65 | UIView *testView = [[UIView alloc]init]; 66 | testView.backgroundColor = [UIColor lightGrayColor]; 67 | testView.frame = CGRectMake(0, 400, 200, 400); 68 | [window addSubview:testView]; 69 | 70 | } 71 | 72 | @end 73 | -------------------------------------------------------------------------------- /Example/MNFloatBtn/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /Example/MNFloatBtn/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // MNFloatBtn 4 | // 5 | // Created by miniLV on 11/10/2018. 6 | // Copyright (c) 2018 miniLV. All rights reserved. 7 | // 8 | 9 | @import UIKit; 10 | #import "MNAppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) 13 | { 14 | @autoreleasepool { 15 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([MNAppDelegate class])); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Example/Podfile: -------------------------------------------------------------------------------- 1 | use_frameworks! 2 | 3 | target 'MNFloatBtn_Example' do 4 | pod 'MNFloatBtn', :path => '../MNFloatBtn.podspec' 5 | target 'MNFloatBtn_Tests' do 6 | inherit! :search_paths 7 | 8 | 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /Example/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - MNFloatBtn (2.1.0) 3 | 4 | DEPENDENCIES: 5 | - MNFloatBtn (from `../MNFloatBtn.podspec`) 6 | 7 | EXTERNAL SOURCES: 8 | MNFloatBtn: 9 | :path: "../MNFloatBtn.podspec" 10 | 11 | SPEC CHECKSUMS: 12 | MNFloatBtn: 463b31d6d186aa7f3176a7752b28d543c805c173 13 | 14 | PODFILE CHECKSUM: 4b89b572518e169cf369a8fa55a25a03ee45e1bf 15 | 16 | COCOAPODS: 1.6.0.beta.2 17 | -------------------------------------------------------------------------------- /Example/Pods/Local Podspecs/MNFloatBtn.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "MNFloatBtn", 3 | "version": "2.1.0", 4 | "summary": "A short description of MNFloatBtn.", 5 | "description": "'一行代码创建一个全局悬浮按钮,可以快速查看当前App版本信息'", 6 | "homepage": "https://github.com/miniLV/MNFloatBtn", 7 | "license": { 8 | "type": "MIT", 9 | "file": "LICENSE" 10 | }, 11 | "authors": { 12 | "miniLV": "https://github.com/miniLV" 13 | }, 14 | "source": { 15 | "git": "https://github.com/miniLV/MNFloatBtn.git", 16 | "tag": "2.1.0" 17 | }, 18 | "platforms": { 19 | "ios": "8.0" 20 | }, 21 | "source_files": [ 22 | "MNFloatBtn/MNFloatBtn.{h,m}", 23 | "MNFloatBtn/NSDate+MNDate.{h,m}" 24 | ], 25 | "resources": "MNFloatBtn/MNFloatBtn.bundle" 26 | } 27 | -------------------------------------------------------------------------------- /Example/Pods/MNFloatBtn/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2018 miniLV 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /Example/Pods/MNFloatBtn/MNFloatBtn/MNFloatBtn.bundle/Root.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | StringsTable 6 | Root 7 | PreferenceSpecifiers 8 | 9 | 10 | Type 11 | PSGroupSpecifier 12 | Title 13 | Group 14 | 15 | 16 | Type 17 | PSTextFieldSpecifier 18 | Title 19 | Name 20 | Key 21 | name_preference 22 | DefaultValue 23 | 24 | IsSecure 25 | 26 | KeyboardType 27 | Alphabet 28 | AutocapitalizationType 29 | None 30 | AutocorrectionType 31 | No 32 | 33 | 34 | Type 35 | PSToggleSwitchSpecifier 36 | Title 37 | Enabled 38 | Key 39 | enabled_preference 40 | DefaultValue 41 | 42 | 43 | 44 | Type 45 | PSSliderSpecifier 46 | Key 47 | slider_preference 48 | DefaultValue 49 | 0.5 50 | MinimumValue 51 | 0 52 | MaximumValue 53 | 1 54 | MinimumValueImage 55 | 56 | MaximumValueImage 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /Example/Pods/MNFloatBtn/MNFloatBtn/MNFloatBtn.bundle/en.lproj/Root.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miniLV/MNFloatBtn/e9e0be145387651c8a3bff86997ca4789d796218/Example/Pods/MNFloatBtn/MNFloatBtn/MNFloatBtn.bundle/en.lproj/Root.strings -------------------------------------------------------------------------------- /Example/Pods/MNFloatBtn/MNFloatBtn/MNFloatBtn.bundle/mn_placeholder@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miniLV/MNFloatBtn/e9e0be145387651c8a3bff86997ca4789d796218/Example/Pods/MNFloatBtn/MNFloatBtn/MNFloatBtn.bundle/mn_placeholder@2x.png -------------------------------------------------------------------------------- /Example/Pods/MNFloatBtn/MNFloatBtn/MNFloatBtn.bundle/mn_placeholder@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miniLV/MNFloatBtn/e9e0be145387651c8a3bff86997ca4789d796218/Example/Pods/MNFloatBtn/MNFloatBtn/MNFloatBtn.bundle/mn_placeholder@3x.png -------------------------------------------------------------------------------- /Example/Pods/MNFloatBtn/MNFloatBtn/MNFloatBtn.h: -------------------------------------------------------------------------------- 1 | // 2 | // MNAssistiveBtn.h 3 | // LevitationButtonDemo 4 | // 5 | // Created by 梁宇航 on 2018/3/8. 6 | // Copyright © 2018年 xmhccf. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | typedef NS_ENUM(NSInteger, MNAssistiveTouchType) 12 | { 13 | MNAssistiveTypeNone = 0, //自动识别贴边 14 | MNAssistiveTypeNearLeft, //拖动停止之后,自动向左贴边 15 | MNAssistiveTypeNearRight, //拖动停止之后,自动向右贴边 16 | }; 17 | 18 | @interface MNFloatBtn : UIButton 19 | 20 | typedef void (^floatBtnClick)(UIButton *sender); 21 | 22 | //任何模式都显示floatBtn 23 | + (void)show; 24 | 25 | //仅在Debug模式下显示floatBtn(**推荐这种设置,防止floatBtn跑生产环境上**) 26 | + (void)showDebugMode; 27 | 28 | //Debug模式下都显示floatBtn - 并设置float吸附设置 29 | + (void)showDebugModeWithType:(MNAssistiveTouchType)type; 30 | 31 | //移除floatBtn在界面显示 32 | + (void)hidden; 33 | 34 | //获取floatBtn单例对象 35 | + (instancetype)sharedBtn; 36 | 37 | //按钮点击事件 38 | @property (nonatomic, copy)floatBtnClick btnClick; 39 | 40 | 41 | /** 42 | Build是否显示当天日期 - 默认是 43 | 如果传NO - Build 显示 系统的Build - 需手动更新 44 | 如果传YES - 字段识别今天的日期 45 | */ 46 | - (void)setBuildShowDate:(BOOL)isBuildShowDate; 47 | 48 | 49 | /** 50 | 做的环境映射 51 | 52 | 比如 53 | dev - https://miniDev.com 54 | qa - https://miniQA.com 55 | pro - https://miniPro.com 56 | 57 | { 58 | @"开发":miniDev, 59 | @"测试":miniQA, 60 | @"生产":miniPro, 61 | } 62 | 63 | @param environmentMap 环境 - Host 的 映射 64 | @param currentEnv - 当前环境的Host 65 | */ 66 | - (void)setEnvironmentMap:(NSDictionary *)environmentMap currentEnv:(NSString *)currentEnv; 67 | 68 | @end 69 | -------------------------------------------------------------------------------- /Example/Pods/MNFloatBtn/MNFloatBtn/MNFloatBtn.m: -------------------------------------------------------------------------------- 1 | // 2 | // MNAssistiveBtn.m 3 | // LevitationButtonDemo 4 | // 5 | // Created by 梁宇航 on 2018/3/8. 6 | // Copyright © 2018年 xmhccf. All rights reserved. 7 | // 8 | 9 | #import "MNFloatBtn.h" 10 | #import "NSDate+MNDate.h" 11 | 12 | 13 | @interface MNFloatBtn() 14 | 15 | @property (nonatomic, assign, getter=isBuildShowDate) BOOL buildShowDate; 16 | 17 | //Build号 18 | @property(nonatomic, copy)NSString *buildStr; 19 | 20 | //当前展示的环境 21 | @property (nonatomic, strong)NSString *environmentStr; 22 | 23 | @end 24 | 25 | @implementation MNFloatBtn{ 26 | 27 | MNAssistiveTouchType _type; 28 | //拖动按钮的起始坐标点 29 | CGPoint _touchPoint; 30 | 31 | //起始按钮的x,y值 32 | CGFloat _touchBtnX; 33 | CGFloat _touchBtnY; 34 | 35 | } 36 | 37 | static MNFloatBtn *_floatBtn; 38 | 39 | static CGFloat floatBtnW = 120; 40 | static CGFloat floatBtnH = 49; 41 | 42 | #define screenW [UIScreen mainScreen].bounds.size.width 43 | #define screenH [UIScreen mainScreen].bounds.size.height 44 | 45 | //系统默认build 46 | #define MNFloatBtnSystemBuild [[[NSBundle mainBundle]infoDictionary]valueForKey:@"CFBundleVersion"] 47 | //系统默认version 48 | #define MNFloatBtnSystemVersion [[[NSBundle mainBundle]infoDictionary]valueForKey:@"CFBundleShortVersionString"] 49 | 50 | #pragma mark - lazy 51 | - (NSString *)buildStr{ 52 | if (!_buildStr) { 53 | _buildStr = [NSDate currentDate]; 54 | } 55 | return _buildStr; 56 | } 57 | 58 | - (NSString *)environmentStr{ 59 | if (!_environmentStr) { 60 | 61 | _environmentStr = @"测试"; 62 | } 63 | return _environmentStr; 64 | } 65 | 66 | #pragma mark - setMethod 67 | - (void)setBuildShowDate:(BOOL)isBuildShowDate{ 68 | _buildShowDate = isBuildShowDate; 69 | 70 | [self p_getBuildStr]; 71 | 72 | [self p_updateBtnTitle]; 73 | } 74 | 75 | - (void)setEnvironmentMap:(NSDictionary *)environmentMap currentEnv:(NSString *)currentEnv{ 76 | 77 | __block NSString *envStr = @"测试"; 78 | 79 | [environmentMap enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) { 80 | 81 | if ([currentEnv isEqualToString:obj]) { 82 | envStr = key; 83 | *stop = YES; 84 | } 85 | }]; 86 | 87 | self.environmentStr = envStr; 88 | 89 | [self p_updateBtnTitle]; 90 | } 91 | 92 | - (void)p_updateBtnTitle{ 93 | 94 | NSString *title = [NSString stringWithFormat:@"Ver:%@ %@\nBuild:%@",MNFloatBtnSystemVersion,self.environmentStr, self.buildStr]; 95 | 96 | //如果createBtn的时候直接改title,可能会出现title无法更新问题,所以加个0.01s的延迟函数 97 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.01 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 98 | [[MNFloatBtn sharedBtn] setTitle:title forState:UIControlStateNormal]; 99 | }); 100 | } 101 | 102 | //获取build展示内容 103 | - (void)p_getBuildStr{ 104 | NSString *buildStr = [NSDate currentDate]; 105 | NSLog(@"self.isBuildShowDate = %d",self.isBuildShowDate); 106 | 107 | if (!self.isBuildShowDate && !self.buildStr) { 108 | buildStr = MNFloatBtnSystemBuild; 109 | } 110 | self.buildStr = buildStr; 111 | } 112 | 113 | 114 | #pragma mark - private Method 115 | + (MNFloatBtn *)sharedBtn{ 116 | 117 | if (!_floatBtn) { 118 | _floatBtn = [[self alloc]initWithType:MNAssistiveTypeNearRight frame:CGRectZero]; 119 | } 120 | return _floatBtn; 121 | } 122 | 123 | + (void)show{ 124 | 125 | [self showWithType:MNAssistiveTypeNearRight]; 126 | } 127 | 128 | + (void)hidden{ 129 | 130 | [_floatBtn removeFromSuperview]; 131 | } 132 | 133 | + (void)showDebugMode{ 134 | 135 | #ifdef DEBUG 136 | [self show]; 137 | #else 138 | #endif 139 | } 140 | 141 | 142 | + (void)showDebugModeWithType:(MNAssistiveTouchType)type{ 143 | #ifdef DEBUG 144 | [self showWithType:type]; 145 | #else 146 | #endif 147 | } 148 | 149 | + (void)showWithType:(MNAssistiveTouchType)type{ 150 | 151 | static dispatch_once_t onceToken; 152 | dispatch_once(&onceToken, ^{ 153 | 154 | _floatBtn = [[MNFloatBtn alloc] initWithType:type frame:CGRectZero]; 155 | }); 156 | 157 | if (!_floatBtn.superview) { 158 | 159 | [[UIApplication sharedApplication].keyWindow addSubview:_floatBtn]; 160 | //让floatBtn在最上层(即便以后还有keywindow add subView,也会在 floatBtn下) 161 | [[UIApplication sharedApplication].keyWindow bringSubviewToFront:_floatBtn]; 162 | }else{ 163 | [UIApplication sharedApplication].keyWindow.windowLevel = 1000000; 164 | } 165 | } 166 | 167 | 168 | - (instancetype)initWithType:(MNAssistiveTouchType)type 169 | frame:(CGRect)frame{ 170 | 171 | if (CGRectEqualToRect(frame, CGRectZero)) { 172 | CGFloat floatBtnX = screenW - floatBtnW; 173 | CGFloat floatBtnY = 60; 174 | 175 | frame = CGRectMake(floatBtnX, floatBtnY, floatBtnW, floatBtnH); 176 | } 177 | 178 | //获取build的值 179 | [self p_getBuildStr]; 180 | 181 | NSString *title = [NSString stringWithFormat:@"Ver:%@ %@\nBuild:%@",MNFloatBtnSystemVersion,self.environmentStr, self.buildStr]; 182 | 183 | UIImage *image = [self p_loadResourceImage]; 184 | 185 | return [self initWithType:type 186 | frame:frame 187 | title:title 188 | titleColor:[UIColor whiteColor] 189 | titleFont:[UIFont systemFontOfSize:11] 190 | backgroundColor:nil 191 | backgroundImage:image]; 192 | } 193 | 194 | - (instancetype)initWithType:(MNAssistiveTouchType)type 195 | frame:(CGRect)frame 196 | title:(NSString *)title 197 | titleColor:(UIColor *)titleColor 198 | titleFont:(UIFont *)titleFont 199 | backgroundColor:(UIColor *)backgroundColor 200 | backgroundImage:(UIImage *)backgroundImage{ 201 | 202 | if (self = [super initWithFrame:frame]) { 203 | _type = type; 204 | 205 | //UIbutton的换行显示 206 | self.titleLabel.lineBreakMode = NSLineBreakByWordWrapping; 207 | self.backgroundColor = backgroundColor; 208 | self.titleLabel.font = titleFont; 209 | [self setTitle:title forState:UIControlStateNormal]; 210 | [self setBackgroundImage:backgroundImage forState:UIControlStateNormal]; 211 | [self setBackgroundColor:backgroundColor]; 212 | 213 | [self addTarget:self action:@selector(p_clickBtn:) forControlEvents:UIControlEventTouchUpInside]; 214 | 215 | } 216 | return self; 217 | } 218 | 219 | - (void)p_clickBtn:(UIButton *)sender{ 220 | 221 | if (_btnClick) { 222 | _btnClick(sender); 223 | } 224 | } 225 | 226 | 227 | #pragma mark - button move 228 | - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 229 | 230 | [super touchesBegan:touches withEvent:event]; 231 | 232 | //按钮刚按下的时候,获取此时的起始坐标 233 | UITouch *touch = [touches anyObject]; 234 | _touchPoint = [touch locationInView:self]; 235 | 236 | _touchBtnX = self.frame.origin.x; 237 | _touchBtnY = self.frame.origin.y; 238 | } 239 | 240 | - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ 241 | 242 | UITouch *touch = [touches anyObject]; 243 | CGPoint currentPosition = [touch locationInView:self]; 244 | 245 | //偏移量(当前坐标 - 起始坐标 = 偏移量) 246 | CGFloat offsetX = currentPosition.x - _touchPoint.x; 247 | CGFloat offsetY = currentPosition.y - _touchPoint.y; 248 | 249 | //移动后的按钮中心坐标 250 | CGFloat centerX = self.center.x + offsetX; 251 | CGFloat centerY = self.center.y + offsetY; 252 | self.center = CGPointMake(centerX, centerY); 253 | 254 | //父试图的宽高 255 | CGFloat superViewWidth = self.superview.frame.size.width; 256 | CGFloat superViewHeight = self.superview.frame.size.height; 257 | CGFloat btnX = self.frame.origin.x; 258 | CGFloat btnY = self.frame.origin.y; 259 | CGFloat btnW = self.frame.size.width; 260 | CGFloat btnH = self.frame.size.height; 261 | 262 | //x轴左右极限坐标 263 | if (btnX > superViewWidth){ 264 | //按钮右侧越界 265 | CGFloat centerX = superViewWidth - btnW/2; 266 | self.center = CGPointMake(centerX, centerY); 267 | }else if (btnX < 0){ 268 | //按钮左侧越界 269 | CGFloat centerX = btnW * 0.5; 270 | self.center = CGPointMake(centerX, centerY); 271 | } 272 | 273 | //默认都是有导航条的,有导航条的,父试图高度就要被导航条占据,固高度不够 274 | CGFloat defaultNaviHeight = 64; 275 | CGFloat judgeSuperViewHeight = superViewHeight - defaultNaviHeight; 276 | 277 | //y轴上下极限坐标 278 | if (btnY <= 0){ 279 | //按钮顶部越界 280 | centerY = btnH * 0.7; 281 | self.center = CGPointMake(centerX, centerY); 282 | } 283 | else if (btnY > judgeSuperViewHeight){ 284 | //按钮底部越界 285 | CGFloat y = superViewHeight - btnH * 0.5; 286 | self.center = CGPointMake(btnX, y); 287 | } 288 | } 289 | 290 | - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ 291 | 292 | CGFloat btnWidth = self.frame.size.width; 293 | CGFloat btnHeight = self.frame.size.height; 294 | CGFloat btnY = self.frame.origin.y; 295 | CGFloat btnX = self.frame.origin.x; 296 | 297 | CGFloat minDistance = 2; 298 | 299 | //结束move的时候,计算移动的距离是>最低要求,如果没有,就调用按钮点击事件 300 | BOOL isOverX = fabs(btnX - _touchBtnX) > minDistance; 301 | BOOL isOverY = fabs(btnY - _touchBtnY) > minDistance; 302 | 303 | if (isOverX || isOverY) { 304 | //超过移动范围就不响应点击 - 只做移动操作 305 | [self touchesCancelled:touches withEvent:event]; 306 | }else{ 307 | [super touchesEnded:touches withEvent:event]; 308 | } 309 | 310 | //按钮靠近右侧 311 | switch (_type) { 312 | 313 | case MNAssistiveTypeNone:{ 314 | 315 | //自动识别贴边 316 | if (self.center.x >= self.superview.frame.size.width/2) { 317 | 318 | [UIView animateWithDuration:0.5 animations:^{ 319 | //按钮靠右自动吸边 320 | CGFloat btnX = self.superview.frame.size.width - btnWidth; 321 | self.frame = CGRectMake(btnX, btnY, btnWidth, btnHeight); 322 | }]; 323 | }else{ 324 | 325 | [UIView animateWithDuration:0.5 animations:^{ 326 | //按钮靠左吸边 327 | CGFloat btnX = 0; 328 | self.frame = CGRectMake(btnX, btnY, btnWidth, btnHeight); 329 | }]; 330 | } 331 | break; 332 | } 333 | case MNAssistiveTypeNearLeft:{ 334 | [UIView animateWithDuration:0.5 animations:^{ 335 | //按钮靠左吸边 336 | CGFloat btnX = 0; 337 | self.frame = CGRectMake(btnX, btnY, btnWidth, btnHeight); 338 | }]; 339 | break; 340 | } 341 | case MNAssistiveTypeNearRight:{ 342 | [UIView animateWithDuration:0.5 animations:^{ 343 | //按钮靠右自动吸边 344 | CGFloat btnX = self.superview.frame.size.width - btnWidth; 345 | self.frame = CGRectMake(btnX, btnY, btnWidth, btnHeight); 346 | }]; 347 | } 348 | } 349 | } 350 | 351 | #pragma mark - loadResourceImage 352 | - (UIImage *)p_loadResourceImage{ 353 | 354 | NSBundle *bundle = [NSBundle bundleForClass:[MNFloatBtn class]]; 355 | 356 | NSURL *url = [bundle URLForResource:@"MNFloatBtn" withExtension:@"bundle"]; 357 | NSBundle *imageBundle = [NSBundle bundleWithURL:url]; 358 | 359 | NSString *path = [imageBundle pathForResource:@"mn_placeholder@3x" ofType:@"png"]; 360 | 361 | UIImage *image = [UIImage imageWithContentsOfFile:path]; 362 | 363 | return image; 364 | } 365 | 366 | 367 | @end 368 | -------------------------------------------------------------------------------- /Example/Pods/MNFloatBtn/MNFloatBtn/NSDate+MNDate.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSDate+MNDate.h 3 | // MNFloatBtn_Example 4 | // 5 | // Created by TB-Mac-107 on 2019/1/23. 6 | // Copyright © 2019年 miniLV. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface NSDate (MNDate) 14 | 15 | + (NSString *)currentDate; 16 | 17 | @end 18 | 19 | NS_ASSUME_NONNULL_END 20 | -------------------------------------------------------------------------------- /Example/Pods/MNFloatBtn/MNFloatBtn/NSDate+MNDate.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSDate+MNDate.m 3 | // MNFloatBtn_Example 4 | // 5 | // Created by TB-Mac-107 on 2019/1/23. 6 | // Copyright © 2019年 miniLV. All rights reserved. 7 | // 8 | 9 | #import "NSDate+MNDate.h" 10 | 11 | @implementation NSDate (MNDate) 12 | 13 | + (NSString *)currentDate{ 14 | 15 | //获取系统时间戳 16 | NSDate* date1 = [NSDate date]; 17 | NSTimeInterval time1 =[date1 timeIntervalSince1970]; 18 | NSString *timeString = [NSString stringWithFormat:@"%.0f",time1]; 19 | 20 | //时间戳转换成时间 21 | NSTimeInterval time2 =[timeString doubleValue]; 22 | NSDate *date2 = [NSDate dateWithTimeIntervalSince1970:time2]; 23 | 24 | //显示的时间格式 25 | NSDateFormatter *formatter = [[NSDateFormatter alloc]init]; 26 | [formatter setDateFormat:@"yyyyMMdd"]; 27 | NSString *currentTime = [formatter stringFromDate:date2]; 28 | //NSLog(@"当前时间:%@",currentTime); 29 | 30 | return currentTime; 31 | } 32 | 33 | @end 34 | -------------------------------------------------------------------------------- /Example/Pods/MNFloatBtn/README.md: -------------------------------------------------------------------------------- 1 | # MNFloatBtn 2 | 3 | ![demo示例](https://github.com/miniLV/MNFloatBtn/blob/master/Resources/demo.gif) 4 | 5 | 6 | ## 集成方法 7 | 8 | 1.CocoaPods : `pod 'MNFloatBtn'` 9 | 10 | 2.手动导入 : 拖入`MNFloatBtn`文件夹 11 | 12 | ## 使用方法 13 | 1. 导入头文件,`#import ` 14 | 2. 一行代码,显示悬浮按钮 15 | 16 | --- 17 | - 任何情况都显示悬浮按钮 18 | ``` 19 | [MNFloatBtn show]; 20 | ``` 21 |
22 | 23 | - 仅在Debug模式下显示悬浮按钮(推荐使用) 24 | ``` 25 | [MNFloatBtn showDebugMode]; 26 | ``` 27 |
28 | 29 | - 移除悬浮按钮在界面上显示 30 | ``` 31 | [MNFloatBtn hidden]; 32 | ``` 33 | 34 | 35 | [文章介绍](https://www.jianshu.com/p/5a0ca7c4fd78) 36 | -------------------------------------------------------------------------------- /Example/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - MNFloatBtn (2.1.0) 3 | 4 | DEPENDENCIES: 5 | - MNFloatBtn (from `../MNFloatBtn.podspec`) 6 | 7 | EXTERNAL SOURCES: 8 | MNFloatBtn: 9 | :path: "../MNFloatBtn.podspec" 10 | 11 | SPEC CHECKSUMS: 12 | MNFloatBtn: 463b31d6d186aa7f3176a7752b28d543c805c173 13 | 14 | PODFILE CHECKSUM: 4b89b572518e169cf369a8fa55a25a03ee45e1bf 15 | 16 | COCOAPODS: 1.6.0.beta.2 17 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 0847CB3E516C4B0A3F7E29C1820FDAE8 /* Pods-MNFloatBtn_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 009B42AAF99AA84DDE06C2B0F17C6BB3 /* Pods-MNFloatBtn_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 11 | 0A9F756F2413A9C200657C8A /* MNFloatContentBtn.h in Headers */ = {isa = PBXBuildFile; fileRef = 0A9F756D2413A9C200657C8A /* MNFloatContentBtn.h */; }; 12 | 0A9F75702413A9C200657C8A /* MNFloatContentBtn.m in Sources */ = {isa = PBXBuildFile; fileRef = 0A9F756E2413A9C200657C8A /* MNFloatContentBtn.m */; }; 13 | 10C19BB1E5E920DB388CF50A87533F4D /* Pods-MNFloatBtn_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A26F44DD6B1B5B0D62281408B6A60BB /* Pods-MNFloatBtn_Example-dummy.m */; }; 14 | 1B05B796B5FE5136DA9D3134765413C1 /* MNFloatBtn-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = B999F56B903734E868FAF30844F953D4 /* MNFloatBtn-dummy.m */; }; 15 | 235359F26140EE105E472F3129FD28BF /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D6DFF15000AFE2A371BF499E7AFDA808 /* Foundation.framework */; }; 16 | 3DB9B8C292E6E7744C1CA2E39005963E /* MNFloatBtn-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 489780340DF8ED80913D50F160BFC478 /* MNFloatBtn-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 17 | 58558806249AFF334F018AB3EE9FF530 /* MNFloatBtn.h in Headers */ = {isa = PBXBuildFile; fileRef = 62C2F0D1A899226DCC3111569C8C6F7D /* MNFloatBtn.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18 | 81F651D3F82367AD3FF9A306058CF0DC /* MNFloatBtn.m in Sources */ = {isa = PBXBuildFile; fileRef = 688736D61DE51337647EC510D2CAF24A /* MNFloatBtn.m */; }; 19 | 95D97CB0F96F1DE4E784A971DC9F638A /* NSDate+MNDate.m in Sources */ = {isa = PBXBuildFile; fileRef = 584FCB7B250ABF0E81EE5E25B73234C5 /* NSDate+MNDate.m */; }; 20 | 9839BBA4B36CDD80CE5C91226B7462E6 /* MNFloatBtn.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 556A7002D8694F1F6600E0F268CDED85 /* MNFloatBtn.bundle */; }; 21 | B9E4DE6A8F4ACE6D4128B76FCE2EE35F /* Pods-MNFloatBtn_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C58F245672C7EC357CF20C5C3E80D8C3 /* Pods-MNFloatBtn_Tests-dummy.m */; }; 22 | D71FCBBBF12F89B986232CC92D7BD360 /* Pods-MNFloatBtn_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CDF7C3EBD3F9B8EDECF86EC1F03D47B /* Pods-MNFloatBtn_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 23 | E42EA8DF82B543FD631A7CB3ACD14E72 /* NSDate+MNDate.h in Headers */ = {isa = PBXBuildFile; fileRef = B6839C96ED291BEAFAE8FEC0606E0D09 /* NSDate+MNDate.h */; settings = {ATTRIBUTES = (Public, ); }; }; 24 | E610756093E3C1EEEED438AC81D24DF3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D6DFF15000AFE2A371BF499E7AFDA808 /* Foundation.framework */; }; 25 | F005D70F6D9B4CCFB37F4FCBF6438F69 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D6DFF15000AFE2A371BF499E7AFDA808 /* Foundation.framework */; }; 26 | /* End PBXBuildFile section */ 27 | 28 | /* Begin PBXContainerItemProxy section */ 29 | 3B532540BE6B55C2627AE17EF302B150 /* PBXContainerItemProxy */ = { 30 | isa = PBXContainerItemProxy; 31 | containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 32 | proxyType = 1; 33 | remoteGlobalIDString = D2E507BD08C2D3BF5DEACBA275902919; 34 | remoteInfo = "Pods-MNFloatBtn_Example"; 35 | }; 36 | A2FB6567DD7AFDC52531977C182515F2 /* PBXContainerItemProxy */ = { 37 | isa = PBXContainerItemProxy; 38 | containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 39 | proxyType = 1; 40 | remoteGlobalIDString = F51004028311F526DA355E8DBD78E9C7; 41 | remoteInfo = MNFloatBtn; 42 | }; 43 | /* End PBXContainerItemProxy section */ 44 | 45 | /* Begin PBXFileReference section */ 46 | 009B42AAF99AA84DDE06C2B0F17C6BB3 /* Pods-MNFloatBtn_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-MNFloatBtn_Example-umbrella.h"; sourceTree = ""; }; 47 | 078598D8D905DB8FE9D044B9A343889A /* MNFloatBtn.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MNFloatBtn.xcconfig; sourceTree = ""; }; 48 | 0A9F756D2413A9C200657C8A /* MNFloatContentBtn.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MNFloatContentBtn.h; path = MNFloatBtn/MNFloatContentBtn.h; sourceTree = ""; }; 49 | 0A9F756E2413A9C200657C8A /* MNFloatContentBtn.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = MNFloatContentBtn.m; path = MNFloatBtn/MNFloatContentBtn.m; sourceTree = ""; }; 50 | 0C13962F285F8060E235108F8015C83D /* Pods-MNFloatBtn_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-MNFloatBtn_Example-acknowledgements.plist"; sourceTree = ""; }; 51 | 16C51D4511D05F37F82DA382206A67B4 /* Pods-MNFloatBtn_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-MNFloatBtn_Tests-acknowledgements.markdown"; sourceTree = ""; }; 52 | 1A7CE8B9F0672AE195B3A106EED40A44 /* Pods-MNFloatBtn_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-MNFloatBtn_Tests.release.xcconfig"; sourceTree = ""; }; 53 | 3A26F44DD6B1B5B0D62281408B6A60BB /* Pods-MNFloatBtn_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-MNFloatBtn_Example-dummy.m"; sourceTree = ""; }; 54 | 47A5D0E72076B85DEDE47525D63BE3EB /* Pods_MNFloatBtn_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MNFloatBtn_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 55 | 489780340DF8ED80913D50F160BFC478 /* MNFloatBtn-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MNFloatBtn-umbrella.h"; sourceTree = ""; }; 56 | 4AFC806FC6731F340D6C0DDBD8B02EDB /* Pods-MNFloatBtn_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-MNFloatBtn_Example.debug.xcconfig"; sourceTree = ""; }; 57 | 556A7002D8694F1F6600E0F268CDED85 /* MNFloatBtn.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = MNFloatBtn.bundle; path = MNFloatBtn/MNFloatBtn.bundle; sourceTree = ""; }; 58 | 584FCB7B250ABF0E81EE5E25B73234C5 /* NSDate+MNDate.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSDate+MNDate.m"; path = "MNFloatBtn/NSDate+MNDate.m"; sourceTree = ""; }; 59 | 58F2711AA03B38FCB4DA6F0996A0EDD8 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; 60 | 62C2F0D1A899226DCC3111569C8C6F7D /* MNFloatBtn.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MNFloatBtn.h; path = MNFloatBtn/MNFloatBtn.h; sourceTree = ""; }; 61 | 67C0E12AA3CDC08DD7C693AE23E9AF76 /* Pods-MNFloatBtn_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-MNFloatBtn_Example-frameworks.sh"; sourceTree = ""; }; 62 | 688736D61DE51337647EC510D2CAF24A /* MNFloatBtn.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MNFloatBtn.m; path = MNFloatBtn/MNFloatBtn.m; sourceTree = ""; }; 63 | 6B977345A05940F16B98DB595B3D916B /* Pods-MNFloatBtn_Tests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-MNFloatBtn_Tests-Info.plist"; sourceTree = ""; }; 64 | 6C2E7E52972034F156D6629D5A14FCBB /* Pods-MNFloatBtn_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-MNFloatBtn_Tests-acknowledgements.plist"; sourceTree = ""; }; 65 | 7161D8EA820591BD7144640D3736B11D /* MNFloatBtn.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; path = MNFloatBtn.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 66 | 7CDF7C3EBD3F9B8EDECF86EC1F03D47B /* Pods-MNFloatBtn_Tests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-MNFloatBtn_Tests-umbrella.h"; sourceTree = ""; }; 67 | 8980E102A487282EE1B8667FF7D4EB2F /* MNFloatBtn.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = MNFloatBtn.modulemap; sourceTree = ""; }; 68 | 8CE55A9A0AB0D5CFB8EAE5F363B862E2 /* MNFloatBtn.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MNFloatBtn.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 69 | 8F797BA7D50BF9AD8094F4A28758BDBF /* Pods-MNFloatBtn_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-MNFloatBtn_Example-acknowledgements.markdown"; sourceTree = ""; }; 70 | 9D0C74DE870FAB17E6DBB26CD4B1557C /* Pods_MNFloatBtn_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MNFloatBtn_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 71 | 9D9D1776E4450AB187BFEB12777337A7 /* Pods-MNFloatBtn_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-MNFloatBtn_Tests.debug.xcconfig"; sourceTree = ""; }; 72 | AA512588A7CE6D994EE5605333B11726 /* Pods-MNFloatBtn_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-MNFloatBtn_Example.release.xcconfig"; sourceTree = ""; }; 73 | B36AB396275697EEE1A5B13BA8A38FE3 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 74 | B6839C96ED291BEAFAE8FEC0606E0D09 /* NSDate+MNDate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSDate+MNDate.h"; path = "MNFloatBtn/NSDate+MNDate.h"; sourceTree = ""; }; 75 | B999F56B903734E868FAF30844F953D4 /* MNFloatBtn-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MNFloatBtn-dummy.m"; sourceTree = ""; }; 76 | C58F245672C7EC357CF20C5C3E80D8C3 /* Pods-MNFloatBtn_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-MNFloatBtn_Tests-dummy.m"; sourceTree = ""; }; 77 | C5A84F05090318AE1F5D0E1906C835D0 /* Pods-MNFloatBtn_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-MNFloatBtn_Tests.modulemap"; sourceTree = ""; }; 78 | C9B43BEFE3F7BC0D0065AEF11C99A7FF /* Pods-MNFloatBtn_Example-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-MNFloatBtn_Example-Info.plist"; sourceTree = ""; }; 79 | D6DFF15000AFE2A371BF499E7AFDA808 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 80 | DA16B309CF534A1468FC760904D23928 /* Pods-MNFloatBtn_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-MNFloatBtn_Example.modulemap"; sourceTree = ""; }; 81 | EB86D5711E7829BC8F4357EBADE17822 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 82 | FA1BD70DA857DED4187A96289EC3EA67 /* MNFloatBtn-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "MNFloatBtn-Info.plist"; sourceTree = ""; }; 83 | FECBFE5B4A6B343569C220BE92FE7F6D /* MNFloatBtn-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MNFloatBtn-prefix.pch"; sourceTree = ""; }; 84 | /* End PBXFileReference section */ 85 | 86 | /* Begin PBXFrameworksBuildPhase section */ 87 | 28F6BD5074D9C0EAF789A4FB188DAD91 /* Frameworks */ = { 88 | isa = PBXFrameworksBuildPhase; 89 | buildActionMask = 2147483647; 90 | files = ( 91 | F005D70F6D9B4CCFB37F4FCBF6438F69 /* Foundation.framework in Frameworks */, 92 | ); 93 | runOnlyForDeploymentPostprocessing = 0; 94 | }; 95 | AF2798119D6AAAD266362E5CB2CE9CE6 /* Frameworks */ = { 96 | isa = PBXFrameworksBuildPhase; 97 | buildActionMask = 2147483647; 98 | files = ( 99 | 235359F26140EE105E472F3129FD28BF /* Foundation.framework in Frameworks */, 100 | ); 101 | runOnlyForDeploymentPostprocessing = 0; 102 | }; 103 | DF5A8F3E7E94AE56961CC6476D229F76 /* Frameworks */ = { 104 | isa = PBXFrameworksBuildPhase; 105 | buildActionMask = 2147483647; 106 | files = ( 107 | E610756093E3C1EEEED438AC81D24DF3 /* Foundation.framework in Frameworks */, 108 | ); 109 | runOnlyForDeploymentPostprocessing = 0; 110 | }; 111 | /* End PBXFrameworksBuildPhase section */ 112 | 113 | /* Begin PBXGroup section */ 114 | 1245CC18A73328AF22EE38D0EEE4B238 /* Pods-MNFloatBtn_Example */ = { 115 | isa = PBXGroup; 116 | children = ( 117 | DA16B309CF534A1468FC760904D23928 /* Pods-MNFloatBtn_Example.modulemap */, 118 | 8F797BA7D50BF9AD8094F4A28758BDBF /* Pods-MNFloatBtn_Example-acknowledgements.markdown */, 119 | 0C13962F285F8060E235108F8015C83D /* Pods-MNFloatBtn_Example-acknowledgements.plist */, 120 | 3A26F44DD6B1B5B0D62281408B6A60BB /* Pods-MNFloatBtn_Example-dummy.m */, 121 | 67C0E12AA3CDC08DD7C693AE23E9AF76 /* Pods-MNFloatBtn_Example-frameworks.sh */, 122 | C9B43BEFE3F7BC0D0065AEF11C99A7FF /* Pods-MNFloatBtn_Example-Info.plist */, 123 | 009B42AAF99AA84DDE06C2B0F17C6BB3 /* Pods-MNFloatBtn_Example-umbrella.h */, 124 | 4AFC806FC6731F340D6C0DDBD8B02EDB /* Pods-MNFloatBtn_Example.debug.xcconfig */, 125 | AA512588A7CE6D994EE5605333B11726 /* Pods-MNFloatBtn_Example.release.xcconfig */, 126 | ); 127 | name = "Pods-MNFloatBtn_Example"; 128 | path = "Target Support Files/Pods-MNFloatBtn_Example"; 129 | sourceTree = ""; 130 | }; 131 | 4350CC02D5F9290AF4423A53F5C29DF4 /* Pods-MNFloatBtn_Tests */ = { 132 | isa = PBXGroup; 133 | children = ( 134 | C5A84F05090318AE1F5D0E1906C835D0 /* Pods-MNFloatBtn_Tests.modulemap */, 135 | 16C51D4511D05F37F82DA382206A67B4 /* Pods-MNFloatBtn_Tests-acknowledgements.markdown */, 136 | 6C2E7E52972034F156D6629D5A14FCBB /* Pods-MNFloatBtn_Tests-acknowledgements.plist */, 137 | C58F245672C7EC357CF20C5C3E80D8C3 /* Pods-MNFloatBtn_Tests-dummy.m */, 138 | 6B977345A05940F16B98DB595B3D916B /* Pods-MNFloatBtn_Tests-Info.plist */, 139 | 7CDF7C3EBD3F9B8EDECF86EC1F03D47B /* Pods-MNFloatBtn_Tests-umbrella.h */, 140 | 9D9D1776E4450AB187BFEB12777337A7 /* Pods-MNFloatBtn_Tests.debug.xcconfig */, 141 | 1A7CE8B9F0672AE195B3A106EED40A44 /* Pods-MNFloatBtn_Tests.release.xcconfig */, 142 | ); 143 | name = "Pods-MNFloatBtn_Tests"; 144 | path = "Target Support Files/Pods-MNFloatBtn_Tests"; 145 | sourceTree = ""; 146 | }; 147 | 44D5347904CF754D6785B84253F2574A /* iOS */ = { 148 | isa = PBXGroup; 149 | children = ( 150 | D6DFF15000AFE2A371BF499E7AFDA808 /* Foundation.framework */, 151 | ); 152 | name = iOS; 153 | sourceTree = ""; 154 | }; 155 | 593D52A8225AD5959339E4154B65DD13 /* Products */ = { 156 | isa = PBXGroup; 157 | children = ( 158 | 8CE55A9A0AB0D5CFB8EAE5F363B862E2 /* MNFloatBtn.framework */, 159 | 9D0C74DE870FAB17E6DBB26CD4B1557C /* Pods_MNFloatBtn_Example.framework */, 160 | 47A5D0E72076B85DEDE47525D63BE3EB /* Pods_MNFloatBtn_Tests.framework */, 161 | ); 162 | name = Products; 163 | sourceTree = ""; 164 | }; 165 | 7DB346D0F39D3F0E887471402A8071AB = { 166 | isa = PBXGroup; 167 | children = ( 168 | B36AB396275697EEE1A5B13BA8A38FE3 /* Podfile */, 169 | C6690B9019A0AD927BD88BE5D99A97C2 /* Development Pods */, 170 | BC3CA7F9E30CC8F7E2DD044DD34432FC /* Frameworks */, 171 | 593D52A8225AD5959339E4154B65DD13 /* Products */, 172 | 94D504A8E45F7493079E375F32B8E05F /* Targets Support Files */, 173 | ); 174 | sourceTree = ""; 175 | }; 176 | 94D504A8E45F7493079E375F32B8E05F /* Targets Support Files */ = { 177 | isa = PBXGroup; 178 | children = ( 179 | 1245CC18A73328AF22EE38D0EEE4B238 /* Pods-MNFloatBtn_Example */, 180 | 4350CC02D5F9290AF4423A53F5C29DF4 /* Pods-MNFloatBtn_Tests */, 181 | ); 182 | name = "Targets Support Files"; 183 | sourceTree = ""; 184 | }; 185 | BC3CA7F9E30CC8F7E2DD044DD34432FC /* Frameworks */ = { 186 | isa = PBXGroup; 187 | children = ( 188 | 44D5347904CF754D6785B84253F2574A /* iOS */, 189 | ); 190 | name = Frameworks; 191 | sourceTree = ""; 192 | }; 193 | C47449F7C491B997FC9A1B436A4B51BD /* Pod */ = { 194 | isa = PBXGroup; 195 | children = ( 196 | 58F2711AA03B38FCB4DA6F0996A0EDD8 /* LICENSE */, 197 | 7161D8EA820591BD7144640D3736B11D /* MNFloatBtn.podspec */, 198 | EB86D5711E7829BC8F4357EBADE17822 /* README.md */, 199 | ); 200 | name = Pod; 201 | sourceTree = ""; 202 | }; 203 | C6690B9019A0AD927BD88BE5D99A97C2 /* Development Pods */ = { 204 | isa = PBXGroup; 205 | children = ( 206 | CA83929C3AC156F6931B00DA33520369 /* MNFloatBtn */, 207 | ); 208 | name = "Development Pods"; 209 | sourceTree = ""; 210 | }; 211 | CA83929C3AC156F6931B00DA33520369 /* MNFloatBtn */ = { 212 | isa = PBXGroup; 213 | children = ( 214 | 0A9F756D2413A9C200657C8A /* MNFloatContentBtn.h */, 215 | 0A9F756E2413A9C200657C8A /* MNFloatContentBtn.m */, 216 | 62C2F0D1A899226DCC3111569C8C6F7D /* MNFloatBtn.h */, 217 | 688736D61DE51337647EC510D2CAF24A /* MNFloatBtn.m */, 218 | B6839C96ED291BEAFAE8FEC0606E0D09 /* NSDate+MNDate.h */, 219 | 584FCB7B250ABF0E81EE5E25B73234C5 /* NSDate+MNDate.m */, 220 | C47449F7C491B997FC9A1B436A4B51BD /* Pod */, 221 | E8D5A3470954BA5D8AF77B4BCF8102CF /* Resources */, 222 | EE8A9BAFB8D7C48F3DA5C319DEF68605 /* Support Files */, 223 | ); 224 | name = MNFloatBtn; 225 | path = ../..; 226 | sourceTree = ""; 227 | }; 228 | E8D5A3470954BA5D8AF77B4BCF8102CF /* Resources */ = { 229 | isa = PBXGroup; 230 | children = ( 231 | 556A7002D8694F1F6600E0F268CDED85 /* MNFloatBtn.bundle */, 232 | ); 233 | name = Resources; 234 | sourceTree = ""; 235 | }; 236 | EE8A9BAFB8D7C48F3DA5C319DEF68605 /* Support Files */ = { 237 | isa = PBXGroup; 238 | children = ( 239 | 8980E102A487282EE1B8667FF7D4EB2F /* MNFloatBtn.modulemap */, 240 | 078598D8D905DB8FE9D044B9A343889A /* MNFloatBtn.xcconfig */, 241 | B999F56B903734E868FAF30844F953D4 /* MNFloatBtn-dummy.m */, 242 | FA1BD70DA857DED4187A96289EC3EA67 /* MNFloatBtn-Info.plist */, 243 | FECBFE5B4A6B343569C220BE92FE7F6D /* MNFloatBtn-prefix.pch */, 244 | 489780340DF8ED80913D50F160BFC478 /* MNFloatBtn-umbrella.h */, 245 | ); 246 | name = "Support Files"; 247 | path = "Example/Pods/Target Support Files/MNFloatBtn"; 248 | sourceTree = ""; 249 | }; 250 | /* End PBXGroup section */ 251 | 252 | /* Begin PBXHeadersBuildPhase section */ 253 | 09E4B897FEBE1A76F59CCC31B9A9C2D9 /* Headers */ = { 254 | isa = PBXHeadersBuildPhase; 255 | buildActionMask = 2147483647; 256 | files = ( 257 | D71FCBBBF12F89B986232CC92D7BD360 /* Pods-MNFloatBtn_Tests-umbrella.h in Headers */, 258 | ); 259 | runOnlyForDeploymentPostprocessing = 0; 260 | }; 261 | 7833434587D90703C2144955445128A2 /* Headers */ = { 262 | isa = PBXHeadersBuildPhase; 263 | buildActionMask = 2147483647; 264 | files = ( 265 | 3DB9B8C292E6E7744C1CA2E39005963E /* MNFloatBtn-umbrella.h in Headers */, 266 | 0A9F756F2413A9C200657C8A /* MNFloatContentBtn.h in Headers */, 267 | 58558806249AFF334F018AB3EE9FF530 /* MNFloatBtn.h in Headers */, 268 | E42EA8DF82B543FD631A7CB3ACD14E72 /* NSDate+MNDate.h in Headers */, 269 | ); 270 | runOnlyForDeploymentPostprocessing = 0; 271 | }; 272 | 8F5E39FD313B265927154FB71DA1E119 /* Headers */ = { 273 | isa = PBXHeadersBuildPhase; 274 | buildActionMask = 2147483647; 275 | files = ( 276 | 0847CB3E516C4B0A3F7E29C1820FDAE8 /* Pods-MNFloatBtn_Example-umbrella.h in Headers */, 277 | ); 278 | runOnlyForDeploymentPostprocessing = 0; 279 | }; 280 | /* End PBXHeadersBuildPhase section */ 281 | 282 | /* Begin PBXNativeTarget section */ 283 | 5CCF0F53255E355E0FF46F0723DF1D06 /* Pods-MNFloatBtn_Tests */ = { 284 | isa = PBXNativeTarget; 285 | buildConfigurationList = 6054C5F2A56FBFBEDF73F7E0F9119229 /* Build configuration list for PBXNativeTarget "Pods-MNFloatBtn_Tests" */; 286 | buildPhases = ( 287 | 09E4B897FEBE1A76F59CCC31B9A9C2D9 /* Headers */, 288 | 1A58C6DF10ABAAA7832E6CC22B5D87E8 /* Sources */, 289 | AF2798119D6AAAD266362E5CB2CE9CE6 /* Frameworks */, 290 | 183EC7871192C117DE9C809F8ADA43D3 /* Resources */, 291 | ); 292 | buildRules = ( 293 | ); 294 | dependencies = ( 295 | B4A77683DFBAA769856393228FB66C64 /* PBXTargetDependency */, 296 | ); 297 | name = "Pods-MNFloatBtn_Tests"; 298 | productName = "Pods-MNFloatBtn_Tests"; 299 | productReference = 47A5D0E72076B85DEDE47525D63BE3EB /* Pods_MNFloatBtn_Tests.framework */; 300 | productType = "com.apple.product-type.framework"; 301 | }; 302 | D2E507BD08C2D3BF5DEACBA275902919 /* Pods-MNFloatBtn_Example */ = { 303 | isa = PBXNativeTarget; 304 | buildConfigurationList = 1286490F494639059234447A87D0F099 /* Build configuration list for PBXNativeTarget "Pods-MNFloatBtn_Example" */; 305 | buildPhases = ( 306 | 8F5E39FD313B265927154FB71DA1E119 /* Headers */, 307 | CFD9315A762B468A20B9A92147362CCE /* Sources */, 308 | DF5A8F3E7E94AE56961CC6476D229F76 /* Frameworks */, 309 | 02205B1EC82982286AE9D3E6A28E402E /* Resources */, 310 | ); 311 | buildRules = ( 312 | ); 313 | dependencies = ( 314 | A9C285D0B9926D1A84CBCB82F6D9CC19 /* PBXTargetDependency */, 315 | ); 316 | name = "Pods-MNFloatBtn_Example"; 317 | productName = "Pods-MNFloatBtn_Example"; 318 | productReference = 9D0C74DE870FAB17E6DBB26CD4B1557C /* Pods_MNFloatBtn_Example.framework */; 319 | productType = "com.apple.product-type.framework"; 320 | }; 321 | F51004028311F526DA355E8DBD78E9C7 /* MNFloatBtn */ = { 322 | isa = PBXNativeTarget; 323 | buildConfigurationList = 305A3D065956CA960E8F6A4DB2AAA0D8 /* Build configuration list for PBXNativeTarget "MNFloatBtn" */; 324 | buildPhases = ( 325 | 7833434587D90703C2144955445128A2 /* Headers */, 326 | 3B961644D8E5AB93041D76F896D102E9 /* Sources */, 327 | 28F6BD5074D9C0EAF789A4FB188DAD91 /* Frameworks */, 328 | F3BB2FD0B1FF6429AEC84B551EEB10FD /* Resources */, 329 | ); 330 | buildRules = ( 331 | ); 332 | dependencies = ( 333 | ); 334 | name = MNFloatBtn; 335 | productName = MNFloatBtn; 336 | productReference = 8CE55A9A0AB0D5CFB8EAE5F363B862E2 /* MNFloatBtn.framework */; 337 | productType = "com.apple.product-type.framework"; 338 | }; 339 | /* End PBXNativeTarget section */ 340 | 341 | /* Begin PBXProject section */ 342 | D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { 343 | isa = PBXProject; 344 | attributes = { 345 | LastSwiftUpdateCheck = 0930; 346 | LastUpgradeCheck = 0930; 347 | }; 348 | buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; 349 | compatibilityVersion = "Xcode 3.2"; 350 | developmentRegion = English; 351 | hasScannedForEncodings = 0; 352 | knownRegions = ( 353 | English, 354 | en, 355 | ); 356 | mainGroup = 7DB346D0F39D3F0E887471402A8071AB; 357 | productRefGroup = 593D52A8225AD5959339E4154B65DD13 /* Products */; 358 | projectDirPath = ""; 359 | projectRoot = ""; 360 | targets = ( 361 | F51004028311F526DA355E8DBD78E9C7 /* MNFloatBtn */, 362 | D2E507BD08C2D3BF5DEACBA275902919 /* Pods-MNFloatBtn_Example */, 363 | 5CCF0F53255E355E0FF46F0723DF1D06 /* Pods-MNFloatBtn_Tests */, 364 | ); 365 | }; 366 | /* End PBXProject section */ 367 | 368 | /* Begin PBXResourcesBuildPhase section */ 369 | 02205B1EC82982286AE9D3E6A28E402E /* Resources */ = { 370 | isa = PBXResourcesBuildPhase; 371 | buildActionMask = 2147483647; 372 | files = ( 373 | ); 374 | runOnlyForDeploymentPostprocessing = 0; 375 | }; 376 | 183EC7871192C117DE9C809F8ADA43D3 /* Resources */ = { 377 | isa = PBXResourcesBuildPhase; 378 | buildActionMask = 2147483647; 379 | files = ( 380 | ); 381 | runOnlyForDeploymentPostprocessing = 0; 382 | }; 383 | F3BB2FD0B1FF6429AEC84B551EEB10FD /* Resources */ = { 384 | isa = PBXResourcesBuildPhase; 385 | buildActionMask = 2147483647; 386 | files = ( 387 | 9839BBA4B36CDD80CE5C91226B7462E6 /* MNFloatBtn.bundle in Resources */, 388 | ); 389 | runOnlyForDeploymentPostprocessing = 0; 390 | }; 391 | /* End PBXResourcesBuildPhase section */ 392 | 393 | /* Begin PBXSourcesBuildPhase section */ 394 | 1A58C6DF10ABAAA7832E6CC22B5D87E8 /* Sources */ = { 395 | isa = PBXSourcesBuildPhase; 396 | buildActionMask = 2147483647; 397 | files = ( 398 | B9E4DE6A8F4ACE6D4128B76FCE2EE35F /* Pods-MNFloatBtn_Tests-dummy.m in Sources */, 399 | ); 400 | runOnlyForDeploymentPostprocessing = 0; 401 | }; 402 | 3B961644D8E5AB93041D76F896D102E9 /* Sources */ = { 403 | isa = PBXSourcesBuildPhase; 404 | buildActionMask = 2147483647; 405 | files = ( 406 | 1B05B796B5FE5136DA9D3134765413C1 /* MNFloatBtn-dummy.m in Sources */, 407 | 81F651D3F82367AD3FF9A306058CF0DC /* MNFloatBtn.m in Sources */, 408 | 0A9F75702413A9C200657C8A /* MNFloatContentBtn.m in Sources */, 409 | 95D97CB0F96F1DE4E784A971DC9F638A /* NSDate+MNDate.m in Sources */, 410 | ); 411 | runOnlyForDeploymentPostprocessing = 0; 412 | }; 413 | CFD9315A762B468A20B9A92147362CCE /* Sources */ = { 414 | isa = PBXSourcesBuildPhase; 415 | buildActionMask = 2147483647; 416 | files = ( 417 | 10C19BB1E5E920DB388CF50A87533F4D /* Pods-MNFloatBtn_Example-dummy.m in Sources */, 418 | ); 419 | runOnlyForDeploymentPostprocessing = 0; 420 | }; 421 | /* End PBXSourcesBuildPhase section */ 422 | 423 | /* Begin PBXTargetDependency section */ 424 | A9C285D0B9926D1A84CBCB82F6D9CC19 /* PBXTargetDependency */ = { 425 | isa = PBXTargetDependency; 426 | name = MNFloatBtn; 427 | target = F51004028311F526DA355E8DBD78E9C7 /* MNFloatBtn */; 428 | targetProxy = A2FB6567DD7AFDC52531977C182515F2 /* PBXContainerItemProxy */; 429 | }; 430 | B4A77683DFBAA769856393228FB66C64 /* PBXTargetDependency */ = { 431 | isa = PBXTargetDependency; 432 | name = "Pods-MNFloatBtn_Example"; 433 | target = D2E507BD08C2D3BF5DEACBA275902919 /* Pods-MNFloatBtn_Example */; 434 | targetProxy = 3B532540BE6B55C2627AE17EF302B150 /* PBXContainerItemProxy */; 435 | }; 436 | /* End PBXTargetDependency section */ 437 | 438 | /* Begin XCBuildConfiguration section */ 439 | 2502250A8BCF7B7217724EAC14597282 /* Debug */ = { 440 | isa = XCBuildConfiguration; 441 | baseConfigurationReference = 9D9D1776E4450AB187BFEB12777337A7 /* Pods-MNFloatBtn_Tests.debug.xcconfig */; 442 | buildSettings = { 443 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 444 | CODE_SIGN_IDENTITY = ""; 445 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 446 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 447 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 448 | CURRENT_PROJECT_VERSION = 1; 449 | DEFINES_MODULE = YES; 450 | DYLIB_COMPATIBILITY_VERSION = 1; 451 | DYLIB_CURRENT_VERSION = 1; 452 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 453 | INFOPLIST_FILE = "Target Support Files/Pods-MNFloatBtn_Tests/Pods-MNFloatBtn_Tests-Info.plist"; 454 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 455 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 456 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 457 | MACH_O_TYPE = staticlib; 458 | MODULEMAP_FILE = "Target Support Files/Pods-MNFloatBtn_Tests/Pods-MNFloatBtn_Tests.modulemap"; 459 | OTHER_LDFLAGS = ""; 460 | OTHER_LIBTOOLFLAGS = ""; 461 | PODS_ROOT = "$(SRCROOT)"; 462 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 463 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 464 | SDKROOT = iphoneos; 465 | SKIP_INSTALL = YES; 466 | TARGETED_DEVICE_FAMILY = "1,2"; 467 | VERSIONING_SYSTEM = "apple-generic"; 468 | VERSION_INFO_PREFIX = ""; 469 | }; 470 | name = Debug; 471 | }; 472 | 2FC913946B17988CEE051D9944550D0F /* Debug */ = { 473 | isa = XCBuildConfiguration; 474 | baseConfigurationReference = 078598D8D905DB8FE9D044B9A343889A /* MNFloatBtn.xcconfig */; 475 | buildSettings = { 476 | CODE_SIGN_IDENTITY = ""; 477 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 478 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 479 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 480 | CURRENT_PROJECT_VERSION = 1; 481 | DEFINES_MODULE = YES; 482 | DYLIB_COMPATIBILITY_VERSION = 1; 483 | DYLIB_CURRENT_VERSION = 1; 484 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 485 | GCC_PREFIX_HEADER = "Target Support Files/MNFloatBtn/MNFloatBtn-prefix.pch"; 486 | INFOPLIST_FILE = "Target Support Files/MNFloatBtn/MNFloatBtn-Info.plist"; 487 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 488 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 489 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 490 | MODULEMAP_FILE = "Target Support Files/MNFloatBtn/MNFloatBtn.modulemap"; 491 | PRODUCT_MODULE_NAME = MNFloatBtn; 492 | PRODUCT_NAME = MNFloatBtn; 493 | SDKROOT = iphoneos; 494 | SKIP_INSTALL = YES; 495 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 496 | TARGETED_DEVICE_FAMILY = "1,2"; 497 | VERSIONING_SYSTEM = "apple-generic"; 498 | VERSION_INFO_PREFIX = ""; 499 | }; 500 | name = Debug; 501 | }; 502 | 5153DC2E9BB4F6D6F85AF7C0A4A2A27F /* Debug */ = { 503 | isa = XCBuildConfiguration; 504 | buildSettings = { 505 | ALWAYS_SEARCH_USER_PATHS = NO; 506 | CLANG_ANALYZER_NONNULL = YES; 507 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 508 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 509 | CLANG_CXX_LIBRARY = "libc++"; 510 | CLANG_ENABLE_MODULES = YES; 511 | CLANG_ENABLE_OBJC_ARC = YES; 512 | CLANG_ENABLE_OBJC_WEAK = YES; 513 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 514 | CLANG_WARN_BOOL_CONVERSION = YES; 515 | CLANG_WARN_COMMA = YES; 516 | CLANG_WARN_CONSTANT_CONVERSION = YES; 517 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 518 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 519 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 520 | CLANG_WARN_EMPTY_BODY = YES; 521 | CLANG_WARN_ENUM_CONVERSION = YES; 522 | CLANG_WARN_INFINITE_RECURSION = YES; 523 | CLANG_WARN_INT_CONVERSION = YES; 524 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 525 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 526 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 527 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 528 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 529 | CLANG_WARN_STRICT_PROTOTYPES = YES; 530 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 531 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 532 | CLANG_WARN_UNREACHABLE_CODE = YES; 533 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 534 | COPY_PHASE_STRIP = NO; 535 | DEBUG_INFORMATION_FORMAT = dwarf; 536 | ENABLE_STRICT_OBJC_MSGSEND = YES; 537 | ENABLE_TESTABILITY = YES; 538 | GCC_C_LANGUAGE_STANDARD = gnu11; 539 | GCC_DYNAMIC_NO_PIC = NO; 540 | GCC_NO_COMMON_BLOCKS = YES; 541 | GCC_OPTIMIZATION_LEVEL = 0; 542 | GCC_PREPROCESSOR_DEFINITIONS = ( 543 | "POD_CONFIGURATION_DEBUG=1", 544 | "DEBUG=1", 545 | "$(inherited)", 546 | ); 547 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 548 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 549 | GCC_WARN_UNDECLARED_SELECTOR = YES; 550 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 551 | GCC_WARN_UNUSED_FUNCTION = YES; 552 | GCC_WARN_UNUSED_VARIABLE = YES; 553 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 554 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 555 | MTL_FAST_MATH = YES; 556 | ONLY_ACTIVE_ARCH = YES; 557 | PRODUCT_NAME = "$(TARGET_NAME)"; 558 | STRIP_INSTALLED_PRODUCT = NO; 559 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 560 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 561 | SWIFT_VERSION = 4.2; 562 | SYMROOT = "${SRCROOT}/../build"; 563 | }; 564 | name = Debug; 565 | }; 566 | 5E515E5D792013C1F23F5BD5D48001F2 /* Debug */ = { 567 | isa = XCBuildConfiguration; 568 | baseConfigurationReference = 4AFC806FC6731F340D6C0DDBD8B02EDB /* Pods-MNFloatBtn_Example.debug.xcconfig */; 569 | buildSettings = { 570 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 571 | CODE_SIGN_IDENTITY = ""; 572 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 573 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 574 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 575 | CURRENT_PROJECT_VERSION = 1; 576 | DEFINES_MODULE = YES; 577 | DYLIB_COMPATIBILITY_VERSION = 1; 578 | DYLIB_CURRENT_VERSION = 1; 579 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 580 | INFOPLIST_FILE = "Target Support Files/Pods-MNFloatBtn_Example/Pods-MNFloatBtn_Example-Info.plist"; 581 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 582 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 583 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 584 | MACH_O_TYPE = staticlib; 585 | MODULEMAP_FILE = "Target Support Files/Pods-MNFloatBtn_Example/Pods-MNFloatBtn_Example.modulemap"; 586 | OTHER_LDFLAGS = ""; 587 | OTHER_LIBTOOLFLAGS = ""; 588 | PODS_ROOT = "$(SRCROOT)"; 589 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 590 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 591 | SDKROOT = iphoneos; 592 | SKIP_INSTALL = YES; 593 | TARGETED_DEVICE_FAMILY = "1,2"; 594 | VERSIONING_SYSTEM = "apple-generic"; 595 | VERSION_INFO_PREFIX = ""; 596 | }; 597 | name = Debug; 598 | }; 599 | 6A949A208667F02694AF29D5DCC8D4BF /* Release */ = { 600 | isa = XCBuildConfiguration; 601 | buildSettings = { 602 | ALWAYS_SEARCH_USER_PATHS = NO; 603 | CLANG_ANALYZER_NONNULL = YES; 604 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 605 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 606 | CLANG_CXX_LIBRARY = "libc++"; 607 | CLANG_ENABLE_MODULES = YES; 608 | CLANG_ENABLE_OBJC_ARC = YES; 609 | CLANG_ENABLE_OBJC_WEAK = YES; 610 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 611 | CLANG_WARN_BOOL_CONVERSION = YES; 612 | CLANG_WARN_COMMA = YES; 613 | CLANG_WARN_CONSTANT_CONVERSION = YES; 614 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 615 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 616 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 617 | CLANG_WARN_EMPTY_BODY = YES; 618 | CLANG_WARN_ENUM_CONVERSION = YES; 619 | CLANG_WARN_INFINITE_RECURSION = YES; 620 | CLANG_WARN_INT_CONVERSION = YES; 621 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 622 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 623 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 624 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 625 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 626 | CLANG_WARN_STRICT_PROTOTYPES = YES; 627 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 628 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 629 | CLANG_WARN_UNREACHABLE_CODE = YES; 630 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 631 | COPY_PHASE_STRIP = NO; 632 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 633 | ENABLE_NS_ASSERTIONS = NO; 634 | ENABLE_STRICT_OBJC_MSGSEND = YES; 635 | GCC_C_LANGUAGE_STANDARD = gnu11; 636 | GCC_NO_COMMON_BLOCKS = YES; 637 | GCC_PREPROCESSOR_DEFINITIONS = ( 638 | "POD_CONFIGURATION_RELEASE=1", 639 | "$(inherited)", 640 | ); 641 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 642 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 643 | GCC_WARN_UNDECLARED_SELECTOR = YES; 644 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 645 | GCC_WARN_UNUSED_FUNCTION = YES; 646 | GCC_WARN_UNUSED_VARIABLE = YES; 647 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 648 | MTL_ENABLE_DEBUG_INFO = NO; 649 | MTL_FAST_MATH = YES; 650 | PRODUCT_NAME = "$(TARGET_NAME)"; 651 | STRIP_INSTALLED_PRODUCT = NO; 652 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 653 | SWIFT_VERSION = 4.2; 654 | SYMROOT = "${SRCROOT}/../build"; 655 | }; 656 | name = Release; 657 | }; 658 | D9302CE969137A8A05F4E0964BE83CEC /* Release */ = { 659 | isa = XCBuildConfiguration; 660 | baseConfigurationReference = 1A7CE8B9F0672AE195B3A106EED40A44 /* Pods-MNFloatBtn_Tests.release.xcconfig */; 661 | buildSettings = { 662 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 663 | CODE_SIGN_IDENTITY = ""; 664 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 665 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 666 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 667 | CURRENT_PROJECT_VERSION = 1; 668 | DEFINES_MODULE = YES; 669 | DYLIB_COMPATIBILITY_VERSION = 1; 670 | DYLIB_CURRENT_VERSION = 1; 671 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 672 | INFOPLIST_FILE = "Target Support Files/Pods-MNFloatBtn_Tests/Pods-MNFloatBtn_Tests-Info.plist"; 673 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 674 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 675 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 676 | MACH_O_TYPE = staticlib; 677 | MODULEMAP_FILE = "Target Support Files/Pods-MNFloatBtn_Tests/Pods-MNFloatBtn_Tests.modulemap"; 678 | OTHER_LDFLAGS = ""; 679 | OTHER_LIBTOOLFLAGS = ""; 680 | PODS_ROOT = "$(SRCROOT)"; 681 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 682 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 683 | SDKROOT = iphoneos; 684 | SKIP_INSTALL = YES; 685 | TARGETED_DEVICE_FAMILY = "1,2"; 686 | VALIDATE_PRODUCT = YES; 687 | VERSIONING_SYSTEM = "apple-generic"; 688 | VERSION_INFO_PREFIX = ""; 689 | }; 690 | name = Release; 691 | }; 692 | E2E3516BADD6B187FE9BE45E41CF0704 /* Release */ = { 693 | isa = XCBuildConfiguration; 694 | baseConfigurationReference = AA512588A7CE6D994EE5605333B11726 /* Pods-MNFloatBtn_Example.release.xcconfig */; 695 | buildSettings = { 696 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 697 | CODE_SIGN_IDENTITY = ""; 698 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 699 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 700 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 701 | CURRENT_PROJECT_VERSION = 1; 702 | DEFINES_MODULE = YES; 703 | DYLIB_COMPATIBILITY_VERSION = 1; 704 | DYLIB_CURRENT_VERSION = 1; 705 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 706 | INFOPLIST_FILE = "Target Support Files/Pods-MNFloatBtn_Example/Pods-MNFloatBtn_Example-Info.plist"; 707 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 708 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 709 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 710 | MACH_O_TYPE = staticlib; 711 | MODULEMAP_FILE = "Target Support Files/Pods-MNFloatBtn_Example/Pods-MNFloatBtn_Example.modulemap"; 712 | OTHER_LDFLAGS = ""; 713 | OTHER_LIBTOOLFLAGS = ""; 714 | PODS_ROOT = "$(SRCROOT)"; 715 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 716 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 717 | SDKROOT = iphoneos; 718 | SKIP_INSTALL = YES; 719 | TARGETED_DEVICE_FAMILY = "1,2"; 720 | VALIDATE_PRODUCT = YES; 721 | VERSIONING_SYSTEM = "apple-generic"; 722 | VERSION_INFO_PREFIX = ""; 723 | }; 724 | name = Release; 725 | }; 726 | EF4D9FE03E7A49D986BD08EA0BD6949E /* Release */ = { 727 | isa = XCBuildConfiguration; 728 | baseConfigurationReference = 078598D8D905DB8FE9D044B9A343889A /* MNFloatBtn.xcconfig */; 729 | buildSettings = { 730 | CODE_SIGN_IDENTITY = ""; 731 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 732 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 733 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 734 | CURRENT_PROJECT_VERSION = 1; 735 | DEFINES_MODULE = YES; 736 | DYLIB_COMPATIBILITY_VERSION = 1; 737 | DYLIB_CURRENT_VERSION = 1; 738 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 739 | GCC_PREFIX_HEADER = "Target Support Files/MNFloatBtn/MNFloatBtn-prefix.pch"; 740 | INFOPLIST_FILE = "Target Support Files/MNFloatBtn/MNFloatBtn-Info.plist"; 741 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 742 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 743 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 744 | MODULEMAP_FILE = "Target Support Files/MNFloatBtn/MNFloatBtn.modulemap"; 745 | PRODUCT_MODULE_NAME = MNFloatBtn; 746 | PRODUCT_NAME = MNFloatBtn; 747 | SDKROOT = iphoneos; 748 | SKIP_INSTALL = YES; 749 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 750 | TARGETED_DEVICE_FAMILY = "1,2"; 751 | VALIDATE_PRODUCT = YES; 752 | VERSIONING_SYSTEM = "apple-generic"; 753 | VERSION_INFO_PREFIX = ""; 754 | }; 755 | name = Release; 756 | }; 757 | /* End XCBuildConfiguration section */ 758 | 759 | /* Begin XCConfigurationList section */ 760 | 1286490F494639059234447A87D0F099 /* Build configuration list for PBXNativeTarget "Pods-MNFloatBtn_Example" */ = { 761 | isa = XCConfigurationList; 762 | buildConfigurations = ( 763 | 5E515E5D792013C1F23F5BD5D48001F2 /* Debug */, 764 | E2E3516BADD6B187FE9BE45E41CF0704 /* Release */, 765 | ); 766 | defaultConfigurationIsVisible = 0; 767 | defaultConfigurationName = Release; 768 | }; 769 | 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { 770 | isa = XCConfigurationList; 771 | buildConfigurations = ( 772 | 5153DC2E9BB4F6D6F85AF7C0A4A2A27F /* Debug */, 773 | 6A949A208667F02694AF29D5DCC8D4BF /* Release */, 774 | ); 775 | defaultConfigurationIsVisible = 0; 776 | defaultConfigurationName = Release; 777 | }; 778 | 305A3D065956CA960E8F6A4DB2AAA0D8 /* Build configuration list for PBXNativeTarget "MNFloatBtn" */ = { 779 | isa = XCConfigurationList; 780 | buildConfigurations = ( 781 | 2FC913946B17988CEE051D9944550D0F /* Debug */, 782 | EF4D9FE03E7A49D986BD08EA0BD6949E /* Release */, 783 | ); 784 | defaultConfigurationIsVisible = 0; 785 | defaultConfigurationName = Release; 786 | }; 787 | 6054C5F2A56FBFBEDF73F7E0F9119229 /* Build configuration list for PBXNativeTarget "Pods-MNFloatBtn_Tests" */ = { 788 | isa = XCConfigurationList; 789 | buildConfigurations = ( 790 | 2502250A8BCF7B7217724EAC14597282 /* Debug */, 791 | D9302CE969137A8A05F4E0964BE83CEC /* Release */, 792 | ); 793 | defaultConfigurationIsVisible = 0; 794 | defaultConfigurationName = Release; 795 | }; 796 | /* End XCConfigurationList section */ 797 | }; 798 | rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 799 | } 800 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/MNFloatBtn/MNFloatBtn-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 2.1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/MNFloatBtn/MNFloatBtn-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_MNFloatBtn : NSObject 3 | @end 4 | @implementation PodsDummy_MNFloatBtn 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/MNFloatBtn/MNFloatBtn-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/MNFloatBtn/MNFloatBtn-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | #import "MNFloatBtn.h" 14 | #import "NSDate+MNDate.h" 15 | 16 | FOUNDATION_EXPORT double MNFloatBtnVersionNumber; 17 | FOUNDATION_EXPORT const unsigned char MNFloatBtnVersionString[]; 18 | 19 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/MNFloatBtn/MNFloatBtn.modulemap: -------------------------------------------------------------------------------- 1 | framework module MNFloatBtn { 2 | umbrella header "MNFloatBtn-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/MNFloatBtn/MNFloatBtn.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/MNFloatBtn 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | PODS_BUILD_DIR = ${BUILD_DIR} 4 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 5 | PODS_ROOT = ${SRCROOT} 6 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. 7 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 8 | SKIP_INSTALL = YES 9 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MNFloatBtn_Example/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MNFloatBtn_Example/Pods-MNFloatBtn_Example-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MNFloatBtn_Example/Pods-MNFloatBtn_Example-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## MNFloatBtn 5 | 6 | Copyright (c) 2018 miniLV 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining a copy 9 | of this software and associated documentation files (the "Software"), to deal 10 | in the Software without restriction, including without limitation the rights 11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | copies of the Software, and to permit persons to whom the Software is 13 | furnished to do so, subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice shall be included in 16 | all copies or substantial portions of the Software. 17 | 18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 | THE SOFTWARE. 25 | 26 | Generated by CocoaPods - https://cocoapods.org 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MNFloatBtn_Example/Pods-MNFloatBtn_Example-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Copyright (c) 2018 miniLV <liangyuhangapple@gmail.com> 18 | 19 | Permission is hereby granted, free of charge, to any person obtaining a copy 20 | of this software and associated documentation files (the "Software"), to deal 21 | in the Software without restriction, including without limitation the rights 22 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 23 | copies of the Software, and to permit persons to whom the Software is 24 | furnished to do so, subject to the following conditions: 25 | 26 | The above copyright notice and this permission notice shall be included in 27 | all copies or substantial portions of the Software. 28 | 29 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 30 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 31 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 32 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 33 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 34 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 35 | THE SOFTWARE. 36 | 37 | License 38 | MIT 39 | Title 40 | MNFloatBtn 41 | Type 42 | PSGroupSpecifier 43 | 44 | 45 | FooterText 46 | Generated by CocoaPods - https://cocoapods.org 47 | Title 48 | 49 | Type 50 | PSGroupSpecifier 51 | 52 | 53 | StringsTable 54 | Acknowledgements 55 | Title 56 | Acknowledgements 57 | 58 | 59 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MNFloatBtn_Example/Pods-MNFloatBtn_Example-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_MNFloatBtn_Example : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_MNFloatBtn_Example 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MNFloatBtn_Example/Pods-MNFloatBtn_Example-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | function on_error { 7 | echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" 8 | } 9 | trap 'on_error $LINENO' ERR 10 | 11 | if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then 12 | # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy 13 | # frameworks to, so exit 0 (signalling the script phase was successful). 14 | exit 0 15 | fi 16 | 17 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 18 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 19 | 20 | COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" 21 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 22 | 23 | # Used as a return value for each invocation of `strip_invalid_archs` function. 24 | STRIP_BINARY_RETVAL=0 25 | 26 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 27 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 28 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 29 | 30 | # Copies and strips a vendored framework 31 | install_framework() 32 | { 33 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 34 | local source="${BUILT_PRODUCTS_DIR}/$1" 35 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 36 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 37 | elif [ -r "$1" ]; then 38 | local source="$1" 39 | fi 40 | 41 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 42 | 43 | if [ -L "${source}" ]; then 44 | echo "Symlinked..." 45 | source="$(readlink "${source}")" 46 | fi 47 | 48 | # Use filter instead of exclude so missing patterns don't throw errors. 49 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 50 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 51 | 52 | local basename 53 | basename="$(basename -s .framework "$1")" 54 | binary="${destination}/${basename}.framework/${basename}" 55 | 56 | if ! [ -r "$binary" ]; then 57 | binary="${destination}/${basename}" 58 | elif [ -L "${binary}" ]; then 59 | echo "Destination binary is symlinked..." 60 | dirname="$(dirname "${binary}")" 61 | binary="${dirname}/$(readlink "${binary}")" 62 | fi 63 | 64 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 65 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 66 | strip_invalid_archs "$binary" 67 | fi 68 | 69 | # Resign the code if required by the build settings to avoid unstable apps 70 | code_sign_if_enabled "${destination}/$(basename "$1")" 71 | 72 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 73 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 74 | local swift_runtime_libs 75 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) 76 | for lib in $swift_runtime_libs; do 77 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 78 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 79 | code_sign_if_enabled "${destination}/${lib}" 80 | done 81 | fi 82 | } 83 | 84 | # Copies and strips a vendored dSYM 85 | install_dsym() { 86 | local source="$1" 87 | if [ -r "$source" ]; then 88 | # Copy the dSYM into a the targets temp dir. 89 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" 90 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" 91 | 92 | local basename 93 | basename="$(basename -s .framework.dSYM "$source")" 94 | binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" 95 | 96 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 97 | if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then 98 | strip_invalid_archs "$binary" 99 | fi 100 | 101 | if [[ $STRIP_BINARY_RETVAL == 1 ]]; then 102 | # Move the stripped file into its final destination. 103 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" 104 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}" 105 | else 106 | # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. 107 | touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" 108 | fi 109 | fi 110 | } 111 | 112 | # Signs a framework with the provided identity 113 | code_sign_if_enabled() { 114 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 115 | # Use the current code_sign_identity 116 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 117 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" 118 | 119 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 120 | code_sign_cmd="$code_sign_cmd &" 121 | fi 122 | echo "$code_sign_cmd" 123 | eval "$code_sign_cmd" 124 | fi 125 | } 126 | 127 | # Strip invalid architectures 128 | strip_invalid_archs() { 129 | binary="$1" 130 | # Get architectures for current target binary 131 | binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" 132 | # Intersect them with the architectures we are building for 133 | intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" 134 | # If there are no archs supported by this binary then warn the user 135 | if [[ -z "$intersected_archs" ]]; then 136 | echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." 137 | STRIP_BINARY_RETVAL=0 138 | return 139 | fi 140 | stripped="" 141 | for arch in $binary_archs; do 142 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then 143 | # Strip non-valid architectures in-place 144 | lipo -remove "$arch" -output "$binary" "$binary" 145 | stripped="$stripped $arch" 146 | fi 147 | done 148 | if [[ "$stripped" ]]; then 149 | echo "Stripped $binary of architectures:$stripped" 150 | fi 151 | STRIP_BINARY_RETVAL=1 152 | } 153 | 154 | 155 | if [[ "$CONFIGURATION" == "Debug" ]]; then 156 | install_framework "${BUILT_PRODUCTS_DIR}/MNFloatBtn/MNFloatBtn.framework" 157 | fi 158 | if [[ "$CONFIGURATION" == "Release" ]]; then 159 | install_framework "${BUILT_PRODUCTS_DIR}/MNFloatBtn/MNFloatBtn.framework" 160 | fi 161 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 162 | wait 163 | fi 164 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MNFloatBtn_Example/Pods-MNFloatBtn_Example-resources.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then 7 | # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy 8 | # resources to, so exit 0 (signalling the script phase was successful). 9 | exit 0 10 | fi 11 | 12 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 13 | 14 | RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt 15 | > "$RESOURCES_TO_COPY" 16 | 17 | XCASSET_FILES=() 18 | 19 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 20 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 21 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 22 | 23 | case "${TARGETED_DEVICE_FAMILY:-}" in 24 | 1,2) 25 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" 26 | ;; 27 | 1) 28 | TARGET_DEVICE_ARGS="--target-device iphone" 29 | ;; 30 | 2) 31 | TARGET_DEVICE_ARGS="--target-device ipad" 32 | ;; 33 | 3) 34 | TARGET_DEVICE_ARGS="--target-device tv" 35 | ;; 36 | 4) 37 | TARGET_DEVICE_ARGS="--target-device watch" 38 | ;; 39 | *) 40 | TARGET_DEVICE_ARGS="--target-device mac" 41 | ;; 42 | esac 43 | 44 | install_resource() 45 | { 46 | if [[ "$1" = /* ]] ; then 47 | RESOURCE_PATH="$1" 48 | else 49 | RESOURCE_PATH="${PODS_ROOT}/$1" 50 | fi 51 | if [[ ! -e "$RESOURCE_PATH" ]] ; then 52 | cat << EOM 53 | error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. 54 | EOM 55 | exit 1 56 | fi 57 | case $RESOURCE_PATH in 58 | *.storyboard) 59 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true 60 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 61 | ;; 62 | *.xib) 63 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true 64 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 65 | ;; 66 | *.framework) 67 | echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true 68 | mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 69 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true 70 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 71 | ;; 72 | *.xcdatamodel) 73 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true 74 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" 75 | ;; 76 | *.xcdatamodeld) 77 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true 78 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" 79 | ;; 80 | *.xcmappingmodel) 81 | echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true 82 | xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" 83 | ;; 84 | *.xcassets) 85 | ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" 86 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") 87 | ;; 88 | *) 89 | echo "$RESOURCE_PATH" || true 90 | echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" 91 | ;; 92 | esac 93 | } 94 | 95 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 96 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 97 | if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then 98 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 99 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 100 | fi 101 | rm -f "$RESOURCES_TO_COPY" 102 | 103 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ] 104 | then 105 | # Find all other xcassets (this unfortunately includes those of path pods and other targets). 106 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) 107 | while read line; do 108 | if [[ $line != "${PODS_ROOT}*" ]]; then 109 | XCASSET_FILES+=("$line") 110 | fi 111 | done <<<"$OTHER_XCASSETS" 112 | 113 | if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then 114 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 115 | else 116 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_TEMP_DIR}/assetcatalog_generated_info_cocoapods.plist" 117 | fi 118 | fi 119 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MNFloatBtn_Example/Pods-MNFloatBtn_Example-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_MNFloatBtn_ExampleVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_MNFloatBtn_ExampleVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MNFloatBtn_Example/Pods-MNFloatBtn_Example.debug.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MNFloatBtn" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MNFloatBtn/MNFloatBtn.framework/Headers" 4 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 5 | OTHER_LDFLAGS = $(inherited) -framework "MNFloatBtn" 6 | PODS_BUILD_DIR = ${BUILD_DIR} 7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 9 | PODS_ROOT = ${SRCROOT}/Pods 10 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MNFloatBtn_Example/Pods-MNFloatBtn_Example.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_MNFloatBtn_Example { 2 | umbrella header "Pods-MNFloatBtn_Example-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MNFloatBtn_Example/Pods-MNFloatBtn_Example.release.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MNFloatBtn" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MNFloatBtn/MNFloatBtn.framework/Headers" 4 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 5 | OTHER_LDFLAGS = $(inherited) -framework "MNFloatBtn" 6 | PODS_BUILD_DIR = ${BUILD_DIR} 7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 9 | PODS_ROOT = ${SRCROOT}/Pods 10 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MNFloatBtn_Tests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MNFloatBtn_Tests/Pods-MNFloatBtn_Tests-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MNFloatBtn_Tests/Pods-MNFloatBtn_Tests-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | Generated by CocoaPods - https://cocoapods.org 4 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MNFloatBtn_Tests/Pods-MNFloatBtn_Tests-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Generated by CocoaPods - https://cocoapods.org 18 | Title 19 | 20 | Type 21 | PSGroupSpecifier 22 | 23 | 24 | StringsTable 25 | Acknowledgements 26 | Title 27 | Acknowledgements 28 | 29 | 30 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MNFloatBtn_Tests/Pods-MNFloatBtn_Tests-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_MNFloatBtn_Tests : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_MNFloatBtn_Tests 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MNFloatBtn_Tests/Pods-MNFloatBtn_Tests-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then 7 | # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy 8 | # frameworks to, so exit 0 (signalling the script phase was successful). 9 | exit 0 10 | fi 11 | 12 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 13 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 14 | 15 | COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" 16 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 17 | 18 | # Used as a return value for each invocation of `strip_invalid_archs` function. 19 | STRIP_BINARY_RETVAL=0 20 | 21 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 22 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 23 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 24 | 25 | # Copies and strips a vendored framework 26 | install_framework() 27 | { 28 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 29 | local source="${BUILT_PRODUCTS_DIR}/$1" 30 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 31 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 32 | elif [ -r "$1" ]; then 33 | local source="$1" 34 | fi 35 | 36 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 37 | 38 | if [ -L "${source}" ]; then 39 | echo "Symlinked..." 40 | source="$(readlink "${source}")" 41 | fi 42 | 43 | # Use filter instead of exclude so missing patterns don't throw errors. 44 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 45 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 46 | 47 | local basename 48 | basename="$(basename -s .framework "$1")" 49 | binary="${destination}/${basename}.framework/${basename}" 50 | if ! [ -r "$binary" ]; then 51 | binary="${destination}/${basename}" 52 | fi 53 | 54 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 55 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 56 | strip_invalid_archs "$binary" 57 | fi 58 | 59 | # Resign the code if required by the build settings to avoid unstable apps 60 | code_sign_if_enabled "${destination}/$(basename "$1")" 61 | 62 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 63 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 64 | local swift_runtime_libs 65 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) 66 | for lib in $swift_runtime_libs; do 67 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 68 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 69 | code_sign_if_enabled "${destination}/${lib}" 70 | done 71 | fi 72 | } 73 | 74 | # Copies and strips a vendored dSYM 75 | install_dsym() { 76 | local source="$1" 77 | if [ -r "$source" ]; then 78 | # Copy the dSYM into a the targets temp dir. 79 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" 80 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" 81 | 82 | local basename 83 | basename="$(basename -s .framework.dSYM "$source")" 84 | binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" 85 | 86 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 87 | if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then 88 | strip_invalid_archs "$binary" 89 | fi 90 | 91 | if [[ $STRIP_BINARY_RETVAL == 1 ]]; then 92 | # Move the stripped file into its final destination. 93 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" 94 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}" 95 | else 96 | # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. 97 | touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" 98 | fi 99 | fi 100 | } 101 | 102 | # Signs a framework with the provided identity 103 | code_sign_if_enabled() { 104 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 105 | # Use the current code_sign_identitiy 106 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 107 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" 108 | 109 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 110 | code_sign_cmd="$code_sign_cmd &" 111 | fi 112 | echo "$code_sign_cmd" 113 | eval "$code_sign_cmd" 114 | fi 115 | } 116 | 117 | # Strip invalid architectures 118 | strip_invalid_archs() { 119 | binary="$1" 120 | # Get architectures for current target binary 121 | binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" 122 | # Intersect them with the architectures we are building for 123 | intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" 124 | # If there are no archs supported by this binary then warn the user 125 | if [[ -z "$intersected_archs" ]]; then 126 | echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." 127 | STRIP_BINARY_RETVAL=0 128 | return 129 | fi 130 | stripped="" 131 | for arch in $binary_archs; do 132 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then 133 | # Strip non-valid architectures in-place 134 | lipo -remove "$arch" -output "$binary" "$binary" || exit 1 135 | stripped="$stripped $arch" 136 | fi 137 | done 138 | if [[ "$stripped" ]]; then 139 | echo "Stripped $binary of architectures:$stripped" 140 | fi 141 | STRIP_BINARY_RETVAL=1 142 | } 143 | 144 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 145 | wait 146 | fi 147 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MNFloatBtn_Tests/Pods-MNFloatBtn_Tests-resources.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then 7 | # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy 8 | # resources to, so exit 0 (signalling the script phase was successful). 9 | exit 0 10 | fi 11 | 12 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 13 | 14 | RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt 15 | > "$RESOURCES_TO_COPY" 16 | 17 | XCASSET_FILES=() 18 | 19 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 20 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 21 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 22 | 23 | case "${TARGETED_DEVICE_FAMILY:-}" in 24 | 1,2) 25 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" 26 | ;; 27 | 1) 28 | TARGET_DEVICE_ARGS="--target-device iphone" 29 | ;; 30 | 2) 31 | TARGET_DEVICE_ARGS="--target-device ipad" 32 | ;; 33 | 3) 34 | TARGET_DEVICE_ARGS="--target-device tv" 35 | ;; 36 | 4) 37 | TARGET_DEVICE_ARGS="--target-device watch" 38 | ;; 39 | *) 40 | TARGET_DEVICE_ARGS="--target-device mac" 41 | ;; 42 | esac 43 | 44 | install_resource() 45 | { 46 | if [[ "$1" = /* ]] ; then 47 | RESOURCE_PATH="$1" 48 | else 49 | RESOURCE_PATH="${PODS_ROOT}/$1" 50 | fi 51 | if [[ ! -e "$RESOURCE_PATH" ]] ; then 52 | cat << EOM 53 | error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. 54 | EOM 55 | exit 1 56 | fi 57 | case $RESOURCE_PATH in 58 | *.storyboard) 59 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true 60 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 61 | ;; 62 | *.xib) 63 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true 64 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 65 | ;; 66 | *.framework) 67 | echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true 68 | mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 69 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true 70 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 71 | ;; 72 | *.xcdatamodel) 73 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true 74 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" 75 | ;; 76 | *.xcdatamodeld) 77 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true 78 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" 79 | ;; 80 | *.xcmappingmodel) 81 | echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true 82 | xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" 83 | ;; 84 | *.xcassets) 85 | ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" 86 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") 87 | ;; 88 | *) 89 | echo "$RESOURCE_PATH" || true 90 | echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" 91 | ;; 92 | esac 93 | } 94 | 95 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 96 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 97 | if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then 98 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 99 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 100 | fi 101 | rm -f "$RESOURCES_TO_COPY" 102 | 103 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ] 104 | then 105 | # Find all other xcassets (this unfortunately includes those of path pods and other targets). 106 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) 107 | while read line; do 108 | if [[ $line != "${PODS_ROOT}*" ]]; then 109 | XCASSET_FILES+=("$line") 110 | fi 111 | done <<<"$OTHER_XCASSETS" 112 | 113 | if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then 114 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 115 | else 116 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_TEMP_DIR}/assetcatalog_generated_info_cocoapods.plist" 117 | fi 118 | fi 119 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MNFloatBtn_Tests/Pods-MNFloatBtn_Tests-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_MNFloatBtn_TestsVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_MNFloatBtn_TestsVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MNFloatBtn_Tests/Pods-MNFloatBtn_Tests.debug.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MNFloatBtn" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MNFloatBtn/MNFloatBtn.framework/Headers" 4 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 5 | OTHER_LDFLAGS = $(inherited) -framework "MNFloatBtn" 6 | PODS_BUILD_DIR = ${BUILD_DIR} 7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 9 | PODS_ROOT = ${SRCROOT}/Pods 10 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MNFloatBtn_Tests/Pods-MNFloatBtn_Tests.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_MNFloatBtn_Tests { 2 | umbrella header "Pods-MNFloatBtn_Tests-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-MNFloatBtn_Tests/Pods-MNFloatBtn_Tests.release.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MNFloatBtn" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MNFloatBtn/MNFloatBtn.framework/Headers" 4 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 5 | OTHER_LDFLAGS = $(inherited) -framework "MNFloatBtn" 6 | PODS_BUILD_DIR = ${BUILD_DIR} 7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 9 | PODS_ROOT = ${SRCROOT}/Pods 10 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2018 miniLV 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /MNFloatBtn.podspec: -------------------------------------------------------------------------------- 1 | # 2 | # Be sure to run `pod lib lint MNFloatBtn.podspec' to ensure this is a 3 | # valid spec before submitting. 4 | # 5 | # Any lines starting with a # are optional, but their use is encouraged 6 | # To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html 7 | # 8 | 9 | Pod::Spec.new do |s| 10 | s.name = 'MNFloatBtn' 11 | s.version = '2.3.0' 12 | s.summary = 'A short description of MNFloatBtn.' 13 | 14 | # This description is used to generate tags and improve search results. 15 | # * Think: What does it do? Why did you write it? What is the focus? 16 | # * Try to keep it short, snappy and to the point. 17 | # * Write the description between the DESC delimiters below. 18 | # * Finally, don't worry about the indent, CocoaPods strips it! 19 | 20 | s.description = <<-DESC 21 | '一行代码创建一个全局悬浮按钮,可以快速查看当前App版本信息' 22 | DESC 23 | 24 | s.homepage = 'https://github.com/miniLV/MNFloatBtn' 25 | # s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2' 26 | s.license = { :type => 'MIT', :file => 'LICENSE' } 27 | s.author = { 'miniLV' => 'https://github.com/miniLV' } 28 | s.source = { :git => 'https://github.com/miniLV/MNFloatBtn.git', :tag => s.version.to_s } 29 | # s.social_media_url = 'https://twitter.com/' 30 | 31 | s.ios.deployment_target = '8.0' 32 | 33 | s.source_files = 'MNFloatBtn/MNFloatBtn.{h,m}','MNFloatBtn/NSDate+MNDate.{h,m}','MNFloatBtn/MNFloatContentBtn.{h,m}' 34 | 35 | 36 | s.resources = 'MNFloatBtn/MNFloatBtn.bundle' 37 | 38 | # s.public_header_files = 'Pod/Classes/**/*.h' 39 | # s.frameworks = 'UIKit', 'MapKit' 40 | # s.dependency 'AFNetworking', '~> 2.3' 41 | end 42 | -------------------------------------------------------------------------------- /MNFloatBtn/MNFloatBtn.bundle/Root.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | StringsTable 6 | Root 7 | PreferenceSpecifiers 8 | 9 | 10 | Type 11 | PSGroupSpecifier 12 | Title 13 | Group 14 | 15 | 16 | Type 17 | PSTextFieldSpecifier 18 | Title 19 | Name 20 | Key 21 | name_preference 22 | DefaultValue 23 | 24 | IsSecure 25 | 26 | KeyboardType 27 | Alphabet 28 | AutocapitalizationType 29 | None 30 | AutocorrectionType 31 | No 32 | 33 | 34 | Type 35 | PSToggleSwitchSpecifier 36 | Title 37 | Enabled 38 | Key 39 | enabled_preference 40 | DefaultValue 41 | 42 | 43 | 44 | Type 45 | PSSliderSpecifier 46 | Key 47 | slider_preference 48 | DefaultValue 49 | 0.5 50 | MinimumValue 51 | 0 52 | MaximumValue 53 | 1 54 | MinimumValueImage 55 | 56 | MaximumValueImage 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /MNFloatBtn/MNFloatBtn.bundle/en.lproj/Root.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miniLV/MNFloatBtn/e9e0be145387651c8a3bff86997ca4789d796218/MNFloatBtn/MNFloatBtn.bundle/en.lproj/Root.strings -------------------------------------------------------------------------------- /MNFloatBtn/MNFloatBtn.bundle/mn_placeholder@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miniLV/MNFloatBtn/e9e0be145387651c8a3bff86997ca4789d796218/MNFloatBtn/MNFloatBtn.bundle/mn_placeholder@2x.png -------------------------------------------------------------------------------- /MNFloatBtn/MNFloatBtn.bundle/mn_placeholder@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miniLV/MNFloatBtn/e9e0be145387651c8a3bff86997ca4789d796218/MNFloatBtn/MNFloatBtn.bundle/mn_placeholder@3x.png -------------------------------------------------------------------------------- /MNFloatBtn/MNFloatBtn.h: -------------------------------------------------------------------------------- 1 | // 2 | // MNAssistiveBtn.h 3 | // LevitationButtonDemo 4 | // 5 | // Created by 梁宇航 on 2018/3/8. 6 | // Copyright © 2018年 xmhccf. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "MNFloatContentBtn.h" 11 | 12 | typedef NS_ENUM(NSInteger, MNAssistiveTouchType) 13 | { 14 | MNAssistiveTypeNone = 0, //自动识别贴边 15 | MNAssistiveTypeNearLeft, //拖动停止之后,自动向左贴边 16 | MNAssistiveTypeNearRight, //拖动停止之后,自动向右贴边 17 | }; 18 | 19 | @interface MNFloatBtn : UIWindow 20 | 21 | //任何模式都显示floatBtn 22 | + (void)show; 23 | 24 | //仅在Debug模式下显示floatBtn(**推荐这种设置,防止floatBtn跑生产环境上**) 25 | + (void)showDebugMode; 26 | 27 | //Debug模式下都显示floatBtn - 并设置float吸附设置 28 | + (void)showDebugModeWithType:(MNAssistiveTouchType)type; 29 | 30 | //移除floatBtn在界面显示 31 | + (void)hidden; 32 | 33 | //获取floatBtn对象 34 | + (MNFloatContentBtn *)sharedBtn; 35 | 36 | /** 37 | 做的环境映射 38 | 39 | 比如 40 | dev - https://miniDev.com 41 | qa - https://miniQA.com 42 | pro - https://miniPro.com 43 | 44 | { 45 | @"开发":miniDev, 46 | @"测试":miniQA, 47 | @"生产":miniPro, 48 | } 49 | 50 | @param environmentMap 环境 - Host 的 映射 51 | @param currentEnv - 当前环境的Host 52 | */ 53 | + (void)setEnvironmentMap:(NSDictionary *)environmentMap 54 | currentEnv:(NSString *)currentEnv; 55 | 56 | @end 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /MNFloatBtn/MNFloatBtn.m: -------------------------------------------------------------------------------- 1 | // 2 | // MNAssistiveBtn.m 3 | // LevitationButtonDemo 4 | // 5 | // Created by 梁宇航 on 2018/3/8. 6 | // Copyright © 2018年 xmhccf. All rights reserved. 7 | // 8 | 9 | #import "MNFloatBtn.h" 10 | 11 | #define kSystemKeyboardWindowLevel 10000000 12 | 13 | @interface MNFloatBtn() 14 | 15 | //悬浮的按钮 16 | @property (nonatomic, strong) MNFloatContentBtn *floatBtn; 17 | 18 | @end 19 | 20 | @implementation MNFloatBtn{ 21 | 22 | MNAssistiveTouchType _type; 23 | //拖动按钮的起始坐标点 24 | CGPoint _touchPoint; 25 | 26 | //起始按钮的x,y值 27 | CGFloat _touchBtnX; 28 | CGFloat _touchBtnY; 29 | 30 | } 31 | 32 | //static 33 | static MNFloatBtn *_floatWindow; 34 | 35 | static CGFloat floatBtnW = 120; 36 | static CGFloat floatBtnH = 49; 37 | 38 | #define screenW [UIScreen mainScreen].bounds.size.width 39 | #define screenH [UIScreen mainScreen].bounds.size.height 40 | 41 | - (MNFloatContentBtn *)floatBtn{ 42 | if (!_floatBtn) { 43 | _floatBtn = [[MNFloatContentBtn alloc]init]; 44 | 45 | //添加到window上 46 | [_floatWindow addSubview:_floatBtn]; 47 | _floatBtn.frame = _floatWindow.bounds; 48 | 49 | } 50 | return _floatBtn; 51 | } 52 | 53 | 54 | #pragma mark - public Method 55 | + (UIButton *)sharedBtn{ 56 | return _floatWindow.floatBtn; 57 | } 58 | 59 | + (void)show{ 60 | [self showWithType:MNAssistiveTypeNearRight]; 61 | } 62 | 63 | + (void)hidden{ 64 | [_floatWindow setHidden:YES]; 65 | } 66 | 67 | + (void)showDebugMode{ 68 | #ifdef DEBUG 69 | [self show]; 70 | #else 71 | #endif 72 | } 73 | 74 | 75 | + (void)showDebugModeWithType:(MNAssistiveTouchType)type{ 76 | #ifdef DEBUG 77 | [self showWithType:type]; 78 | #else 79 | #endif 80 | } 81 | 82 | 83 | + (void)showWithType:(MNAssistiveTouchType)type{ 84 | 85 | static dispatch_once_t onceToken; 86 | dispatch_once(&onceToken, ^{ 87 | 88 | _floatWindow = [[MNFloatBtn alloc] initWithType:type frame:CGRectZero]; 89 | _floatWindow.rootViewController = [[UIViewController alloc]init]; 90 | [_floatWindow p_showFloatBtn]; 91 | }); 92 | 93 | [_floatWindow showWithType:type]; 94 | } 95 | 96 | + (void)setEnvironmentMap:(NSDictionary *)environmentMap 97 | currentEnv:(NSString *)currentEnv{ 98 | [[self sharedBtn]setEnvironmentMap:environmentMap currentEnv:currentEnv]; 99 | } 100 | 101 | #pragma mark - private Method 102 | - (void)showWithType:(MNAssistiveTouchType)type{ 103 | 104 | UIWindow *currentKeyWindow = [UIApplication sharedApplication].keyWindow; 105 | 106 | if (_floatWindow.hidden) { 107 | _floatWindow.hidden = NO; 108 | } 109 | else if (!_floatWindow) { 110 | _floatWindow = [[MNFloatBtn alloc] initWithType:type frame:CGRectZero]; 111 | _floatWindow.rootViewController = [UIViewController new]; 112 | } 113 | 114 | _floatWindow.backgroundColor = [UIColor clearColor]; 115 | [_floatWindow makeKeyAndVisible]; 116 | _floatWindow.windowLevel = kSystemKeyboardWindowLevel; 117 | 118 | [currentKeyWindow makeKeyWindow]; 119 | } 120 | 121 | 122 | - (instancetype)initWithType:(MNAssistiveTouchType)type 123 | frame:(CGRect)frame{ 124 | 125 | if (self = [super init]) { 126 | _type = type; 127 | CGFloat floatBtnX = screenW - floatBtnW; 128 | CGFloat floatBtnY = 60; 129 | 130 | frame = CGRectMake(floatBtnX, floatBtnY, floatBtnW, floatBtnH); 131 | self.frame = frame; 132 | } 133 | return self; 134 | } 135 | 136 | - (void)p_showFloatBtn{ 137 | self.floatBtn.hidden = NO; 138 | } 139 | 140 | #pragma mark - button move 141 | - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 142 | 143 | [super touchesBegan:touches withEvent:event]; 144 | 145 | //按钮刚按下的时候,获取此时的起始坐标 146 | UITouch *touch = [touches anyObject]; 147 | _touchPoint = [touch locationInView:self]; 148 | 149 | _touchBtnX = self.frame.origin.x; 150 | _touchBtnY = self.frame.origin.y; 151 | } 152 | 153 | - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ 154 | 155 | UITouch *touch = [touches anyObject]; 156 | CGPoint currentPosition = [touch locationInView:self]; 157 | 158 | //偏移量(当前坐标 - 起始坐标 = 偏移量) 159 | CGFloat offsetX = currentPosition.x - _touchPoint.x; 160 | CGFloat offsetY = currentPosition.y - _touchPoint.y; 161 | 162 | //移动后的按钮中心坐标 163 | CGFloat centerX = self.center.x + offsetX; 164 | CGFloat centerY = self.center.y + offsetY; 165 | self.center = CGPointMake(centerX, centerY); 166 | 167 | //父试图的宽高 168 | CGFloat superViewWidth = screenW; 169 | CGFloat superViewHeight = screenH; 170 | CGFloat btnX = self.frame.origin.x; 171 | CGFloat btnY = self.frame.origin.y; 172 | CGFloat btnW = self.frame.size.width; 173 | CGFloat btnH = self.frame.size.height; 174 | 175 | //x轴左右极限坐标 176 | if (btnX > superViewWidth){ 177 | //按钮右侧越界 178 | CGFloat centerX = superViewWidth - btnW/2; 179 | self.center = CGPointMake(centerX, centerY); 180 | }else if (btnX < 0){ 181 | //按钮左侧越界 182 | CGFloat centerX = btnW * 0.5; 183 | self.center = CGPointMake(centerX, centerY); 184 | } 185 | 186 | //默认都是有导航条的,有导航条的,父试图高度就要被导航条占据,固高度不够 187 | CGFloat defaultNaviHeight = 64; 188 | CGFloat judgeSuperViewHeight = superViewHeight - defaultNaviHeight; 189 | 190 | //y轴上下极限坐标 191 | if (btnY <= 0){ 192 | //按钮顶部越界 193 | centerY = btnH * 0.7; 194 | self.center = CGPointMake(centerX, centerY); 195 | } 196 | else if (btnY > judgeSuperViewHeight){ 197 | //按钮底部越界 198 | CGFloat y = superViewHeight - btnH * 0.5; 199 | self.center = CGPointMake(btnX, y); 200 | } 201 | } 202 | 203 | - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ 204 | 205 | CGFloat btnY = self.frame.origin.y; 206 | CGFloat btnX = self.frame.origin.x; 207 | CGFloat minDistance = 2; 208 | 209 | //结束move的时候,计算移动的距离是>最低要求,如果没有,就调用按钮点击事件 210 | BOOL isOverX = fabs(btnX - _touchBtnX) > minDistance; 211 | BOOL isOverY = fabs(btnY - _touchBtnY) > minDistance; 212 | 213 | if (isOverX || isOverY) { 214 | //超过移动范围就不响应点击 - 只做移动操作 215 | NSLog(@"move - btn"); 216 | [self touchesCancelled:touches withEvent:event]; 217 | }else{ 218 | [super touchesEnded:touches withEvent:event]; 219 | 220 | if (_floatBtn.btnClick) { 221 | _floatBtn.btnClick(_floatBtn); 222 | }else{ 223 | [self changeEnv]; 224 | } 225 | } 226 | 227 | //设置移动方法 228 | [self setMovingDirectionWithBtnX:btnX btnY:btnY]; 229 | } 230 | 231 | - (void)setMovingDirectionWithBtnX:(CGFloat)btnX btnY:(CGFloat)btnY{ 232 | switch (_type) { 233 | case MNAssistiveTypeNone:{ 234 | //自动识别贴边 235 | if (self.center.x >= screenW/2) { 236 | 237 | [UIView animateWithDuration:0.5 animations:^{ 238 | //按钮靠右自动吸边 239 | CGFloat btnX = screenW - floatBtnW; 240 | self.frame = CGRectMake(btnX, btnY, floatBtnW, floatBtnH); 241 | }]; 242 | }else{ 243 | 244 | [UIView animateWithDuration:0.5 animations:^{ 245 | //按钮靠左吸边 246 | CGFloat btnX = 0; 247 | self.frame = CGRectMake(btnX, btnY, floatBtnW, floatBtnH); 248 | }]; 249 | } 250 | break; 251 | } 252 | case MNAssistiveTypeNearLeft:{ 253 | [UIView animateWithDuration:0.5 animations:^{ 254 | //按钮靠左吸边 255 | CGFloat btnX = 0; 256 | self.frame = CGRectMake(btnX, btnY, floatBtnW, floatBtnH); 257 | }]; 258 | break; 259 | } 260 | case MNAssistiveTypeNearRight:{ 261 | [UIView animateWithDuration:0.5 animations:^{ 262 | //按钮靠右自动吸边 263 | CGFloat btnX = screenW - floatBtnW; 264 | self.frame = CGRectMake(btnX, btnY, floatBtnW, floatBtnH); 265 | }]; 266 | } 267 | } 268 | } 269 | 270 | - (void)changeEnv{ 271 | [self.floatBtn changeEnvironment]; 272 | } 273 | 274 | @end 275 | 276 | -------------------------------------------------------------------------------- /MNFloatBtn/MNFloatContentBtn.h: -------------------------------------------------------------------------------- 1 | // 2 | // MNFloatContentBtn.h 3 | // MNFloatBtn 4 | // 5 | // Created by Tyrion Liang on 2020/3/7. 6 | // 7 | 8 | #import 9 | 10 | NS_ASSUME_NONNULL_BEGIN 11 | 12 | typedef void (^floatBtnClick)(UIButton *sender); 13 | 14 | @interface MNFloatContentBtn : UIButton 15 | 16 | /** 17 | Build是否显示截屏当天日期 18 | 如果传NO - Build 显示 系统的Build - 需手动更新 19 | 如果传YES - 字段识别今天的日期 20 | */ 21 | - (void)setBuildShowDate:(BOOL)isBuildShowDate; 22 | 23 | - (void)setEnvironmentMap:(NSDictionary *)environmentMap currentEnv:(NSString *)currentEnv; 24 | 25 | - (void)changeEnvironment; 26 | 27 | //按钮点击事件 28 | @property (nonatomic, copy)floatBtnClick btnClick; 29 | 30 | @end 31 | 32 | NS_ASSUME_NONNULL_END 33 | -------------------------------------------------------------------------------- /MNFloatBtn/MNFloatContentBtn.m: -------------------------------------------------------------------------------- 1 | // 2 | // MNFloatContentBtn.m 3 | // MNFloatBtn 4 | // 5 | // Created by Tyrion Liang on 2020/3/7. 6 | // 7 | 8 | #import "MNFloatContentBtn.h" 9 | #import "NSDate+MNDate.h" 10 | #import "MNFloatBtn.h" 11 | 12 | @interface MNFloatContentBtn() 13 | 14 | //是否显示当前日期 15 | @property (nonatomic, assign, getter=isBuildShowDate) BOOL buildShowDate; 16 | 17 | //Build号 18 | @property(nonatomic, copy)NSString *buildStr; 19 | 20 | //当前展示的环境 21 | @property (nonatomic, copy)NSString *environmentStr; 22 | 23 | @property (nonatomic, copy)NSDictionary *environmentMap; 24 | 25 | @end 26 | 27 | @implementation MNFloatContentBtn 28 | 29 | //系统默认build 30 | #define MNFloatBtnSystemBuild [[[NSBundle mainBundle]infoDictionary]valueForKey:@"CFBundleVersion"] 31 | //系统默认version 32 | #define MNFloatBtnSystemVersion [[[NSBundle mainBundle]infoDictionary]valueForKey:@"CFBundleShortVersionString"] 33 | 34 | 35 | #pragma mark - lazy 36 | - (NSString *)buildStr{ 37 | if (!_buildStr) { 38 | _buildStr = [NSDate currentDate]; 39 | } 40 | return _buildStr; 41 | } 42 | 43 | #pragma mark - init 44 | - (instancetype)initWithFrame:(CGRect)frame{ 45 | if (self = [super initWithFrame:frame]) { 46 | 47 | UIImage *image = [self p_loadResourceImage]; 48 | 49 | //获取build的值 50 | [self p_getBuildStr]; 51 | 52 | NSString *title = [NSString stringWithFormat:@"Ver:%@ %@\nBuild:%@",MNFloatBtnSystemVersion,self.environmentStr, self.buildStr]; 53 | 54 | //UIbutton的换行显示 55 | self.titleLabel.lineBreakMode = NSLineBreakByWordWrapping; 56 | self.titleLabel.font = [UIFont systemFontOfSize:11]; 57 | [self setTitle:title forState:UIControlStateNormal]; 58 | [self setBackgroundImage:image forState:UIControlStateNormal]; 59 | 60 | } 61 | return self; 62 | } 63 | 64 | #pragma mark - set Method 65 | - (void)setBuildShowDate:(BOOL)isBuildShowDate{ 66 | _buildShowDate = isBuildShowDate; 67 | 68 | [self p_getBuildStr]; 69 | 70 | [self p_updateBtnTitle]; 71 | } 72 | 73 | - (void)changeEnvironment{ 74 | 75 | NSArray *envKeys = self.environmentMap.allKeys; 76 | NSInteger currentIndex = 0; 77 | if ([envKeys containsObject:self.environmentStr]) { 78 | currentIndex = [envKeys indexOfObject:self.environmentStr]; 79 | } 80 | NSInteger nextEnvIndex = (currentIndex + 1) % envKeys.count; 81 | self.environmentStr = envKeys[nextEnvIndex]; 82 | [self p_updateBtnTitle]; 83 | 84 | NSString *envBaseUrl = self.environmentMap[self.environmentStr]; 85 | 86 | NSString *saveBaseUrlKey = @"MNBaseUrl"; 87 | [[NSUserDefaults standardUserDefaults]setObject:envBaseUrl forKey:saveBaseUrlKey]; 88 | } 89 | 90 | - (void)setEnvironmentMap:(NSDictionary *)environmentMap 91 | currentEnv:(NSString *)currentEnv{ 92 | 93 | __block NSString *envStr = @"测试"; 94 | 95 | [environmentMap enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) { 96 | 97 | if ([currentEnv isEqualToString:obj]) { 98 | envStr = key; 99 | *stop = YES; 100 | } 101 | }]; 102 | 103 | self.environmentStr = envStr; 104 | self.environmentMap = environmentMap; 105 | [self p_updateBtnTitle]; 106 | } 107 | 108 | 109 | //获取build展示内容 110 | - (void)p_getBuildStr{ 111 | NSString *buildStr = [NSDate currentDate]; 112 | if (!self.isBuildShowDate) { 113 | buildStr = MNFloatBtnSystemBuild; 114 | } 115 | self.buildStr = buildStr; 116 | } 117 | 118 | - (void)p_updateBtnTitle{ 119 | 120 | NSString *title = [NSString stringWithFormat:@"Ver:%@ %@\nBuild:%@",MNFloatBtnSystemVersion,self.environmentStr, self.buildStr]; 121 | 122 | //如果createBtn的时候直接改title,可能会出现title无法更新问题,所以加个0.01s的延迟函数 123 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.01 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 124 | [self setTitle:title forState:UIControlStateNormal]; 125 | }); 126 | } 127 | 128 | - (NSString *)environmentStr{ 129 | if (!_environmentStr) { 130 | _environmentStr = @"测试"; 131 | } 132 | return _environmentStr; 133 | } 134 | 135 | 136 | #pragma mark - loadResourceImage 137 | - (UIImage *)p_loadResourceImage{ 138 | 139 | NSBundle *bundle = [NSBundle bundleForClass:[MNFloatBtn class]]; 140 | NSURL *url = [bundle URLForResource:@"MNFloatBtn" withExtension:@"bundle"]; 141 | NSBundle *imageBundle = [NSBundle bundleWithURL:url]; 142 | NSString *path = [imageBundle pathForResource:@"mn_placeholder@3x" ofType:@"png"]; 143 | UIImage *image = [UIImage imageWithContentsOfFile:path]; 144 | 145 | return image; 146 | } 147 | 148 | @end 149 | -------------------------------------------------------------------------------- /MNFloatBtn/NSDate+MNDate.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSDate+MNDate.h 3 | // MNFloatBtn_Example 4 | // 5 | // Created by TB-Mac-107 on 2019/1/23. 6 | // Copyright © 2019年 miniLV. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface NSDate (MNDate) 14 | 15 | + (NSString *)currentDate; 16 | 17 | @end 18 | 19 | NS_ASSUME_NONNULL_END 20 | -------------------------------------------------------------------------------- /MNFloatBtn/NSDate+MNDate.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSDate+MNDate.m 3 | // MNFloatBtn_Example 4 | // 5 | // Created by TB-Mac-107 on 2019/1/23. 6 | // Copyright © 2019年 miniLV. All rights reserved. 7 | // 8 | 9 | #import "NSDate+MNDate.h" 10 | 11 | @implementation NSDate (MNDate) 12 | 13 | + (NSString *)currentDate{ 14 | 15 | //获取系统时间戳 16 | NSDate* date1 = [NSDate date]; 17 | NSTimeInterval time1 =[date1 timeIntervalSince1970]; 18 | NSString *timeString = [NSString stringWithFormat:@"%.0f",time1]; 19 | 20 | //时间戳转换成时间 21 | NSTimeInterval time2 =[timeString doubleValue]; 22 | NSDate *date2 = [NSDate dateWithTimeIntervalSince1970:time2]; 23 | 24 | //显示的时间格式 25 | NSDateFormatter *formatter = [[NSDateFormatter alloc]init]; 26 | [formatter setDateFormat:@"yyyyMMdd"]; 27 | NSString *currentTime = [formatter stringFromDate:date2]; 28 | 29 | // 30 | 31 | //NSLog(@"当前时间:%@",currentTime); 32 | 33 | return currentTime; 34 | } 35 | 36 | @end 37 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MNFloatBtn 2 | 3 |

4 | 5 | 6 | 7 | 8 |

9 | 10 | ![demo示例](https://github.com/miniLV/MNFloatBtn/blob/master/Resources/demo.gif) 11 |
12 | ![切换环境示例](https://github.com/miniLV/MNFloatBtn/blob/master/Resources/demo2.gif) 13 | 14 | 15 | 16 | 17 | ## Installation 18 | 19 | #### Manually 20 | 21 | Just add the `MNFloatBtn` folder to your project 22 | 23 | #### CocoaPods 24 | 25 | Use [CocoaPods](https://cocoapods.org/) with Podfile: 26 | 27 | ``` 28 | pod 'MNFloatBtn' 29 | ``` 30 | 31 | ``` 32 | github "miniLV/MNFloatBtn" 33 | ``` 34 | 35 | ## Usage 36 | 37 | - The floating button is displayed in any case 38 | 39 | ``` 40 | [MNFloatBtn show]; 41 | ``` 42 | 43 |
44 | 45 | - Display the floating button only in Debug mode (recommended) 46 | 47 | ``` 48 | [MNFloatBtn showDebugModeWithType:MNAssistiveTypeNone]; 49 | ``` 50 | 51 |
52 | 53 | - remove floating button 54 | 55 | ``` 56 | [MNFloatBtn hidden]; 57 | ``` 58 | 59 | - touch event (*It is not recommended to use, there will be a function to switch the api environment.*) 60 | 61 | ``` 62 | [MNFloatBtn sharedBtn].btnClick = ^(UIButton *sender) { 63 | 64 | NSLog(@" btn.btnClick ~"); 65 | 66 | }; 67 | ``` 68 | 69 | ## Advanced usage 70 | 71 | - The current date is displayed by default 72 | 73 | ``` 74 | [[MNFloatBtn sharedBtn] setBuildShowDate:YES]; 75 | ``` 76 | 77 | - Configure the api environment display 78 | 79 | ``` 80 | #define kAddress @"testapi.miniLV.com" 81 | //#define kAddress @"devapi.miniLV.com" 82 | //#define kAddress @"api.miniLV.com" 83 | 84 | //Configure yourself - what api environment, what label to display 85 | NSDictionary *envMap = @{ 86 | @"test":@"testapi.miniLV.com", 87 | @"dev":@"devapi.miniLV.com", 88 | @"pro":@"api.miniLV.com" 89 | }; 90 | 91 | //Set different titles to be displayed in different environments, as well as the current Host 92 | [[MNFloatBtn sharedBtn]setEnvironmentMap:envMap currentEnv:kAddress]; 93 | 94 | ``` 95 | 96 |
97 | 98 | - **Updated after Version 2.3.0, built-in method for switching environment. (do not customize how to click the button ~)** 99 | 100 | ``` 101 | /**Touch event - use'[MNFloatBtn sharedBtn].btnClick' 102 | If you don't need to Custom click event. 103 | ==> built-in method:click floating button ==> auto switch api enviroment. 104 | */ 105 | 106 | //Custom click event 107 | //[MNFloatBtn sharedBtn].btnClick = ^(UIButton *sender) { 108 | // NSLog(@" btn.btnClick ~"); 109 | //}; 110 | ``` 111 | 112 | 113 | 114 | ------ 115 | 116 | # 中文版使用说明 117 | 118 | ## 集成方法 119 | 120 | 1.CocoaPods : `pod 'MNFloatBtn'` 121 | 122 | 2.手动导入 : 拖入`MNFloatBtn`文件夹 123 | 124 | ## 使用方法 125 | 126 | 1. 导入头文件,`#import ` 127 | 2. 一行代码,显示悬浮按钮 128 | 129 | ------ 130 | 131 | - 任何情况都显示悬浮按钮 132 | 133 | ``` 134 | [MNFloatBtn show]; 135 | ``` 136 | 137 |
138 | 139 | - 仅在Debug模式下显示悬浮按钮(推荐使用) 140 | 141 | ``` 142 | [MNFloatBtn showDebugModeWithType:MNAssistiveTypeNone]; 143 | ``` 144 | 145 |
146 | 147 | - 移除悬浮按钮在界面上显示 148 | 149 | ``` 150 | [MNFloatBtn hidden]; 151 | ``` 152 | 153 | - 按钮点击事件(*推荐不要自定义,会有内置的切换环境功能*) 154 | 155 | ``` 156 | [MNFloatBtn sharedBtn].btnClick = ^(UIButton *sender) { 157 | 158 | NSLog(@" btn.btnClick ~"); 159 | 160 | }; 161 | ``` 162 | 163 | ------ 164 | 165 | ## 进阶用法: 166 | 167 | - 默认显示当前日期 168 | 169 | ``` 170 | [[MNFloatBtn sharedBtn] setBuildShowDate:YES]; 171 | ``` 172 | 173 | - 配置api环境显示 174 | 175 | ``` 176 | #define kAddress @"testapi.miniLV.com" 177 | //#define kAddress @"devapi.miniLV.com" 178 | //#define kAddress @"api.miniLV.com" 179 | 180 | //自己配置 - 什么api环境下,要显示什么标签 181 | NSDictionary *envMap = @{ 182 | @"测试":@"testapi.miniLV.com", 183 | @"开发":@"devapi.miniLV.com", 184 | @"生产":@"api.miniLV.com" 185 | }; 186 | 187 | //设置不同环境下,要展示的不同title,以及当前的Host 188 | [[MNFloatBtn sharedBtn]setEnvironmentMap:envMap currentEnv:kAddress]; 189 | 190 | ``` 191 | 192 | - **Version 2.3.0 之后更新,内置切换环境的方法(不自定义实现按钮的点击方法~)** 193 | 194 | ``` 195 | /**点击事件 - 用'[MNFloatBtn sharedBtn].btnClick'触发 196 | 如果不需要自定义点击事件的话,可以不赋值. 197 | ==> 这样会实现内部的点击事件操作:点击按钮==>自动切换开发环境 198 | */ 199 | 200 | //自定义点击事件 201 | //[MNFloatBtn sharedBtn].btnClick = ^(UIButton *sender) { 202 | // NSLog(@" btn.btnClick ~"); 203 | //}; 204 | ``` 205 | 206 | 207 | 208 | **如果你在天朝,可以看这篇中文博客* 209 | [文章介绍](https://www.jianshu.com/p/5a0ca7c4fd78) 210 | -------------------------------------------------------------------------------- /Resources/demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miniLV/MNFloatBtn/e9e0be145387651c8a3bff86997ca4789d796218/Resources/demo.gif -------------------------------------------------------------------------------- /Resources/demo2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miniLV/MNFloatBtn/e9e0be145387651c8a3bff86997ca4789d796218/Resources/demo2.gif --------------------------------------------------------------------------------