├── .gitignore ├── CHANGELOG.md ├── Demo ├── MSLaunchView.xcodeproj │ ├── project.pbxproj │ └── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── MSLaunchView.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── MSLaunchView │ ├── AppDelegate.h │ ├── AppDelegate.m │ ├── Assets.xcassets │ │ ├── AppIcon.appiconset │ │ │ └── Contents.json │ │ ├── Contents.json │ │ ├── Ktv_ic_share_qq.imageset │ │ │ ├── Contents.json │ │ │ └── Ktv_ic_share_qq@2x.png │ │ ├── Ktv_ic_share_weixin.imageset │ │ │ ├── Contents.json │ │ │ └── Ktv_ic_share_weixin@2x.png │ │ ├── launch1.imageset │ │ │ ├── Contents.json │ │ │ └── launch1.png │ │ ├── launch2.imageset │ │ │ ├── Contents.json │ │ │ └── launch2.png │ │ └── launch3.imageset │ │ │ ├── Contents.json │ │ │ └── launch3.png │ ├── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard │ ├── DesignSketchGIF │ │ ├── Untitled-0.png │ │ ├── Untitled-1.gif │ │ ├── Untitled-2.gif │ │ ├── Untitled-3.gif │ │ ├── Untitled-4.gif │ │ ├── Untitled-5.gif │ │ ├── Untitled-6.gif │ │ ├── Untitled-7.gif │ │ ├── Untitled-8.gif │ │ └── Untitled-9.gif │ ├── Info.plist │ ├── ViewController.h │ ├── ViewController.m │ ├── main.m │ └── 测试.mp4 ├── MSLaunchViewTests │ ├── Info.plist │ └── MSLaunchViewTests.m ├── MSLaunchViewUITests │ ├── Info.plist │ └── MSLaunchViewUITests.m ├── Podfile ├── Podfile.lock └── Pods │ ├── MSPageControl │ ├── LICENSE │ ├── MSPageControl │ │ ├── MSPageControl.h │ │ └── MSPageControl.m │ └── README.md │ ├── Manifest.lock │ ├── Pods.xcodeproj │ └── project.pbxproj │ └── Target Support Files │ ├── MSPageControl │ ├── MSPageControl-Info.plist │ ├── MSPageControl-dummy.m │ ├── MSPageControl-prefix.pch │ ├── MSPageControl-umbrella.h │ ├── MSPageControl.modulemap │ └── MSPageControl.xcconfig │ ├── Pods-MSLaunchView │ ├── Pods-MSLaunchView-Info.plist │ ├── Pods-MSLaunchView-acknowledgements.markdown │ ├── Pods-MSLaunchView-acknowledgements.plist │ ├── Pods-MSLaunchView-dummy.m │ ├── Pods-MSLaunchView-frameworks-Debug-input-files.xcfilelist │ ├── Pods-MSLaunchView-frameworks-Debug-output-files.xcfilelist │ ├── Pods-MSLaunchView-frameworks-Release-input-files.xcfilelist │ ├── Pods-MSLaunchView-frameworks-Release-output-files.xcfilelist │ ├── Pods-MSLaunchView-frameworks.sh │ ├── Pods-MSLaunchView-umbrella.h │ ├── Pods-MSLaunchView.debug.xcconfig │ ├── Pods-MSLaunchView.modulemap │ └── Pods-MSLaunchView.release.xcconfig │ ├── Pods-MSLaunchViewTests │ ├── Pods-MSLaunchViewTests-Info.plist │ ├── Pods-MSLaunchViewTests-acknowledgements.markdown │ ├── Pods-MSLaunchViewTests-acknowledgements.plist │ ├── Pods-MSLaunchViewTests-dummy.m │ ├── Pods-MSLaunchViewTests-umbrella.h │ ├── Pods-MSLaunchViewTests.debug.xcconfig │ ├── Pods-MSLaunchViewTests.modulemap │ └── Pods-MSLaunchViewTests.release.xcconfig │ └── Pods-MSLaunchViewUITests │ ├── Pods-MSLaunchViewUITests-Info.plist │ ├── Pods-MSLaunchViewUITests-acknowledgements.markdown │ ├── Pods-MSLaunchViewUITests-acknowledgements.plist │ ├── Pods-MSLaunchViewUITests-dummy.m │ ├── Pods-MSLaunchViewUITests-umbrella.h │ ├── Pods-MSLaunchViewUITests.debug.xcconfig │ ├── Pods-MSLaunchViewUITests.modulemap │ └── Pods-MSLaunchViewUITests.release.xcconfig ├── LICENSE ├── MSLaunchView.podspec ├── MSLaunchView ├── MSLaunchOperation.h ├── MSLaunchOperation.m ├── MSLaunchView.h └── MSLaunchView.m ├── README.md └── _config.yml /.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/**/*.png 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 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # 更新记录 2 | ### 2019.07.09 -- v0.0.9 3 | 1、添加PageControl更多定义属性; 4 | 2、PageControl支持Pod自动管理; 5 | 3、新增最后一页是否隐藏PageControl属性(lastDotsIsHidden); 6 | 7 | ### 2019.06.22 -- v0.0.8 8 | 1、添加更多“跳过”按钮属性; 9 | 2、添加App是否是首次打开的宏定义; 10 | 3、微调初始化方法,是否测滑消失你说了算; 11 | 4、增加引导页隐藏后的回调方法; 12 | 13 | ### 2019.01.05 -- v0.0.7:提交0.0.7版本 14 | 1、添加PageControl更多的自定义属性; 15 | -------------------------------------------------------------------------------- /Demo/MSLaunchView.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 51; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 16D9E2CBAA3E5BD32EEF0982 /* Pods_MSLaunchViewUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B159C6EBD1B0143ED82F04A /* Pods_MSLaunchViewUITests.framework */; }; 11 | 5942846322C1B4E700DE63C6 /* MSLaunchView.m in Sources */ = {isa = PBXBuildFile; fileRef = 5942845C22C1B4E700DE63C6 /* MSLaunchView.m */; }; 12 | 5942846422C1B4E700DE63C6 /* MSLaunchOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 5942845E22C1B4E700DE63C6 /* MSLaunchOperation.m */; }; 13 | 883E35F621941B2E00A267E3 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 883E35F521941B2E00A267E3 /* AppDelegate.m */; }; 14 | 883E35F921941B2E00A267E3 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 883E35F821941B2E00A267E3 /* ViewController.m */; }; 15 | 883E35FC21941B2E00A267E3 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 883E35FA21941B2E00A267E3 /* Main.storyboard */; }; 16 | 883E35FE21941B4000A267E3 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 883E35FD21941B4000A267E3 /* Assets.xcassets */; }; 17 | 883E360121941B4000A267E3 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 883E35FF21941B4000A267E3 /* LaunchScreen.storyboard */; }; 18 | 883E360421941B4000A267E3 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 883E360321941B4000A267E3 /* main.m */; }; 19 | 883E360E21941B4000A267E3 /* MSLaunchViewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 883E360D21941B4000A267E3 /* MSLaunchViewTests.m */; }; 20 | 883E361921941B4000A267E3 /* MSLaunchViewUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = 883E361821941B4000A267E3 /* MSLaunchViewUITests.m */; }; 21 | 8853215E219943290054D188 /* Untitled-0.png in Resources */ = {isa = PBXBuildFile; fileRef = 88532154219943290054D188 /* Untitled-0.png */; }; 22 | 8853215F219943290054D188 /* Untitled-8.gif in Resources */ = {isa = PBXBuildFile; fileRef = 88532155219943290054D188 /* Untitled-8.gif */; }; 23 | 88532160219943290054D188 /* Untitled-9.gif in Resources */ = {isa = PBXBuildFile; fileRef = 88532156219943290054D188 /* Untitled-9.gif */; }; 24 | 88532161219943290054D188 /* Untitled-7.gif in Resources */ = {isa = PBXBuildFile; fileRef = 88532157219943290054D188 /* Untitled-7.gif */; }; 25 | 88532162219943290054D188 /* Untitled-6.gif in Resources */ = {isa = PBXBuildFile; fileRef = 88532158219943290054D188 /* Untitled-6.gif */; }; 26 | 88532163219943290054D188 /* Untitled-4.gif in Resources */ = {isa = PBXBuildFile; fileRef = 88532159219943290054D188 /* Untitled-4.gif */; }; 27 | 88532164219943290054D188 /* Untitled-5.gif in Resources */ = {isa = PBXBuildFile; fileRef = 8853215A219943290054D188 /* Untitled-5.gif */; }; 28 | 88532165219943290054D188 /* Untitled-1.gif in Resources */ = {isa = PBXBuildFile; fileRef = 8853215B219943290054D188 /* Untitled-1.gif */; }; 29 | 88532166219943290054D188 /* Untitled-2.gif in Resources */ = {isa = PBXBuildFile; fileRef = 8853215C219943290054D188 /* Untitled-2.gif */; }; 30 | 88532167219943290054D188 /* Untitled-3.gif in Resources */ = {isa = PBXBuildFile; fileRef = 8853215D219943290054D188 /* Untitled-3.gif */; }; 31 | A25B49E97ABF0A3387EA646A /* Pods_MSLaunchViewTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E55961E2F504E27178FAB89D /* Pods_MSLaunchViewTests.framework */; }; 32 | DCBBF55921949DA400B963C3 /* 测试.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = DCBBF55821949DA400B963C3 /* 测试.mp4 */; }; 33 | FC52581B8E4CCEF1652BCAE0 /* Pods_MSLaunchView.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 473C1A8BDDBD8600D40C2193 /* Pods_MSLaunchView.framework */; }; 34 | /* End PBXBuildFile section */ 35 | 36 | /* Begin PBXContainerItemProxy section */ 37 | 883E360A21941B4000A267E3 /* PBXContainerItemProxy */ = { 38 | isa = PBXContainerItemProxy; 39 | containerPortal = 883E35E921941B2E00A267E3 /* Project object */; 40 | proxyType = 1; 41 | remoteGlobalIDString = 883E35F021941B2E00A267E3; 42 | remoteInfo = MSLaunchView; 43 | }; 44 | 883E361521941B4000A267E3 /* PBXContainerItemProxy */ = { 45 | isa = PBXContainerItemProxy; 46 | containerPortal = 883E35E921941B2E00A267E3 /* Project object */; 47 | proxyType = 1; 48 | remoteGlobalIDString = 883E35F021941B2E00A267E3; 49 | remoteInfo = MSLaunchView; 50 | }; 51 | /* End PBXContainerItemProxy section */ 52 | 53 | /* Begin PBXFileReference section */ 54 | 02BE1D01AE3792B59680E879 /* Pods-MSLaunchViewTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MSLaunchViewTests.debug.xcconfig"; path = "Target Support Files/Pods-MSLaunchViewTests/Pods-MSLaunchViewTests.debug.xcconfig"; sourceTree = ""; }; 55 | 2308805C496669D48422DFFA /* Pods-MSLaunchView.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MSLaunchView.debug.xcconfig"; path = "Target Support Files/Pods-MSLaunchView/Pods-MSLaunchView.debug.xcconfig"; sourceTree = ""; }; 56 | 473C1A8BDDBD8600D40C2193 /* Pods_MSLaunchView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MSLaunchView.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 57 | 5942845C22C1B4E700DE63C6 /* MSLaunchView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MSLaunchView.m; sourceTree = ""; }; 58 | 5942845E22C1B4E700DE63C6 /* MSLaunchOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MSLaunchOperation.m; sourceTree = ""; }; 59 | 5942846122C1B4E700DE63C6 /* MSLaunchView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MSLaunchView.h; sourceTree = ""; }; 60 | 5942846222C1B4E700DE63C6 /* MSLaunchOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MSLaunchOperation.h; sourceTree = ""; }; 61 | 883E35F121941B2E00A267E3 /* MSLaunchView.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MSLaunchView.app; sourceTree = BUILT_PRODUCTS_DIR; }; 62 | 883E35F421941B2E00A267E3 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 63 | 883E35F521941B2E00A267E3 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 64 | 883E35F721941B2E00A267E3 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 65 | 883E35F821941B2E00A267E3 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 66 | 883E35FB21941B2E00A267E3 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 67 | 883E35FD21941B4000A267E3 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 68 | 883E360021941B4000A267E3 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 69 | 883E360221941B4000A267E3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 70 | 883E360321941B4000A267E3 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 71 | 883E360921941B4000A267E3 /* MSLaunchViewTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MSLaunchViewTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 72 | 883E360D21941B4000A267E3 /* MSLaunchViewTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MSLaunchViewTests.m; sourceTree = ""; }; 73 | 883E360F21941B4000A267E3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 74 | 883E361421941B4000A267E3 /* MSLaunchViewUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MSLaunchViewUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 75 | 883E361821941B4000A267E3 /* MSLaunchViewUITests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MSLaunchViewUITests.m; sourceTree = ""; }; 76 | 883E361A21941B4000A267E3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 77 | 88532154219943290054D188 /* Untitled-0.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Untitled-0.png"; sourceTree = ""; }; 78 | 88532155219943290054D188 /* Untitled-8.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = "Untitled-8.gif"; sourceTree = ""; }; 79 | 88532156219943290054D188 /* Untitled-9.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = "Untitled-9.gif"; sourceTree = ""; }; 80 | 88532157219943290054D188 /* Untitled-7.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = "Untitled-7.gif"; sourceTree = ""; }; 81 | 88532158219943290054D188 /* Untitled-6.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = "Untitled-6.gif"; sourceTree = ""; }; 82 | 88532159219943290054D188 /* Untitled-4.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = "Untitled-4.gif"; sourceTree = ""; }; 83 | 8853215A219943290054D188 /* Untitled-5.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = "Untitled-5.gif"; sourceTree = ""; }; 84 | 8853215B219943290054D188 /* Untitled-1.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = "Untitled-1.gif"; sourceTree = ""; }; 85 | 8853215C219943290054D188 /* Untitled-2.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = "Untitled-2.gif"; sourceTree = ""; }; 86 | 8853215D219943290054D188 /* Untitled-3.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = "Untitled-3.gif"; sourceTree = ""; }; 87 | 8A55DFFF47212AB2AC8E28F7 /* Pods-MSLaunchViewTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MSLaunchViewTests.release.xcconfig"; path = "Target Support Files/Pods-MSLaunchViewTests/Pods-MSLaunchViewTests.release.xcconfig"; sourceTree = ""; }; 88 | 8B159C6EBD1B0143ED82F04A /* Pods_MSLaunchViewUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MSLaunchViewUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 89 | DCBBF55821949DA400B963C3 /* 测试.mp4 */ = {isa = PBXFileReference; lastKnownFileType = file; path = "测试.mp4"; sourceTree = ""; }; 90 | E55961E2F504E27178FAB89D /* Pods_MSLaunchViewTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MSLaunchViewTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 91 | F789ED998667A35F6F77D54D /* Pods-MSLaunchViewUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MSLaunchViewUITests.release.xcconfig"; path = "Target Support Files/Pods-MSLaunchViewUITests/Pods-MSLaunchViewUITests.release.xcconfig"; sourceTree = ""; }; 92 | FC093430A4F5396F1EB5165F /* Pods-MSLaunchViewUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MSLaunchViewUITests.debug.xcconfig"; path = "Target Support Files/Pods-MSLaunchViewUITests/Pods-MSLaunchViewUITests.debug.xcconfig"; sourceTree = ""; }; 93 | FF17D5234A49504AB4B88AC9 /* Pods-MSLaunchView.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MSLaunchView.release.xcconfig"; path = "Target Support Files/Pods-MSLaunchView/Pods-MSLaunchView.release.xcconfig"; sourceTree = ""; }; 94 | /* End PBXFileReference section */ 95 | 96 | /* Begin PBXFrameworksBuildPhase section */ 97 | 883E35EE21941B2E00A267E3 /* Frameworks */ = { 98 | isa = PBXFrameworksBuildPhase; 99 | buildActionMask = 2147483647; 100 | files = ( 101 | FC52581B8E4CCEF1652BCAE0 /* Pods_MSLaunchView.framework in Frameworks */, 102 | ); 103 | runOnlyForDeploymentPostprocessing = 0; 104 | }; 105 | 883E360621941B4000A267E3 /* Frameworks */ = { 106 | isa = PBXFrameworksBuildPhase; 107 | buildActionMask = 2147483647; 108 | files = ( 109 | A25B49E97ABF0A3387EA646A /* Pods_MSLaunchViewTests.framework in Frameworks */, 110 | ); 111 | runOnlyForDeploymentPostprocessing = 0; 112 | }; 113 | 883E361121941B4000A267E3 /* Frameworks */ = { 114 | isa = PBXFrameworksBuildPhase; 115 | buildActionMask = 2147483647; 116 | files = ( 117 | 16D9E2CBAA3E5BD32EEF0982 /* Pods_MSLaunchViewUITests.framework in Frameworks */, 118 | ); 119 | runOnlyForDeploymentPostprocessing = 0; 120 | }; 121 | /* End PBXFrameworksBuildPhase section */ 122 | 123 | /* Begin PBXGroup section */ 124 | 1AD73089BC1F4A8B9FBDBAFB /* Pods */ = { 125 | isa = PBXGroup; 126 | children = ( 127 | 2308805C496669D48422DFFA /* Pods-MSLaunchView.debug.xcconfig */, 128 | FF17D5234A49504AB4B88AC9 /* Pods-MSLaunchView.release.xcconfig */, 129 | 02BE1D01AE3792B59680E879 /* Pods-MSLaunchViewTests.debug.xcconfig */, 130 | 8A55DFFF47212AB2AC8E28F7 /* Pods-MSLaunchViewTests.release.xcconfig */, 131 | FC093430A4F5396F1EB5165F /* Pods-MSLaunchViewUITests.debug.xcconfig */, 132 | F789ED998667A35F6F77D54D /* Pods-MSLaunchViewUITests.release.xcconfig */, 133 | ); 134 | path = Pods; 135 | sourceTree = ""; 136 | }; 137 | 5942845A22C1B4E700DE63C6 /* MSLaunchView */ = { 138 | isa = PBXGroup; 139 | children = ( 140 | 5942846222C1B4E700DE63C6 /* MSLaunchOperation.h */, 141 | 5942845E22C1B4E700DE63C6 /* MSLaunchOperation.m */, 142 | 5942846122C1B4E700DE63C6 /* MSLaunchView.h */, 143 | 5942845C22C1B4E700DE63C6 /* MSLaunchView.m */, 144 | ); 145 | name = MSLaunchView; 146 | path = ../../MSLaunchView; 147 | sourceTree = ""; 148 | }; 149 | 883E35E821941B2E00A267E3 = { 150 | isa = PBXGroup; 151 | children = ( 152 | 883E35F321941B2E00A267E3 /* MSLaunchView */, 153 | 883E360C21941B4000A267E3 /* MSLaunchViewTests */, 154 | 883E361721941B4000A267E3 /* MSLaunchViewUITests */, 155 | 883E35F221941B2E00A267E3 /* Products */, 156 | 1AD73089BC1F4A8B9FBDBAFB /* Pods */, 157 | C980C5DE19173B56443E5123 /* Frameworks */, 158 | ); 159 | sourceTree = ""; 160 | }; 161 | 883E35F221941B2E00A267E3 /* Products */ = { 162 | isa = PBXGroup; 163 | children = ( 164 | 883E35F121941B2E00A267E3 /* MSLaunchView.app */, 165 | 883E360921941B4000A267E3 /* MSLaunchViewTests.xctest */, 166 | 883E361421941B4000A267E3 /* MSLaunchViewUITests.xctest */, 167 | ); 168 | name = Products; 169 | sourceTree = ""; 170 | }; 171 | 883E35F321941B2E00A267E3 /* MSLaunchView */ = { 172 | isa = PBXGroup; 173 | children = ( 174 | 5942845A22C1B4E700DE63C6 /* MSLaunchView */, 175 | 88532153219943290054D188 /* DesignSketchGIF */, 176 | DCBBF55821949DA400B963C3 /* 测试.mp4 */, 177 | 883E35F421941B2E00A267E3 /* AppDelegate.h */, 178 | 883E35F521941B2E00A267E3 /* AppDelegate.m */, 179 | 883E35F721941B2E00A267E3 /* ViewController.h */, 180 | 883E35F821941B2E00A267E3 /* ViewController.m */, 181 | 883E35FA21941B2E00A267E3 /* Main.storyboard */, 182 | 883E35FD21941B4000A267E3 /* Assets.xcassets */, 183 | 883E35FF21941B4000A267E3 /* LaunchScreen.storyboard */, 184 | 883E360221941B4000A267E3 /* Info.plist */, 185 | 883E360321941B4000A267E3 /* main.m */, 186 | ); 187 | path = MSLaunchView; 188 | sourceTree = ""; 189 | }; 190 | 883E360C21941B4000A267E3 /* MSLaunchViewTests */ = { 191 | isa = PBXGroup; 192 | children = ( 193 | 883E360D21941B4000A267E3 /* MSLaunchViewTests.m */, 194 | 883E360F21941B4000A267E3 /* Info.plist */, 195 | ); 196 | path = MSLaunchViewTests; 197 | sourceTree = ""; 198 | }; 199 | 883E361721941B4000A267E3 /* MSLaunchViewUITests */ = { 200 | isa = PBXGroup; 201 | children = ( 202 | 883E361821941B4000A267E3 /* MSLaunchViewUITests.m */, 203 | 883E361A21941B4000A267E3 /* Info.plist */, 204 | ); 205 | path = MSLaunchViewUITests; 206 | sourceTree = ""; 207 | }; 208 | 88532153219943290054D188 /* DesignSketchGIF */ = { 209 | isa = PBXGroup; 210 | children = ( 211 | 88532154219943290054D188 /* Untitled-0.png */, 212 | 88532155219943290054D188 /* Untitled-8.gif */, 213 | 88532156219943290054D188 /* Untitled-9.gif */, 214 | 88532157219943290054D188 /* Untitled-7.gif */, 215 | 88532158219943290054D188 /* Untitled-6.gif */, 216 | 88532159219943290054D188 /* Untitled-4.gif */, 217 | 8853215A219943290054D188 /* Untitled-5.gif */, 218 | 8853215B219943290054D188 /* Untitled-1.gif */, 219 | 8853215C219943290054D188 /* Untitled-2.gif */, 220 | 8853215D219943290054D188 /* Untitled-3.gif */, 221 | ); 222 | path = DesignSketchGIF; 223 | sourceTree = ""; 224 | }; 225 | C980C5DE19173B56443E5123 /* Frameworks */ = { 226 | isa = PBXGroup; 227 | children = ( 228 | 473C1A8BDDBD8600D40C2193 /* Pods_MSLaunchView.framework */, 229 | E55961E2F504E27178FAB89D /* Pods_MSLaunchViewTests.framework */, 230 | 8B159C6EBD1B0143ED82F04A /* Pods_MSLaunchViewUITests.framework */, 231 | ); 232 | name = Frameworks; 233 | sourceTree = ""; 234 | }; 235 | /* End PBXGroup section */ 236 | 237 | /* Begin PBXNativeTarget section */ 238 | 883E35F021941B2E00A267E3 /* MSLaunchView */ = { 239 | isa = PBXNativeTarget; 240 | buildConfigurationList = 883E361D21941B4000A267E3 /* Build configuration list for PBXNativeTarget "MSLaunchView" */; 241 | buildPhases = ( 242 | B4A3F2152483DC62828BE9A5 /* [CP] Check Pods Manifest.lock */, 243 | 883E35ED21941B2E00A267E3 /* Sources */, 244 | 883E35EE21941B2E00A267E3 /* Frameworks */, 245 | 883E35EF21941B2E00A267E3 /* Resources */, 246 | A28677B70595086A1F91CF90 /* [CP] Embed Pods Frameworks */, 247 | ); 248 | buildRules = ( 249 | ); 250 | dependencies = ( 251 | ); 252 | name = MSLaunchView; 253 | productName = MSLaunchView; 254 | productReference = 883E35F121941B2E00A267E3 /* MSLaunchView.app */; 255 | productType = "com.apple.product-type.application"; 256 | }; 257 | 883E360821941B4000A267E3 /* MSLaunchViewTests */ = { 258 | isa = PBXNativeTarget; 259 | buildConfigurationList = 883E362021941B4000A267E3 /* Build configuration list for PBXNativeTarget "MSLaunchViewTests" */; 260 | buildPhases = ( 261 | E2991A5C7303B135ACC6760B /* [CP] Check Pods Manifest.lock */, 262 | 883E360521941B4000A267E3 /* Sources */, 263 | 883E360621941B4000A267E3 /* Frameworks */, 264 | 883E360721941B4000A267E3 /* Resources */, 265 | ); 266 | buildRules = ( 267 | ); 268 | dependencies = ( 269 | 883E360B21941B4000A267E3 /* PBXTargetDependency */, 270 | ); 271 | name = MSLaunchViewTests; 272 | productName = MSLaunchViewTests; 273 | productReference = 883E360921941B4000A267E3 /* MSLaunchViewTests.xctest */; 274 | productType = "com.apple.product-type.bundle.unit-test"; 275 | }; 276 | 883E361321941B4000A267E3 /* MSLaunchViewUITests */ = { 277 | isa = PBXNativeTarget; 278 | buildConfigurationList = 883E362321941B4000A267E3 /* Build configuration list for PBXNativeTarget "MSLaunchViewUITests" */; 279 | buildPhases = ( 280 | 98FB8813DBA02025785C7587 /* [CP] Check Pods Manifest.lock */, 281 | 883E361021941B4000A267E3 /* Sources */, 282 | 883E361121941B4000A267E3 /* Frameworks */, 283 | 883E361221941B4000A267E3 /* Resources */, 284 | ); 285 | buildRules = ( 286 | ); 287 | dependencies = ( 288 | 883E361621941B4000A267E3 /* PBXTargetDependency */, 289 | ); 290 | name = MSLaunchViewUITests; 291 | productName = MSLaunchViewUITests; 292 | productReference = 883E361421941B4000A267E3 /* MSLaunchViewUITests.xctest */; 293 | productType = "com.apple.product-type.bundle.ui-testing"; 294 | }; 295 | /* End PBXNativeTarget section */ 296 | 297 | /* Begin PBXProject section */ 298 | 883E35E921941B2E00A267E3 /* Project object */ = { 299 | isa = PBXProject; 300 | attributes = { 301 | LastUpgradeCheck = 1010; 302 | ORGANIZATIONNAME = TuBur; 303 | TargetAttributes = { 304 | 883E35F021941B2E00A267E3 = { 305 | CreatedOnToolsVersion = 10.1; 306 | }; 307 | 883E360821941B4000A267E3 = { 308 | CreatedOnToolsVersion = 10.1; 309 | TestTargetID = 883E35F021941B2E00A267E3; 310 | }; 311 | 883E361321941B4000A267E3 = { 312 | CreatedOnToolsVersion = 10.1; 313 | TestTargetID = 883E35F021941B2E00A267E3; 314 | }; 315 | }; 316 | }; 317 | buildConfigurationList = 883E35EC21941B2E00A267E3 /* Build configuration list for PBXProject "MSLaunchView" */; 318 | compatibilityVersion = "Xcode 9.3"; 319 | developmentRegion = en; 320 | hasScannedForEncodings = 0; 321 | knownRegions = ( 322 | en, 323 | Base, 324 | ); 325 | mainGroup = 883E35E821941B2E00A267E3; 326 | productRefGroup = 883E35F221941B2E00A267E3 /* Products */; 327 | projectDirPath = ""; 328 | projectRoot = ""; 329 | targets = ( 330 | 883E35F021941B2E00A267E3 /* MSLaunchView */, 331 | 883E360821941B4000A267E3 /* MSLaunchViewTests */, 332 | 883E361321941B4000A267E3 /* MSLaunchViewUITests */, 333 | ); 334 | }; 335 | /* End PBXProject section */ 336 | 337 | /* Begin PBXResourcesBuildPhase section */ 338 | 883E35EF21941B2E00A267E3 /* Resources */ = { 339 | isa = PBXResourcesBuildPhase; 340 | buildActionMask = 2147483647; 341 | files = ( 342 | 88532162219943290054D188 /* Untitled-6.gif in Resources */, 343 | 883E360121941B4000A267E3 /* LaunchScreen.storyboard in Resources */, 344 | 8853215E219943290054D188 /* Untitled-0.png in Resources */, 345 | DCBBF55921949DA400B963C3 /* 测试.mp4 in Resources */, 346 | 88532160219943290054D188 /* Untitled-9.gif in Resources */, 347 | 88532165219943290054D188 /* Untitled-1.gif in Resources */, 348 | 883E35FE21941B4000A267E3 /* Assets.xcassets in Resources */, 349 | 88532166219943290054D188 /* Untitled-2.gif in Resources */, 350 | 88532163219943290054D188 /* Untitled-4.gif in Resources */, 351 | 8853215F219943290054D188 /* Untitled-8.gif in Resources */, 352 | 88532164219943290054D188 /* Untitled-5.gif in Resources */, 353 | 883E35FC21941B2E00A267E3 /* Main.storyboard in Resources */, 354 | 88532161219943290054D188 /* Untitled-7.gif in Resources */, 355 | 88532167219943290054D188 /* Untitled-3.gif in Resources */, 356 | ); 357 | runOnlyForDeploymentPostprocessing = 0; 358 | }; 359 | 883E360721941B4000A267E3 /* Resources */ = { 360 | isa = PBXResourcesBuildPhase; 361 | buildActionMask = 2147483647; 362 | files = ( 363 | ); 364 | runOnlyForDeploymentPostprocessing = 0; 365 | }; 366 | 883E361221941B4000A267E3 /* Resources */ = { 367 | isa = PBXResourcesBuildPhase; 368 | buildActionMask = 2147483647; 369 | files = ( 370 | ); 371 | runOnlyForDeploymentPostprocessing = 0; 372 | }; 373 | /* End PBXResourcesBuildPhase section */ 374 | 375 | /* Begin PBXShellScriptBuildPhase section */ 376 | 98FB8813DBA02025785C7587 /* [CP] Check Pods Manifest.lock */ = { 377 | isa = PBXShellScriptBuildPhase; 378 | buildActionMask = 2147483647; 379 | files = ( 380 | ); 381 | inputFileListPaths = ( 382 | ); 383 | inputPaths = ( 384 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 385 | "${PODS_ROOT}/Manifest.lock", 386 | ); 387 | name = "[CP] Check Pods Manifest.lock"; 388 | outputFileListPaths = ( 389 | ); 390 | outputPaths = ( 391 | "$(DERIVED_FILE_DIR)/Pods-MSLaunchViewUITests-checkManifestLockResult.txt", 392 | ); 393 | runOnlyForDeploymentPostprocessing = 0; 394 | shellPath = /bin/sh; 395 | 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"; 396 | showEnvVarsInLog = 0; 397 | }; 398 | A28677B70595086A1F91CF90 /* [CP] Embed Pods Frameworks */ = { 399 | isa = PBXShellScriptBuildPhase; 400 | buildActionMask = 2147483647; 401 | files = ( 402 | ); 403 | inputFileListPaths = ( 404 | "${PODS_ROOT}/Target Support Files/Pods-MSLaunchView/Pods-MSLaunchView-frameworks-${CONFIGURATION}-input-files.xcfilelist", 405 | ); 406 | name = "[CP] Embed Pods Frameworks"; 407 | outputFileListPaths = ( 408 | "${PODS_ROOT}/Target Support Files/Pods-MSLaunchView/Pods-MSLaunchView-frameworks-${CONFIGURATION}-output-files.xcfilelist", 409 | ); 410 | runOnlyForDeploymentPostprocessing = 0; 411 | shellPath = /bin/sh; 412 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-MSLaunchView/Pods-MSLaunchView-frameworks.sh\"\n"; 413 | showEnvVarsInLog = 0; 414 | }; 415 | B4A3F2152483DC62828BE9A5 /* [CP] Check Pods Manifest.lock */ = { 416 | isa = PBXShellScriptBuildPhase; 417 | buildActionMask = 2147483647; 418 | files = ( 419 | ); 420 | inputFileListPaths = ( 421 | ); 422 | inputPaths = ( 423 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 424 | "${PODS_ROOT}/Manifest.lock", 425 | ); 426 | name = "[CP] Check Pods Manifest.lock"; 427 | outputFileListPaths = ( 428 | ); 429 | outputPaths = ( 430 | "$(DERIVED_FILE_DIR)/Pods-MSLaunchView-checkManifestLockResult.txt", 431 | ); 432 | runOnlyForDeploymentPostprocessing = 0; 433 | shellPath = /bin/sh; 434 | 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"; 435 | showEnvVarsInLog = 0; 436 | }; 437 | E2991A5C7303B135ACC6760B /* [CP] Check Pods Manifest.lock */ = { 438 | isa = PBXShellScriptBuildPhase; 439 | buildActionMask = 2147483647; 440 | files = ( 441 | ); 442 | inputFileListPaths = ( 443 | ); 444 | inputPaths = ( 445 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 446 | "${PODS_ROOT}/Manifest.lock", 447 | ); 448 | name = "[CP] Check Pods Manifest.lock"; 449 | outputFileListPaths = ( 450 | ); 451 | outputPaths = ( 452 | "$(DERIVED_FILE_DIR)/Pods-MSLaunchViewTests-checkManifestLockResult.txt", 453 | ); 454 | runOnlyForDeploymentPostprocessing = 0; 455 | shellPath = /bin/sh; 456 | 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"; 457 | showEnvVarsInLog = 0; 458 | }; 459 | /* End PBXShellScriptBuildPhase section */ 460 | 461 | /* Begin PBXSourcesBuildPhase section */ 462 | 883E35ED21941B2E00A267E3 /* Sources */ = { 463 | isa = PBXSourcesBuildPhase; 464 | buildActionMask = 2147483647; 465 | files = ( 466 | 883E35F921941B2E00A267E3 /* ViewController.m in Sources */, 467 | 883E360421941B4000A267E3 /* main.m in Sources */, 468 | 883E35F621941B2E00A267E3 /* AppDelegate.m in Sources */, 469 | 5942846422C1B4E700DE63C6 /* MSLaunchOperation.m in Sources */, 470 | 5942846322C1B4E700DE63C6 /* MSLaunchView.m in Sources */, 471 | ); 472 | runOnlyForDeploymentPostprocessing = 0; 473 | }; 474 | 883E360521941B4000A267E3 /* Sources */ = { 475 | isa = PBXSourcesBuildPhase; 476 | buildActionMask = 2147483647; 477 | files = ( 478 | 883E360E21941B4000A267E3 /* MSLaunchViewTests.m in Sources */, 479 | ); 480 | runOnlyForDeploymentPostprocessing = 0; 481 | }; 482 | 883E361021941B4000A267E3 /* Sources */ = { 483 | isa = PBXSourcesBuildPhase; 484 | buildActionMask = 2147483647; 485 | files = ( 486 | 883E361921941B4000A267E3 /* MSLaunchViewUITests.m in Sources */, 487 | ); 488 | runOnlyForDeploymentPostprocessing = 0; 489 | }; 490 | /* End PBXSourcesBuildPhase section */ 491 | 492 | /* Begin PBXTargetDependency section */ 493 | 883E360B21941B4000A267E3 /* PBXTargetDependency */ = { 494 | isa = PBXTargetDependency; 495 | target = 883E35F021941B2E00A267E3 /* MSLaunchView */; 496 | targetProxy = 883E360A21941B4000A267E3 /* PBXContainerItemProxy */; 497 | }; 498 | 883E361621941B4000A267E3 /* PBXTargetDependency */ = { 499 | isa = PBXTargetDependency; 500 | target = 883E35F021941B2E00A267E3 /* MSLaunchView */; 501 | targetProxy = 883E361521941B4000A267E3 /* PBXContainerItemProxy */; 502 | }; 503 | /* End PBXTargetDependency section */ 504 | 505 | /* Begin PBXVariantGroup section */ 506 | 883E35FA21941B2E00A267E3 /* Main.storyboard */ = { 507 | isa = PBXVariantGroup; 508 | children = ( 509 | 883E35FB21941B2E00A267E3 /* Base */, 510 | ); 511 | name = Main.storyboard; 512 | sourceTree = ""; 513 | }; 514 | 883E35FF21941B4000A267E3 /* LaunchScreen.storyboard */ = { 515 | isa = PBXVariantGroup; 516 | children = ( 517 | 883E360021941B4000A267E3 /* Base */, 518 | ); 519 | name = LaunchScreen.storyboard; 520 | sourceTree = ""; 521 | }; 522 | /* End PBXVariantGroup section */ 523 | 524 | /* Begin XCBuildConfiguration section */ 525 | 883E361B21941B4000A267E3 /* Debug */ = { 526 | isa = XCBuildConfiguration; 527 | buildSettings = { 528 | ALWAYS_SEARCH_USER_PATHS = NO; 529 | CLANG_ANALYZER_NONNULL = YES; 530 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 531 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 532 | CLANG_CXX_LIBRARY = "libc++"; 533 | CLANG_ENABLE_MODULES = YES; 534 | CLANG_ENABLE_OBJC_ARC = YES; 535 | CLANG_ENABLE_OBJC_WEAK = YES; 536 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 537 | CLANG_WARN_BOOL_CONVERSION = YES; 538 | CLANG_WARN_COMMA = YES; 539 | CLANG_WARN_CONSTANT_CONVERSION = YES; 540 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 541 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 542 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 543 | CLANG_WARN_EMPTY_BODY = YES; 544 | CLANG_WARN_ENUM_CONVERSION = YES; 545 | CLANG_WARN_INFINITE_RECURSION = YES; 546 | CLANG_WARN_INT_CONVERSION = YES; 547 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 548 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 549 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 550 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 551 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 552 | CLANG_WARN_STRICT_PROTOTYPES = YES; 553 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 554 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 555 | CLANG_WARN_UNREACHABLE_CODE = YES; 556 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 557 | CODE_SIGN_IDENTITY = "iPhone Developer"; 558 | COPY_PHASE_STRIP = NO; 559 | DEBUG_INFORMATION_FORMAT = dwarf; 560 | ENABLE_STRICT_OBJC_MSGSEND = YES; 561 | ENABLE_TESTABILITY = YES; 562 | GCC_C_LANGUAGE_STANDARD = gnu11; 563 | GCC_DYNAMIC_NO_PIC = NO; 564 | GCC_NO_COMMON_BLOCKS = YES; 565 | GCC_OPTIMIZATION_LEVEL = 0; 566 | GCC_PREPROCESSOR_DEFINITIONS = ( 567 | "DEBUG=1", 568 | "$(inherited)", 569 | ); 570 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 571 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 572 | GCC_WARN_UNDECLARED_SELECTOR = YES; 573 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 574 | GCC_WARN_UNUSED_FUNCTION = YES; 575 | GCC_WARN_UNUSED_VARIABLE = YES; 576 | IPHONEOS_DEPLOYMENT_TARGET = 12.1; 577 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 578 | MTL_FAST_MATH = YES; 579 | ONLY_ACTIVE_ARCH = YES; 580 | SDKROOT = iphoneos; 581 | }; 582 | name = Debug; 583 | }; 584 | 883E361C21941B4000A267E3 /* Release */ = { 585 | isa = XCBuildConfiguration; 586 | buildSettings = { 587 | ALWAYS_SEARCH_USER_PATHS = NO; 588 | CLANG_ANALYZER_NONNULL = YES; 589 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 590 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 591 | CLANG_CXX_LIBRARY = "libc++"; 592 | CLANG_ENABLE_MODULES = YES; 593 | CLANG_ENABLE_OBJC_ARC = YES; 594 | CLANG_ENABLE_OBJC_WEAK = YES; 595 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 596 | CLANG_WARN_BOOL_CONVERSION = YES; 597 | CLANG_WARN_COMMA = YES; 598 | CLANG_WARN_CONSTANT_CONVERSION = YES; 599 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 600 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 601 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 602 | CLANG_WARN_EMPTY_BODY = YES; 603 | CLANG_WARN_ENUM_CONVERSION = YES; 604 | CLANG_WARN_INFINITE_RECURSION = YES; 605 | CLANG_WARN_INT_CONVERSION = YES; 606 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 607 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 608 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 609 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 610 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 611 | CLANG_WARN_STRICT_PROTOTYPES = YES; 612 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 613 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 614 | CLANG_WARN_UNREACHABLE_CODE = YES; 615 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 616 | CODE_SIGN_IDENTITY = "iPhone Developer"; 617 | COPY_PHASE_STRIP = NO; 618 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 619 | ENABLE_NS_ASSERTIONS = NO; 620 | ENABLE_STRICT_OBJC_MSGSEND = YES; 621 | GCC_C_LANGUAGE_STANDARD = gnu11; 622 | GCC_NO_COMMON_BLOCKS = YES; 623 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 624 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 625 | GCC_WARN_UNDECLARED_SELECTOR = YES; 626 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 627 | GCC_WARN_UNUSED_FUNCTION = YES; 628 | GCC_WARN_UNUSED_VARIABLE = YES; 629 | IPHONEOS_DEPLOYMENT_TARGET = 12.1; 630 | MTL_ENABLE_DEBUG_INFO = NO; 631 | MTL_FAST_MATH = YES; 632 | SDKROOT = iphoneos; 633 | VALIDATE_PRODUCT = YES; 634 | }; 635 | name = Release; 636 | }; 637 | 883E361E21941B4000A267E3 /* Debug */ = { 638 | isa = XCBuildConfiguration; 639 | baseConfigurationReference = 2308805C496669D48422DFFA /* Pods-MSLaunchView.debug.xcconfig */; 640 | buildSettings = { 641 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 642 | CODE_SIGN_STYLE = Automatic; 643 | DEVELOPMENT_TEAM = NAWCVDY3ZB; 644 | INFOPLIST_FILE = MSLaunchView/Info.plist; 645 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 646 | LD_RUNPATH_SEARCH_PATHS = ( 647 | "$(inherited)", 648 | "@executable_path/Frameworks", 649 | ); 650 | PRODUCT_BUNDLE_IDENTIFIER = com.turbur.MSLaunchView; 651 | PRODUCT_NAME = "$(TARGET_NAME)"; 652 | TARGETED_DEVICE_FAMILY = 1; 653 | }; 654 | name = Debug; 655 | }; 656 | 883E361F21941B4000A267E3 /* Release */ = { 657 | isa = XCBuildConfiguration; 658 | baseConfigurationReference = FF17D5234A49504AB4B88AC9 /* Pods-MSLaunchView.release.xcconfig */; 659 | buildSettings = { 660 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 661 | CODE_SIGN_STYLE = Automatic; 662 | DEVELOPMENT_TEAM = NAWCVDY3ZB; 663 | INFOPLIST_FILE = MSLaunchView/Info.plist; 664 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 665 | LD_RUNPATH_SEARCH_PATHS = ( 666 | "$(inherited)", 667 | "@executable_path/Frameworks", 668 | ); 669 | PRODUCT_BUNDLE_IDENTIFIER = com.turbur.MSLaunchView; 670 | PRODUCT_NAME = "$(TARGET_NAME)"; 671 | TARGETED_DEVICE_FAMILY = 1; 672 | }; 673 | name = Release; 674 | }; 675 | 883E362121941B4000A267E3 /* Debug */ = { 676 | isa = XCBuildConfiguration; 677 | baseConfigurationReference = 02BE1D01AE3792B59680E879 /* Pods-MSLaunchViewTests.debug.xcconfig */; 678 | buildSettings = { 679 | BUNDLE_LOADER = "$(TEST_HOST)"; 680 | CODE_SIGN_STYLE = Automatic; 681 | DEVELOPMENT_TEAM = NAWCVDY3ZB; 682 | INFOPLIST_FILE = MSLaunchViewTests/Info.plist; 683 | LD_RUNPATH_SEARCH_PATHS = ( 684 | "$(inherited)", 685 | "@executable_path/Frameworks", 686 | "@loader_path/Frameworks", 687 | ); 688 | PRODUCT_BUNDLE_IDENTIFIER = com.turbur.MSLaunchViewTests; 689 | PRODUCT_NAME = "$(TARGET_NAME)"; 690 | TARGETED_DEVICE_FAMILY = "1,2"; 691 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/MSLaunchView.app/MSLaunchView"; 692 | }; 693 | name = Debug; 694 | }; 695 | 883E362221941B4000A267E3 /* Release */ = { 696 | isa = XCBuildConfiguration; 697 | baseConfigurationReference = 8A55DFFF47212AB2AC8E28F7 /* Pods-MSLaunchViewTests.release.xcconfig */; 698 | buildSettings = { 699 | BUNDLE_LOADER = "$(TEST_HOST)"; 700 | CODE_SIGN_STYLE = Automatic; 701 | DEVELOPMENT_TEAM = NAWCVDY3ZB; 702 | INFOPLIST_FILE = MSLaunchViewTests/Info.plist; 703 | LD_RUNPATH_SEARCH_PATHS = ( 704 | "$(inherited)", 705 | "@executable_path/Frameworks", 706 | "@loader_path/Frameworks", 707 | ); 708 | PRODUCT_BUNDLE_IDENTIFIER = com.turbur.MSLaunchViewTests; 709 | PRODUCT_NAME = "$(TARGET_NAME)"; 710 | TARGETED_DEVICE_FAMILY = "1,2"; 711 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/MSLaunchView.app/MSLaunchView"; 712 | }; 713 | name = Release; 714 | }; 715 | 883E362421941B4000A267E3 /* Debug */ = { 716 | isa = XCBuildConfiguration; 717 | baseConfigurationReference = FC093430A4F5396F1EB5165F /* Pods-MSLaunchViewUITests.debug.xcconfig */; 718 | buildSettings = { 719 | CODE_SIGN_STYLE = Automatic; 720 | DEVELOPMENT_TEAM = NAWCVDY3ZB; 721 | INFOPLIST_FILE = MSLaunchViewUITests/Info.plist; 722 | LD_RUNPATH_SEARCH_PATHS = ( 723 | "$(inherited)", 724 | "@executable_path/Frameworks", 725 | "@loader_path/Frameworks", 726 | ); 727 | PRODUCT_BUNDLE_IDENTIFIER = com.turbur.MSLaunchViewUITests; 728 | PRODUCT_NAME = "$(TARGET_NAME)"; 729 | TARGETED_DEVICE_FAMILY = "1,2"; 730 | TEST_TARGET_NAME = MSLaunchView; 731 | }; 732 | name = Debug; 733 | }; 734 | 883E362521941B4000A267E3 /* Release */ = { 735 | isa = XCBuildConfiguration; 736 | baseConfigurationReference = F789ED998667A35F6F77D54D /* Pods-MSLaunchViewUITests.release.xcconfig */; 737 | buildSettings = { 738 | CODE_SIGN_STYLE = Automatic; 739 | DEVELOPMENT_TEAM = NAWCVDY3ZB; 740 | INFOPLIST_FILE = MSLaunchViewUITests/Info.plist; 741 | LD_RUNPATH_SEARCH_PATHS = ( 742 | "$(inherited)", 743 | "@executable_path/Frameworks", 744 | "@loader_path/Frameworks", 745 | ); 746 | PRODUCT_BUNDLE_IDENTIFIER = com.turbur.MSLaunchViewUITests; 747 | PRODUCT_NAME = "$(TARGET_NAME)"; 748 | TARGETED_DEVICE_FAMILY = "1,2"; 749 | TEST_TARGET_NAME = MSLaunchView; 750 | }; 751 | name = Release; 752 | }; 753 | /* End XCBuildConfiguration section */ 754 | 755 | /* Begin XCConfigurationList section */ 756 | 883E35EC21941B2E00A267E3 /* Build configuration list for PBXProject "MSLaunchView" */ = { 757 | isa = XCConfigurationList; 758 | buildConfigurations = ( 759 | 883E361B21941B4000A267E3 /* Debug */, 760 | 883E361C21941B4000A267E3 /* Release */, 761 | ); 762 | defaultConfigurationIsVisible = 0; 763 | defaultConfigurationName = Release; 764 | }; 765 | 883E361D21941B4000A267E3 /* Build configuration list for PBXNativeTarget "MSLaunchView" */ = { 766 | isa = XCConfigurationList; 767 | buildConfigurations = ( 768 | 883E361E21941B4000A267E3 /* Debug */, 769 | 883E361F21941B4000A267E3 /* Release */, 770 | ); 771 | defaultConfigurationIsVisible = 0; 772 | defaultConfigurationName = Release; 773 | }; 774 | 883E362021941B4000A267E3 /* Build configuration list for PBXNativeTarget "MSLaunchViewTests" */ = { 775 | isa = XCConfigurationList; 776 | buildConfigurations = ( 777 | 883E362121941B4000A267E3 /* Debug */, 778 | 883E362221941B4000A267E3 /* Release */, 779 | ); 780 | defaultConfigurationIsVisible = 0; 781 | defaultConfigurationName = Release; 782 | }; 783 | 883E362321941B4000A267E3 /* Build configuration list for PBXNativeTarget "MSLaunchViewUITests" */ = { 784 | isa = XCConfigurationList; 785 | buildConfigurations = ( 786 | 883E362421941B4000A267E3 /* Debug */, 787 | 883E362521941B4000A267E3 /* Release */, 788 | ); 789 | defaultConfigurationIsVisible = 0; 790 | defaultConfigurationName = Release; 791 | }; 792 | /* End XCConfigurationList section */ 793 | }; 794 | rootObject = 883E35E921941B2E00A267E3 /* Project object */; 795 | } 796 | -------------------------------------------------------------------------------- /Demo/MSLaunchView.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Demo/MSLaunchView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Demo/MSLaunchView.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Demo/MSLaunchView.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Demo/MSLaunchView/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // MSLaunchView 4 | // 5 | // Created by TuBo on 2018/11/8. 6 | // Copyright © 2018 TuBur. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | @end 16 | 17 | -------------------------------------------------------------------------------- /Demo/MSLaunchView/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // MSLaunchView 4 | // 5 | // Created by TuBo on 2018/11/8. 6 | // Copyright © 2018 TuBur. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | #import "MSLaunchView.h" 11 | 12 | #define MSScreenW [UIScreen mainScreen].bounds.size.width 13 | #define MSScreenH [UIScreen mainScreen].bounds.size.height 14 | @interface AppDelegate (){ 15 | MSLaunchView *_launchView; 16 | } 17 | 18 | @end 19 | 20 | 21 | @implementation AppDelegate 22 | 23 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 24 | 25 | self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 26 | self.window.backgroundColor = [UIColor whiteColor]; 27 | UIViewController *vc = [[UIViewController alloc] init]; 28 | vc.view.backgroundColor = [UIColor redColor]; 29 | self.window.rootViewController = vc; 30 | [self.window makeKeyAndVisible]; 31 | 32 | if (kisFirstLaunch) {//或者使用[MSLaunchView isFirstLaunch]判断是否是第一次进入 33 | 34 | NSArray *imageNameArray = @[@"Untitled-4.gif",@"Untitled-6.gif",@"Untitled-7.gif"]; 35 | CGRect rt = CGRectMake(MSScreenW*0.3, MSScreenH*0.8, MSScreenW*0.4, MSScreenH*0.08); 36 | 37 | #pragma mark ---->>带立即体验按钮,项目是SB创建的 (此方法初始化,则guideBtnCustom:方法失效) 38 | // MSLaunchView *launchView = [MSLaunchView launchWithImages:imageNameArray sbName:@"" guideFrame:rt gImage:[UIImage imageNamed:@""] isScrollOut:YES]; 39 | #pragma mark ---->>不带立即体验按钮 项目是SB创建的 40 | // MSLaunchView *launchView = [MSLaunchView launchWithImages:imageNameArray sbName:@"" isScrollOut:NO]; 41 | #pragma mark ---->>不带立即按钮 代码创建项目 42 | // MSLaunchView *launchView = [MSLaunchView launchWithImages:imageNameArray isScrollOut:YES]; 43 | #pragma mark ---->>带立即按钮 代码创建项目 44 | MSLaunchView *launchView = [MSLaunchView launchWithImages:imageNameArray guideFrame:rt gImage:[UIImage imageNamed:@""] isScrollOut:NO]; 45 | 46 | 47 | #pragma mark ---->>关于Video 没有立即进入按钮 48 | // NSString *path = [[NSBundle mainBundle] pathForResource:@"测试" ofType:@"mp4"]; 49 | // NSURL *url = [NSURL fileURLWithPath:path]; 50 | // MSLaunchView *launchView = [MSLaunchView launchWithVideo:CGRectMake(0, 0, MSScreenW, MSScreenH) videoURL:url]; 51 | // launchView.videoGravity = AVLayerVideoGravityResize; 52 | // launchView.isPalyEndOut = YES;// 53 | 54 | launchView.guideTitle = @"进入当前界面"; 55 | launchView.guideTitleColor = [UIColor blackColor]; 56 | launchView.guideTitleFont = [UIFont systemFontOfSize:17]; 57 | 58 | #pragma mark ---->>跳过按钮自定义属性 59 | launchView.skipTitle = @"跳过"; 60 | launchView.skipTitleColor = [UIColor whiteColor]; 61 | launchView.skipTitleFont = [UIFont systemFontOfSize:15]; 62 | launchView.skipBackgroundColor = [UIColor redColor]; 63 | launchView.skipBackgroundImage = [UIImage imageNamed:@""]; 64 | 65 | 66 | #pragma mark ---->>PageControl自定义属性 67 | 68 | // launchView.showPageControl = NO; 69 | //pageControl的间距大小 70 | // launchView.pageControlStyle = MSPageControlStyleNumber; 71 | 72 | // launchView.pageControlBottomOffset += 25; 73 | launchView.pageDotColor = [UIColor redColor]; 74 | launchView.currentPageDotColor = [UIColor yellowColor]; 75 | launchView.textFont = [UIFont systemFontOfSize:9 weight:UIFontWeightBold]; 76 | launchView.textColor = [UIColor blackColor]; 77 | launchView.dotsIsSquare = NO; 78 | launchView.spacingBetweenDots = 15; 79 | 80 | launchView.dotBorderWidth = 2; 81 | launchView.dotBorderColor = [UIColor blueColor]; 82 | launchView.currentDotBorderWidth = 2; 83 | launchView.currentDotBorderColor = [UIColor redColor]; 84 | launchView.delegate = self; 85 | //设置了pageDotImage和currentPageDotImage图片 pageControlDotSize和currentWidthMultiple将失效 86 | launchView.pageControlDotSize = CGSizeMake(20, 20); 87 | launchView.currentWidthMultiple = 3; 88 | 89 | launchView.lastDotsIsHidden = YES;//最后一个页面时是否隐藏PageControl 默认为NO 90 | launchView.pageDotImage = [UIImage imageNamed:@"Ktv_ic_share_qq"]; 91 | launchView.currentPageDotImage = [UIImage imageNamed:@"Ktv_ic_share_weixin"]; 92 | launchView.loadFinishBlock = ^(MSLaunchView * _Nonnull launchView) { 93 | NSLog(@"广告加载完成了"); 94 | }; 95 | 96 | #pragma mark ---->>自定义立即体验按钮 97 | [launchView guideBtnCustom:^UIButton * _Nonnull{ 98 | UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; 99 | btn.frame = CGRectMake(60, 60, 130, 60); 100 | [btn setBackgroundColor:[UIColor redColor]]; 101 | [btn setTitle:@"立即体验" forState:UIControlStateNormal]; 102 | [btn addTarget:self action:@selector(hidde) forControlEvents:UIControlEventTouchUpInside]; 103 | return btn; 104 | }]; 105 | 106 | #pragma mark ---->>自定义跳过按钮 107 | 108 | // [launchView skipBtnCustom:^UIButton * _Nonnull{ 109 | // UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; 110 | // btn.frame = CGRectMake(60, 200, 120, 120); 111 | // [btn setBackgroundColor:[UIColor blueColor]]; 112 | // [btn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; 113 | // [btn setTitle:@"跳过按钮" forState:UIControlStateNormal]; 114 | // [btn addTarget:self action:@selector(hidde) forControlEvents:UIControlEventTouchUpInside]; 115 | // return btn; 116 | // }]; 117 | 118 | _launchView = launchView; 119 | } 120 | 121 | return YES; 122 | } 123 | 124 | -(void)hidde{ 125 | [_launchView hideGuidView]; 126 | } 127 | 128 | -(void)launchViewLoadFinish:(MSLaunchView *)launchView{ 129 | NSLog(@"代理方法进入======广告加载完成了"); 130 | } 131 | 132 | - (void)applicationWillResignActive:(UIApplication *)application { 133 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 134 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. 135 | } 136 | 137 | 138 | - (void)applicationDidEnterBackground:(UIApplication *)application { 139 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 140 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 141 | } 142 | 143 | 144 | - (void)applicationWillEnterForeground:(UIApplication *)application { 145 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 146 | } 147 | 148 | 149 | - (void)applicationDidBecomeActive:(UIApplication *)application { 150 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 151 | } 152 | 153 | 154 | - (void)applicationWillTerminate:(UIApplication *)application { 155 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 156 | } 157 | 158 | 159 | @end 160 | -------------------------------------------------------------------------------- /Demo/MSLaunchView/Assets.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 | } -------------------------------------------------------------------------------- /Demo/MSLaunchView/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Demo/MSLaunchView/Assets.xcassets/Ktv_ic_share_qq.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "Ktv_ic_share_qq@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /Demo/MSLaunchView/Assets.xcassets/Ktv_ic_share_qq.imageset/Ktv_ic_share_qq@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/milletpeak/MSLaunchView/292f0ec3e545447bc6d51b4f1475f339405a71cc/Demo/MSLaunchView/Assets.xcassets/Ktv_ic_share_qq.imageset/Ktv_ic_share_qq@2x.png -------------------------------------------------------------------------------- /Demo/MSLaunchView/Assets.xcassets/Ktv_ic_share_weixin.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "Ktv_ic_share_weixin@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /Demo/MSLaunchView/Assets.xcassets/Ktv_ic_share_weixin.imageset/Ktv_ic_share_weixin@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/milletpeak/MSLaunchView/292f0ec3e545447bc6d51b4f1475f339405a71cc/Demo/MSLaunchView/Assets.xcassets/Ktv_ic_share_weixin.imageset/Ktv_ic_share_weixin@2x.png -------------------------------------------------------------------------------- /Demo/MSLaunchView/Assets.xcassets/launch1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "launch1.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /Demo/MSLaunchView/Assets.xcassets/launch1.imageset/launch1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/milletpeak/MSLaunchView/292f0ec3e545447bc6d51b4f1475f339405a71cc/Demo/MSLaunchView/Assets.xcassets/launch1.imageset/launch1.png -------------------------------------------------------------------------------- /Demo/MSLaunchView/Assets.xcassets/launch2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "launch2.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /Demo/MSLaunchView/Assets.xcassets/launch2.imageset/launch2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/milletpeak/MSLaunchView/292f0ec3e545447bc6d51b4f1475f339405a71cc/Demo/MSLaunchView/Assets.xcassets/launch2.imageset/launch2.png -------------------------------------------------------------------------------- /Demo/MSLaunchView/Assets.xcassets/launch3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "launch3.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /Demo/MSLaunchView/Assets.xcassets/launch3.imageset/launch3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/milletpeak/MSLaunchView/292f0ec3e545447bc6d51b4f1475f339405a71cc/Demo/MSLaunchView/Assets.xcassets/launch3.imageset/launch3.png -------------------------------------------------------------------------------- /Demo/MSLaunchView/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 | -------------------------------------------------------------------------------- /Demo/MSLaunchView/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 | -------------------------------------------------------------------------------- /Demo/MSLaunchView/DesignSketchGIF/Untitled-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/milletpeak/MSLaunchView/292f0ec3e545447bc6d51b4f1475f339405a71cc/Demo/MSLaunchView/DesignSketchGIF/Untitled-0.png -------------------------------------------------------------------------------- /Demo/MSLaunchView/DesignSketchGIF/Untitled-1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/milletpeak/MSLaunchView/292f0ec3e545447bc6d51b4f1475f339405a71cc/Demo/MSLaunchView/DesignSketchGIF/Untitled-1.gif -------------------------------------------------------------------------------- /Demo/MSLaunchView/DesignSketchGIF/Untitled-2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/milletpeak/MSLaunchView/292f0ec3e545447bc6d51b4f1475f339405a71cc/Demo/MSLaunchView/DesignSketchGIF/Untitled-2.gif -------------------------------------------------------------------------------- /Demo/MSLaunchView/DesignSketchGIF/Untitled-3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/milletpeak/MSLaunchView/292f0ec3e545447bc6d51b4f1475f339405a71cc/Demo/MSLaunchView/DesignSketchGIF/Untitled-3.gif -------------------------------------------------------------------------------- /Demo/MSLaunchView/DesignSketchGIF/Untitled-4.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/milletpeak/MSLaunchView/292f0ec3e545447bc6d51b4f1475f339405a71cc/Demo/MSLaunchView/DesignSketchGIF/Untitled-4.gif -------------------------------------------------------------------------------- /Demo/MSLaunchView/DesignSketchGIF/Untitled-5.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/milletpeak/MSLaunchView/292f0ec3e545447bc6d51b4f1475f339405a71cc/Demo/MSLaunchView/DesignSketchGIF/Untitled-5.gif -------------------------------------------------------------------------------- /Demo/MSLaunchView/DesignSketchGIF/Untitled-6.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/milletpeak/MSLaunchView/292f0ec3e545447bc6d51b4f1475f339405a71cc/Demo/MSLaunchView/DesignSketchGIF/Untitled-6.gif -------------------------------------------------------------------------------- /Demo/MSLaunchView/DesignSketchGIF/Untitled-7.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/milletpeak/MSLaunchView/292f0ec3e545447bc6d51b4f1475f339405a71cc/Demo/MSLaunchView/DesignSketchGIF/Untitled-7.gif -------------------------------------------------------------------------------- /Demo/MSLaunchView/DesignSketchGIF/Untitled-8.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/milletpeak/MSLaunchView/292f0ec3e545447bc6d51b4f1475f339405a71cc/Demo/MSLaunchView/DesignSketchGIF/Untitled-8.gif -------------------------------------------------------------------------------- /Demo/MSLaunchView/DesignSketchGIF/Untitled-9.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/milletpeak/MSLaunchView/292f0ec3e545447bc6d51b4f1475f339405a71cc/Demo/MSLaunchView/DesignSketchGIF/Untitled-9.gif -------------------------------------------------------------------------------- /Demo/MSLaunchView/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0.7 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UILaunchStoryboardName 24 | LaunchScreen 25 | UIMainStoryboardFile 26 | Main 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationPortraitUpsideDown 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /Demo/MSLaunchView/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.h 3 | // MSLaunchView 4 | // 5 | // Created by TuBo on 2018/11/8. 6 | // Copyright © 2018 TuBur. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ViewController : UIViewController 12 | 13 | 14 | @end 15 | 16 | -------------------------------------------------------------------------------- /Demo/MSLaunchView/ViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.m 3 | // MSLaunchView 4 | // 5 | // Created by TuBo on 2018/11/8. 6 | // Copyright © 2018 TuBur. All rights reserved. 7 | // 8 | 9 | #import "ViewController.h" 10 | #import 11 | //#import 12 | #import 13 | 14 | @interface ViewController () 15 | 16 | @end 17 | 18 | @implementation ViewController 19 | 20 | - (void)viewDidLoad { 21 | [super viewDidLoad]; 22 | // self.view.backgroundColor = [UIColor redColor]; 23 | } 24 | 25 | 26 | @end 27 | -------------------------------------------------------------------------------- /Demo/MSLaunchView/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // MSLaunchView 4 | // 5 | // Created by TuBo on 2018/11/8. 6 | // Copyright © 2018 TuBur. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) { 13 | @autoreleasepool { 14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Demo/MSLaunchView/测试.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/milletpeak/MSLaunchView/292f0ec3e545447bc6d51b4f1475f339405a71cc/Demo/MSLaunchView/测试.mp4 -------------------------------------------------------------------------------- /Demo/MSLaunchViewTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /Demo/MSLaunchViewTests/MSLaunchViewTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // MSLaunchViewTests.m 3 | // MSLaunchViewTests 4 | // 5 | // Created by TuBo on 2018/11/8. 6 | // Copyright © 2018 TuBur. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface MSLaunchViewTests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation MSLaunchViewTests 16 | 17 | - (void)setUp { 18 | // Put setup code here. This method is called before the invocation of each test method in the class. 19 | } 20 | 21 | - (void)tearDown { 22 | // Put teardown code here. This method is called after the invocation of each test method in the class. 23 | } 24 | 25 | - (void)testExample { 26 | // This is an example of a functional test case. 27 | // Use XCTAssert and related functions to verify your tests produce the correct results. 28 | } 29 | 30 | - (void)testPerformanceExample { 31 | // This is an example of a performance test case. 32 | [self measureBlock:^{ 33 | // Put the code you want to measure the time of here. 34 | }]; 35 | } 36 | 37 | @end 38 | -------------------------------------------------------------------------------- /Demo/MSLaunchViewUITests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /Demo/MSLaunchViewUITests/MSLaunchViewUITests.m: -------------------------------------------------------------------------------- 1 | // 2 | // MSLaunchViewUITests.m 3 | // MSLaunchViewUITests 4 | // 5 | // Created by TuBo on 2018/11/8. 6 | // Copyright © 2018 TuBur. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface MSLaunchViewUITests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation MSLaunchViewUITests 16 | 17 | - (void)setUp { 18 | // Put setup code here. This method is called before the invocation of each test method in the class. 19 | 20 | // In UI tests it is usually best to stop immediately when a failure occurs. 21 | self.continueAfterFailure = NO; 22 | 23 | // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. 24 | [[[XCUIApplication alloc] init] launch]; 25 | 26 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. 27 | } 28 | 29 | - (void)tearDown { 30 | // Put teardown code here. This method is called after the invocation of each test method in the class. 31 | } 32 | 33 | - (void)testExample { 34 | // Use recording to get started writing UI tests. 35 | // Use XCTAssert and related functions to verify your tests produce the correct results. 36 | } 37 | 38 | @end 39 | -------------------------------------------------------------------------------- /Demo/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment the next line to define a global platform for your project 2 | platform :ios, '9.0' 3 | 4 | target 'MSLaunchView' do 5 | # Comment the next line if you don't want to use dynamic frameworks 6 | use_frameworks! 7 | pod 'MSPageControl' 8 | # Pods for MSLaunchView 9 | 10 | target 'MSLaunchViewTests' do 11 | inherit! :search_paths 12 | # Pods for testing 13 | end 14 | 15 | target 'MSLaunchViewUITests' do 16 | inherit! :search_paths 17 | # Pods for testing 18 | end 19 | 20 | end 21 | -------------------------------------------------------------------------------- /Demo/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - MSPageControl (0.0.3) 3 | 4 | DEPENDENCIES: 5 | - MSPageControl 6 | 7 | SPEC REPOS: 8 | https://github.com/cocoapods/specs.git: 9 | - MSPageControl 10 | 11 | SPEC CHECKSUMS: 12 | MSPageControl: d1b695ec3641f75baa74a29ed7dbc28a0aabfb61 13 | 14 | PODFILE CHECKSUM: bb786cb095bd02aca394e3919b92e0a8a7608214 15 | 16 | COCOAPODS: 1.7.5 17 | -------------------------------------------------------------------------------- /Demo/Pods/MSPageControl/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 lztb 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Demo/Pods/MSPageControl/MSPageControl/MSPageControl.h: -------------------------------------------------------------------------------- 1 | // 2 | // MSPageControl.h 3 | // MSPageControl 4 | // 5 | // Created by lztb on 2019/6/27. 6 | // Copyright © 2019 lztbwlkj. All rights reserved. 7 | // 8 | 9 | #import 10 | NS_ASSUME_NONNULL_BEGIN 11 | typedef NS_ENUM(NSInteger, MSPageControlStyle) { 12 | MSPageControlStyleSystem,//系统样式 默认 13 | MSPageControlStyleNumber //带有数字样式 14 | }; 15 | 16 | typedef NS_ENUM(NSInteger, MSPageControlAnimation) { 17 | MSPageControlAnimationNone,//没有动画 18 | MSPageControlAnimationSystem, 19 | }; 20 | 21 | @class MSPageControl; 22 | /** 23 | 点击dotView的回调方法 24 | 25 | @param pageControl pageControl 26 | @param index 点击的当前下标 27 | */ 28 | typedef void(^didSelectPageAtIndex)(MSPageControl *pageControl,NSInteger index); 29 | 30 | @protocol MSPageControlDelegate 31 | 32 | @optional 33 | - (void)pageControl:(MSPageControl *)pageControl didSelectPageAtIndex:(NSInteger)index; 34 | 35 | @end 36 | 37 | @interface MSPageControl : UIControl 38 | 39 | /** 40 | MSPageControl的样式 目前只支持两种样式 41 | */ 42 | @property(nonatomic,assign) MSPageControlStyle pageControlStyle; 43 | 44 | /** 45 | MSPageControl的过渡动画 目前只支持两种样式 其他样式需要自定义(自定义样式暂未开放) 46 | */ 47 | @property(nonatomic,assign) MSPageControlAnimation pageControlAnimation; 48 | 49 | /** 50 | pageControlAnimation为MSPageControlStyleNumber时字体设置 51 | */ 52 | @property(nonatomic,strong) UIFont *textFont; 53 | 54 | /** 55 | pageControlAnimation为MSPageControlStyleNumber时文本颜色设置 56 | */ 57 | @property(nonatomic,strong) UIColor *textColor; 58 | 59 | /** 60 | 点击dotView的回调方法 61 | */ 62 | @property(nonatomic,copy) didSelectPageAtIndex didSelectPageAtIndexBlock; 63 | 64 | /** 65 | 协议属性 66 | */ 67 | @property(nonatomic,assign) id delegate; 68 | /** 69 | 分页数量 Default is 0. 70 | */ 71 | @property(nonatomic, assign) NSInteger numberOfPages; 72 | 73 | /** 74 | 当前活跃的小圆点的下标, Default is 0. 75 | */ 76 | @property(nonatomic, assign) NSInteger currentPage; 77 | 78 | /** 79 | 点的大小 设置了pagecControl图片属性 pageDotSize将失效 80 | */ 81 | @property(nonatomic, assign) CGSize pageDotSize; 82 | 83 | /** 84 | 点之间的间距 Default is 8. 85 | */ 86 | @property(nonatomic, assign) CGFloat spacingBetweenDots; 87 | 88 | /** 89 | 未选中点的颜色 90 | */ 91 | @property(nonatomic, strong) UIColor *dotColor; 92 | 93 | /** 94 | 当前点的颜色 95 | */ 96 | @property(nonatomic, strong) UIColor *currentDotColor; 97 | 98 | /** 99 | 其他页面小圆点的图片 100 | */ 101 | @property(nonatomic, strong) UIImage *dotImage; 102 | 103 | /** 104 | 当前点的图片 105 | */ 106 | @property(nonatomic, strong) UIImage *currentDotImage; 107 | 108 | /** 109 | 是否是方形点 默认NO 显示圆形 110 | */ 111 | @property(nonatomic, assign) BOOL dotsIsSquare; 112 | 113 | /** 114 | 当前选中点宽度与未选中点的宽度的倍数 默认是1 115 | * 计算方法 pageDotSize.width = pageDotSize.width * currentWidthMultiple; 116 | * 设置了pagecControl图片属性 currentWidthMultiple将失效 117 | */ 118 | @property(nonatomic, assign) CGFloat currentWidthMultiple; 119 | 120 | /** 121 | 未选中点的layerColor 122 | */ 123 | @property(nonatomic, strong) UIColor *dotBorderColor; 124 | 125 | /** 126 | 选中点的layerColor 127 | */ 128 | @property(nonatomic, strong) UIColor *currentDotBorderColor; 129 | 130 | /** 131 | 未选中点的layer宽度 132 | */ 133 | @property(nonatomic, assign) CGFloat dotBorderWidth; 134 | 135 | /** 136 | 选中点的layer宽度 137 | */ 138 | @property(nonatomic, assign) CGFloat currentDotBorderWidth; 139 | 140 | /** 141 | 如果只有一个页面,则隐藏该控件。Default is NO. 142 | */ 143 | @property (nonatomic) BOOL hidesForSinglePage; 144 | 145 | /** 146 | 让控制知道是否应该通过保持中心变大,或者只是变长(右侧扩张)。Default is YES.。 147 | */ 148 | @property (nonatomic) BOOL shouldResizeFromCenter; 149 | 150 | 151 | 152 | - (CGSize)sizeForNumberOfPages:(NSInteger)pageCount; 153 | /** 154 | 提供系统样式的pageControl 155 | 156 | @param frame 位置 157 | @param numberOfPages page数量 158 | @param dotColor 其他页面的dot颜色 159 | @param currentDotColor 当前页面的dot颜色 160 | @return pageControl 161 | */ 162 | + (instancetype)pageControlSystemWithFrame:(CGRect)frame numberOfPages:(NSInteger)numberOfPages otherDotColor:(UIColor *)dotColor currentDotColor:(UIColor *)currentDotColor; 163 | @end 164 | 165 | NS_ASSUME_NONNULL_END 166 | -------------------------------------------------------------------------------- /Demo/Pods/MSPageControl/MSPageControl/MSPageControl.m: -------------------------------------------------------------------------------- 1 | // 2 | // MSPageControl.m 3 | // MSPageControl 4 | // 5 | // Created by lztb on 2019/6/27. 6 | // Copyright © 2019 lztbwlkj. All rights reserved. 7 | // 8 | 9 | #import "MSPageControl.h" 10 | /** 11 | * Default number of pages for initialization 12 | */ 13 | static NSInteger const kDefaultNumberOfPages = 0; 14 | 15 | /** 16 | * Default current page for initialization 17 | */ 18 | static NSInteger const kDefaultCurrentPage = 0; 19 | 20 | /** 21 | * Default setting for hide for single page feature. For initialization 22 | */ 23 | static BOOL const kDefaultHideForSinglePage = NO; 24 | 25 | /** 26 | * Default setting for shouldResizeFromCenter. For initialiation 27 | */ 28 | static BOOL const kDefaultShouldResizeFromCenter = YES; 29 | 30 | /** 31 | * Default spacing between dots 32 | */ 33 | static NSInteger const kDefaultSpacingBetweenDots = 8; 34 | 35 | /** 36 | * Default dot size 37 | */ 38 | static CGSize const kDefaultDotSize = {8, 8}; 39 | 40 | 41 | static BOOL const kDefaultDotsIsSquare = NO; 42 | 43 | 44 | static NSInteger const kDefaultCurrentWidthMultiple = 1; 45 | 46 | @interface MSPageControl () 47 | /** 48 | * Array of dot views for reusability and touch events. 49 | */ 50 | @property (strong, nonatomic) NSMutableArray *dots; 51 | 52 | @end 53 | 54 | @implementation MSPageControl 55 | - (instancetype)init 56 | { 57 | self = [super init]; 58 | if (self) { 59 | [self initialize]; 60 | } 61 | return self; 62 | } 63 | 64 | - (instancetype)initWithFrame:(CGRect)frame{ 65 | self = [super initWithFrame:frame]; 66 | if (self) { 67 | [self initialize]; 68 | } 69 | return self; 70 | } 71 | 72 | + (instancetype)pageControlSystemWithFrame:(CGRect)frame numberOfPages:(NSInteger)numberOfPages otherDotColor:(UIColor *)dotColor currentDotColor:(UIColor *)currentDotColor{ 73 | MSPageControl *pageControl = [[MSPageControl alloc] initWithFrame:frame]; 74 | pageControl.numberOfPages = numberOfPages; 75 | pageControl.dotColor = dotColor; 76 | pageControl.currentDotColor = currentDotColor; 77 | return pageControl; 78 | } 79 | 80 | - (void)initialize { 81 | self.backgroundColor = [UIColor clearColor]; 82 | self.spacingBetweenDots = kDefaultSpacingBetweenDots;//默认点的间距为8 83 | self.numberOfPages = kDefaultNumberOfPages;//默认点的间距为8 84 | self.currentPage = kDefaultCurrentPage;//默认当前页数为第一页 85 | self.hidesForSinglePage = kDefaultHideForSinglePage;//如果只有一个页面 默认是不隐藏 86 | self.dotColor = [UIColor colorWithWhite:1 alpha:0.5];//默认未选中点的颜色为白色,透明度50% 87 | self.currentDotColor = [UIColor whiteColor];//默认选中点的颜色为白色 88 | self.pageDotSize = kDefaultDotSize;//默认点的宽高分别为8 89 | self.currentWidthMultiple = kDefaultCurrentWidthMultiple;//当前选中点宽度与未选中点的宽度的倍数,默认为1倍 90 | self.dotsIsSquare = kDefaultDotsIsSquare;//默认是圆点 91 | self.shouldResizeFromCenter = kDefaultShouldResizeFromCenter; 92 | 93 | self.currentDotBorderWidth = 0; 94 | self.currentDotBorderColor = [UIColor clearColor]; 95 | 96 | self.dotBorderColor = [UIColor whiteColor]; 97 | self.dotBorderWidth = 0; 98 | 99 | self.pageControlStyle = MSPageControlStyleSystem; 100 | self.pageControlAnimation = MSPageControlAnimationSystem; 101 | 102 | self.textFont = [UIFont systemFontOfSize:9]; 103 | self.textColor = [UIColor blackColor]; 104 | } 105 | 106 | 107 | #pragma mark - Layout 108 | /** 109 | * Resizes and moves the receiver view so it just encloses its subviews. 110 | */ 111 | - (void)sizeToFit{ 112 | [self updateFrame:YES]; 113 | } 114 | 115 | - (void)updateFrame:(BOOL)overrideExistingFrame{ 116 | CGPoint center = self.center; 117 | CGSize requiredSize = [self sizeForNumberOfPages:self.numberOfPages]; 118 | 119 | // We apply requiredSize only if authorize to and necessary 120 | if (overrideExistingFrame || ((CGRectGetWidth(self.frame) < requiredSize.width || CGRectGetHeight(self.frame) < requiredSize.height) && !overrideExistingFrame)) { 121 | self.frame = CGRectMake(CGRectGetMinX(self.frame), CGRectGetMinY(self.frame), requiredSize.width, requiredSize.height); 122 | if (self.shouldResizeFromCenter) { 123 | self.center = center; 124 | } 125 | } 126 | 127 | [self resetDotViews]; 128 | } 129 | 130 | 131 | #pragma mark - Setters 132 | - (void)setNumberOfPages:(NSInteger)numberOfPages{ 133 | _numberOfPages = numberOfPages; 134 | // Update dot position to fit new number of pages 135 | [self resetDotViews]; 136 | } 137 | 138 | 139 | - (void)setDotImage:(UIImage *)dotImage{ 140 | _dotImage = dotImage; 141 | [self resetDotViews]; 142 | } 143 | 144 | - (void)setCurrentDotImage:(UIImage *)currentDotimage{ 145 | _currentDotImage = currentDotimage; 146 | [self resetDotViews]; 147 | } 148 | 149 | -(void)setPageDotSize:(CGSize)pageDotSize{ 150 | _pageDotSize = pageDotSize; 151 | // if (self.dotImage && self.currentDotImage) { 152 | // _pageDotSize = self.dotImage.size; 153 | // } 154 | [self resetDotViews]; 155 | } 156 | 157 | 158 | -(void)setHidesForSinglePage:(BOOL)hidesForSinglePage{ 159 | _hidesForSinglePage = hidesForSinglePage; 160 | if (self.dots.count == 1 && hidesForSinglePage) { 161 | self.hidden = YES; 162 | } else { 163 | self.hidden = NO; 164 | } 165 | } 166 | 167 | - (void)setSpacingBetweenDots:(CGFloat)spacingBetweenDots{ 168 | if (_spacingBetweenDots == spacingBetweenDots) return; 169 | _spacingBetweenDots = spacingBetweenDots; 170 | [self resetDotViews]; 171 | } 172 | 173 | 174 | -(void)setDotColor:(UIColor *)dotColor{ 175 | if (_dotColor == dotColor) return; 176 | 177 | _dotColor = dotColor; 178 | [self resetDotViews]; 179 | } 180 | 181 | -(void)setCurrentDotColor:(UIColor *)currentDotColor{ 182 | if (self.currentDotColor == currentDotColor) return; 183 | 184 | _currentDotColor = currentDotColor; 185 | [self resetDotViews]; 186 | } 187 | 188 | - (void)setCurrentPage:(NSInteger)currentPage{ 189 | if (_currentPage == currentPage || self.numberOfPages == 0 ) return; 190 | [self changeWithOldIndex:_currentPage atNewIndex:currentPage]; 191 | 192 | _currentPage = currentPage; 193 | } 194 | 195 | - (void)setDotBorderWidth:(CGFloat)dotBorderWidth{ 196 | if (_dotBorderWidth == dotBorderWidth) return; 197 | 198 | _dotBorderWidth = dotBorderWidth; 199 | [self resetDotViews]; 200 | } 201 | 202 | -(void)setCurrentDotBorderWidth:(CGFloat)currentDotBorderWidth{ 203 | if (_currentDotBorderWidth == currentDotBorderWidth) return; 204 | _currentDotBorderWidth = currentDotBorderWidth; 205 | 206 | [self resetDotViews]; 207 | } 208 | 209 | -(void)setDotBorderColor:(UIColor *)dotBorderColor{ 210 | if (_dotBorderColor == dotBorderColor) return; 211 | _dotBorderColor = dotBorderColor; 212 | [self resetDotViews]; 213 | } 214 | 215 | -(void)setCurrentDotBorderColor:(UIColor *)currentDotBorderColor{ 216 | if (_currentDotBorderColor == currentDotBorderColor) return; 217 | 218 | _currentDotBorderColor = currentDotBorderColor; 219 | [self resetDotViews]; 220 | } 221 | 222 | -(void)setCurrentWidthMultiple:(CGFloat)currentWidthMultiple{ 223 | if (_currentWidthMultiple == currentWidthMultiple) return; 224 | 225 | _currentWidthMultiple = currentWidthMultiple; 226 | [self resetDotViews]; 227 | } 228 | 229 | -(void)setDotsIsSquare:(BOOL)dotsIsSquare{ 230 | if (_dotsIsSquare == dotsIsSquare) return; 231 | _dotsIsSquare = dotsIsSquare; 232 | [self resetDotViews]; 233 | } 234 | 235 | -(void)setPageControlStyle:(MSPageControlStyle)pageControlStyle{ 236 | if (_pageControlStyle == pageControlStyle) return; 237 | _pageControlStyle = pageControlStyle; 238 | [self resetDotViews]; 239 | } 240 | 241 | -(void)setPageControlAnimation:(MSPageControlAnimation)pageControlAnimation{ 242 | if (_pageControlAnimation == pageControlAnimation) return; 243 | _pageControlAnimation = pageControlAnimation; 244 | [self resetDotViews]; 245 | } 246 | 247 | 248 | -(void)setTextFont:(UIFont *)textFont{ 249 | if (_textFont == textFont) return; 250 | _textFont = textFont; 251 | [self resetDotViews]; 252 | } 253 | 254 | -(void)setTextColor:(UIColor *)textColor{ 255 | if (_textColor == textColor) return; 256 | _textColor = textColor; 257 | [self resetDotViews]; 258 | } 259 | 260 | #pragma mark ================== dotView 添加 ================== 261 | -(void)resetDotViews{ 262 | for (UIView *dotView in self.dots) { 263 | [dotView removeFromSuperview]; 264 | } 265 | if (self.dotImage || self.currentDotImage) { 266 | _currentWidthMultiple = 1; 267 | _pageDotSize = self.currentDotImage.size; 268 | } 269 | 270 | [self.dots removeAllObjects]; 271 | [self updateDots]; 272 | } 273 | 274 | -(void)updateDots{ 275 | if (self.numberOfPages == 0) { 276 | return; 277 | } 278 | 279 | CGFloat startX = 0.0, startY = 0.0; 280 | CGFloat mainWidth = self.numberOfPages * (self.pageDotSize.width + self.spacingBetweenDots); 281 | 282 | if (self.frame.size.width > mainWidth) { 283 | startX = (self.frame.size.width - mainWidth) / 2; 284 | } 285 | 286 | startY = (CGRectGetHeight(self.frame) - self.pageDotSize.height) / 2; 287 | //创建dotView 288 | for (NSInteger i = 0; i < self.numberOfPages; i++) { 289 | UIView *dotView; 290 | if (i < self.dots.count) { 291 | dotView = [self.dots objectAtIndex:i]; 292 | } else { 293 | 294 | if (i == _currentPage) { 295 | CGFloat currentPointViewWidth = self.pageDotSize.width * self.currentWidthMultiple; 296 | dotView = [[UIImageView alloc] initWithImage:self.currentDotImage]; 297 | if (self.currentDotImage) { 298 | dotView.backgroundColor = [UIColor clearColor]; 299 | }else{ 300 | dotView.backgroundColor = self.currentDotColor; 301 | } 302 | dotView.frame = CGRectMake(startX, startY, currentPointViewWidth, self.pageDotSize.height); 303 | dotView.layer.borderColor = self.currentDotBorderColor.CGColor; 304 | dotView.layer.borderWidth = self.currentDotBorderWidth; 305 | dotView.layer.cornerRadius = self.dotsIsSquare ? 0 : self.pageDotSize.height / 2; 306 | }else{ 307 | dotView = [[UIImageView alloc] initWithImage:self.dotImage]; 308 | if (self.dotImage) { 309 | dotView.backgroundColor = [UIColor clearColor]; 310 | }else{ 311 | dotView.backgroundColor = self.dotColor; 312 | } 313 | dotView.frame = CGRectMake(startX, startY, self.pageDotSize.width, self.pageDotSize.height); 314 | dotView.layer.borderColor = self.dotBorderColor.CGColor; 315 | dotView.layer.borderWidth = self.dotBorderWidth; 316 | dotView.layer.cornerRadius = self.dotsIsSquare ? 0 : self.pageDotSize.height / 2; 317 | } 318 | 319 | startX = CGRectGetMaxX(dotView.frame) + self.spacingBetweenDots; 320 | 321 | //数字样式 322 | if (self.pageControlStyle == MSPageControlStyleNumber) { 323 | UILabel *indexLbl = [[UILabel alloc] initWithFrame:dotView.bounds]; 324 | indexLbl.text = [NSString stringWithFormat:@"%ld",(long)i+1]; 325 | indexLbl.textAlignment = NSTextAlignmentCenter; 326 | indexLbl.font = self.textFont; 327 | indexLbl.textColor = self.textColor; 328 | [dotView addSubview:indexLbl]; 329 | } 330 | 331 | if (dotView) { 332 | [self addSubview:dotView]; 333 | [self.dots addObject:dotView]; 334 | } 335 | 336 | dotView.userInteractionEnabled = YES; 337 | dotView.clipsToBounds = YES; 338 | dotView.layer.masksToBounds = YES; 339 | } 340 | } 341 | 342 | [self hidesForSinglePage]; 343 | } 344 | 345 | - (CGSize)sizeForNumberOfPages:(NSInteger)pageCount { 346 | if (self.currentWidthMultiple != kDefaultCurrentWidthMultiple) { 347 | CGFloat currentPointViewWidth = self.pageDotSize.width * self.currentWidthMultiple; 348 | CGFloat width = self.pageDotSize.width; 349 | return CGSizeMake(((currentPointViewWidth + self.spacingBetweenDots) + (width + self.spacingBetweenDots) * (pageCount-1)) - self.spacingBetweenDots , self.pageDotSize.height); 350 | } 351 | return CGSizeMake((self.pageDotSize.width + self.spacingBetweenDots) * pageCount - self.spacingBetweenDots , self.pageDotSize.height); 352 | } 353 | 354 | #pragma mark - Touch event 355 | - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 356 | { 357 | UITouch *touch = [touches anyObject]; 358 | if (touch.view != self) { 359 | NSInteger index = [self.dots indexOfObject:touch.view]; 360 | if (self.didSelectPageAtIndexBlock) { 361 | self.didSelectPageAtIndexBlock(self, index); 362 | } 363 | 364 | if (self.delegate && [self.delegate respondsToSelector:@selector(pageControl:didSelectPageAtIndex:)]) { 365 | [self.delegate pageControl:self didSelectPageAtIndex:index]; 366 | } 367 | } 368 | } 369 | 370 | 371 | - (void)changeWithOldIndex:(NSInteger)oldIndex atNewIndex:(NSInteger)newIndex{ 372 | 373 | UIImageView *oldDotView = (UIImageView *)[self.dots objectAtIndex:oldIndex]; 374 | UIImageView *newDotView = (UIImageView *)[self.dots objectAtIndex:newIndex]; 375 | 376 | //切换选中图片和未选中图片 377 | if (self.currentDotImage != nil) { 378 | newDotView.image = self.currentDotImage; 379 | } 380 | 381 | if (self.dotImage != nil) { 382 | oldDotView.image = self.dotImage; 383 | } 384 | 385 | //动画过渡 386 | if (newDotView.image == nil && newDotView.image == nil) { 387 | //设置背景颜色 388 | oldDotView.backgroundColor = self.dotColor; 389 | newDotView.backgroundColor = self.currentDotColor; 390 | } 391 | 392 | oldDotView.layer.borderColor = self.dotBorderColor != nil ? [self.dotBorderColor CGColor] : self.dotColor.CGColor; 393 | oldDotView.layer.borderWidth = self.dotBorderWidth ? self.dotBorderWidth : 0; 394 | 395 | newDotView.layer.borderColor = self.currentDotBorderColor ? [self.currentDotBorderColor CGColor] : [self.currentDotColor CGColor]; 396 | newDotView.layer.borderWidth = self.currentDotBorderWidth ? self.currentDotBorderWidth : 0; 397 | 398 | if (self.currentWidthMultiple != 1) {//如果当前选中点的宽度与未选中的点宽度不一样,则要改变选中前后两点的frame 399 | CGRect oldDotFrame = oldDotView.frame; 400 | if (newIndex < oldIndex) { 401 | oldDotFrame.origin.x += self.pageDotSize.width * (self.currentWidthMultiple - 1); 402 | } 403 | oldDotFrame.size.width = self.pageDotSize.width; 404 | 405 | CGRect newDotFrame = newDotView.frame; 406 | 407 | if (newIndex > oldIndex) { 408 | newDotFrame.origin.x -= self.pageDotSize.width * (self.currentWidthMultiple - 1); 409 | } 410 | newDotFrame.size.width = self.pageDotSize.width * self.currentWidthMultiple; 411 | 412 | if (self.pageControlAnimation == MSPageControlAnimationSystem) { 413 | 414 | [UIView animateWithDuration:0.3 animations:^{ 415 | oldDotView.frame = oldDotFrame; 416 | newDotView.frame = newDotFrame; 417 | }]; 418 | 419 | }else{ 420 | oldDotView.frame = oldDotFrame; 421 | newDotView.frame = newDotFrame; 422 | } 423 | } 424 | 425 | if (newIndex - oldIndex > 1) {//点击圆点,中间有跳过的点 426 | for (NSInteger i = oldIndex + 1; i 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 | 0.0.3 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Demo/Pods/Target Support Files/MSPageControl/MSPageControl-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_MSPageControl : NSObject 3 | @end 4 | @implementation PodsDummy_MSPageControl 5 | @end 6 | -------------------------------------------------------------------------------- /Demo/Pods/Target Support Files/MSPageControl/MSPageControl-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 | -------------------------------------------------------------------------------- /Demo/Pods/Target Support Files/MSPageControl/MSPageControl-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 "MSPageControl.h" 14 | 15 | FOUNDATION_EXPORT double MSPageControlVersionNumber; 16 | FOUNDATION_EXPORT const unsigned char MSPageControlVersionString[]; 17 | 18 | -------------------------------------------------------------------------------- /Demo/Pods/Target Support Files/MSPageControl/MSPageControl.modulemap: -------------------------------------------------------------------------------- 1 | framework module MSPageControl { 2 | umbrella header "MSPageControl-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Demo/Pods/Target Support Files/MSPageControl/MSPageControl.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/MSPageControl 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}/MSPageControl 7 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 8 | SKIP_INSTALL = YES 9 | -------------------------------------------------------------------------------- /Demo/Pods/Target Support Files/Pods-MSLaunchView/Pods-MSLaunchView-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 | -------------------------------------------------------------------------------- /Demo/Pods/Target Support Files/Pods-MSLaunchView/Pods-MSLaunchView-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## MSPageControl 5 | 6 | MIT License 7 | 8 | Copyright (c) 2019 lztb 9 | 10 | Permission is hereby granted, free of charge, to any person obtaining a copy 11 | of this software and associated documentation files (the "Software"), to deal 12 | in the Software without restriction, including without limitation the rights 13 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 14 | copies of the Software, and to permit persons to whom the Software is 15 | furnished to do so, subject to the following conditions: 16 | 17 | The above copyright notice and this permission notice shall be included in all 18 | copies or substantial portions of the Software. 19 | 20 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 23 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 26 | SOFTWARE. 27 | 28 | Generated by CocoaPods - https://cocoapods.org 29 | -------------------------------------------------------------------------------- /Demo/Pods/Target Support Files/Pods-MSLaunchView/Pods-MSLaunchView-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 | MIT License 18 | 19 | Copyright (c) 2019 lztb 20 | 21 | Permission is hereby granted, free of charge, to any person obtaining a copy 22 | of this software and associated documentation files (the "Software"), to deal 23 | in the Software without restriction, including without limitation the rights 24 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 25 | copies of the Software, and to permit persons to whom the Software is 26 | furnished to do so, subject to the following conditions: 27 | 28 | The above copyright notice and this permission notice shall be included in all 29 | copies or substantial portions of the Software. 30 | 31 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 32 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 33 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 34 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 35 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 36 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 37 | SOFTWARE. 38 | 39 | License 40 | MIT 41 | Title 42 | MSPageControl 43 | Type 44 | PSGroupSpecifier 45 | 46 | 47 | FooterText 48 | Generated by CocoaPods - https://cocoapods.org 49 | Title 50 | 51 | Type 52 | PSGroupSpecifier 53 | 54 | 55 | StringsTable 56 | Acknowledgements 57 | Title 58 | Acknowledgements 59 | 60 | 61 | -------------------------------------------------------------------------------- /Demo/Pods/Target Support Files/Pods-MSLaunchView/Pods-MSLaunchView-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_MSLaunchView : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_MSLaunchView 5 | @end 6 | -------------------------------------------------------------------------------- /Demo/Pods/Target Support Files/Pods-MSLaunchView/Pods-MSLaunchView-frameworks-Debug-input-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${PODS_ROOT}/Target Support Files/Pods-MSLaunchView/Pods-MSLaunchView-frameworks.sh 2 | ${BUILT_PRODUCTS_DIR}/MSPageControl/MSPageControl.framework -------------------------------------------------------------------------------- /Demo/Pods/Target Support Files/Pods-MSLaunchView/Pods-MSLaunchView-frameworks-Debug-output-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MSPageControl.framework -------------------------------------------------------------------------------- /Demo/Pods/Target Support Files/Pods-MSLaunchView/Pods-MSLaunchView-frameworks-Release-input-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${PODS_ROOT}/Target Support Files/Pods-MSLaunchView/Pods-MSLaunchView-frameworks.sh 2 | ${BUILT_PRODUCTS_DIR}/MSPageControl/MSPageControl.framework -------------------------------------------------------------------------------- /Demo/Pods/Target Support Files/Pods-MSLaunchView/Pods-MSLaunchView-frameworks-Release-output-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MSPageControl.framework -------------------------------------------------------------------------------- /Demo/Pods/Target Support Files/Pods-MSLaunchView/Pods-MSLaunchView-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 | # Copies the bcsymbolmap files of a vendored framework 113 | install_bcsymbolmap() { 114 | local bcsymbolmap_path="$1" 115 | local destination="${BUILT_PRODUCTS_DIR}" 116 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"" 117 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" 118 | } 119 | 120 | # Signs a framework with the provided identity 121 | code_sign_if_enabled() { 122 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 123 | # Use the current code_sign_identity 124 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 125 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" 126 | 127 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 128 | code_sign_cmd="$code_sign_cmd &" 129 | fi 130 | echo "$code_sign_cmd" 131 | eval "$code_sign_cmd" 132 | fi 133 | } 134 | 135 | # Strip invalid architectures 136 | strip_invalid_archs() { 137 | binary="$1" 138 | # Get architectures for current target binary 139 | binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" 140 | # Intersect them with the architectures we are building for 141 | intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" 142 | # If there are no archs supported by this binary then warn the user 143 | if [[ -z "$intersected_archs" ]]; then 144 | echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." 145 | STRIP_BINARY_RETVAL=0 146 | return 147 | fi 148 | stripped="" 149 | for arch in $binary_archs; do 150 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then 151 | # Strip non-valid architectures in-place 152 | lipo -remove "$arch" -output "$binary" "$binary" 153 | stripped="$stripped $arch" 154 | fi 155 | done 156 | if [[ "$stripped" ]]; then 157 | echo "Stripped $binary of architectures:$stripped" 158 | fi 159 | STRIP_BINARY_RETVAL=1 160 | } 161 | 162 | 163 | if [[ "$CONFIGURATION" == "Debug" ]]; then 164 | install_framework "${BUILT_PRODUCTS_DIR}/MSPageControl/MSPageControl.framework" 165 | fi 166 | if [[ "$CONFIGURATION" == "Release" ]]; then 167 | install_framework "${BUILT_PRODUCTS_DIR}/MSPageControl/MSPageControl.framework" 168 | fi 169 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 170 | wait 171 | fi 172 | -------------------------------------------------------------------------------- /Demo/Pods/Target Support Files/Pods-MSLaunchView/Pods-MSLaunchView-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_MSLaunchViewVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_MSLaunchViewVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Demo/Pods/Target Support Files/Pods-MSLaunchView/Pods-MSLaunchView.debug.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MSPageControl" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MSPageControl/MSPageControl.framework/Headers" 4 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 5 | OTHER_LDFLAGS = $(inherited) -framework "MSPageControl" 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 | -------------------------------------------------------------------------------- /Demo/Pods/Target Support Files/Pods-MSLaunchView/Pods-MSLaunchView.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_MSLaunchView { 2 | umbrella header "Pods-MSLaunchView-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Demo/Pods/Target Support Files/Pods-MSLaunchView/Pods-MSLaunchView.release.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MSPageControl" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MSPageControl/MSPageControl.framework/Headers" 4 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 5 | OTHER_LDFLAGS = $(inherited) -framework "MSPageControl" 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 | -------------------------------------------------------------------------------- /Demo/Pods/Target Support Files/Pods-MSLaunchViewTests/Pods-MSLaunchViewTests-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 | -------------------------------------------------------------------------------- /Demo/Pods/Target Support Files/Pods-MSLaunchViewTests/Pods-MSLaunchViewTests-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | Generated by CocoaPods - https://cocoapods.org 4 | -------------------------------------------------------------------------------- /Demo/Pods/Target Support Files/Pods-MSLaunchViewTests/Pods-MSLaunchViewTests-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 | -------------------------------------------------------------------------------- /Demo/Pods/Target Support Files/Pods-MSLaunchViewTests/Pods-MSLaunchViewTests-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_MSLaunchViewTests : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_MSLaunchViewTests 5 | @end 6 | -------------------------------------------------------------------------------- /Demo/Pods/Target Support Files/Pods-MSLaunchViewTests/Pods-MSLaunchViewTests-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_MSLaunchViewTestsVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_MSLaunchViewTestsVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Demo/Pods/Target Support Files/Pods-MSLaunchViewTests/Pods-MSLaunchViewTests.debug.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MSPageControl" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MSPageControl/MSPageControl.framework/Headers" 4 | OTHER_LDFLAGS = $(inherited) -framework "MSPageControl" 5 | PODS_BUILD_DIR = ${BUILD_DIR} 6 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 8 | PODS_ROOT = ${SRCROOT}/Pods 9 | -------------------------------------------------------------------------------- /Demo/Pods/Target Support Files/Pods-MSLaunchViewTests/Pods-MSLaunchViewTests.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_MSLaunchViewTests { 2 | umbrella header "Pods-MSLaunchViewTests-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Demo/Pods/Target Support Files/Pods-MSLaunchViewTests/Pods-MSLaunchViewTests.release.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MSPageControl" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MSPageControl/MSPageControl.framework/Headers" 4 | OTHER_LDFLAGS = $(inherited) -framework "MSPageControl" 5 | PODS_BUILD_DIR = ${BUILD_DIR} 6 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 8 | PODS_ROOT = ${SRCROOT}/Pods 9 | -------------------------------------------------------------------------------- /Demo/Pods/Target Support Files/Pods-MSLaunchViewUITests/Pods-MSLaunchViewUITests-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 | -------------------------------------------------------------------------------- /Demo/Pods/Target Support Files/Pods-MSLaunchViewUITests/Pods-MSLaunchViewUITests-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | Generated by CocoaPods - https://cocoapods.org 4 | -------------------------------------------------------------------------------- /Demo/Pods/Target Support Files/Pods-MSLaunchViewUITests/Pods-MSLaunchViewUITests-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 | -------------------------------------------------------------------------------- /Demo/Pods/Target Support Files/Pods-MSLaunchViewUITests/Pods-MSLaunchViewUITests-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_MSLaunchViewUITests : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_MSLaunchViewUITests 5 | @end 6 | -------------------------------------------------------------------------------- /Demo/Pods/Target Support Files/Pods-MSLaunchViewUITests/Pods-MSLaunchViewUITests-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_MSLaunchViewUITestsVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_MSLaunchViewUITestsVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Demo/Pods/Target Support Files/Pods-MSLaunchViewUITests/Pods-MSLaunchViewUITests.debug.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MSPageControl" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MSPageControl/MSPageControl.framework/Headers" 4 | OTHER_LDFLAGS = $(inherited) -framework "MSPageControl" 5 | PODS_BUILD_DIR = ${BUILD_DIR} 6 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 8 | PODS_ROOT = ${SRCROOT}/Pods 9 | -------------------------------------------------------------------------------- /Demo/Pods/Target Support Files/Pods-MSLaunchViewUITests/Pods-MSLaunchViewUITests.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_MSLaunchViewUITests { 2 | umbrella header "Pods-MSLaunchViewUITests-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Demo/Pods/Target Support Files/Pods-MSLaunchViewUITests/Pods-MSLaunchViewUITests.release.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MSPageControl" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MSPageControl/MSPageControl.framework/Headers" 4 | OTHER_LDFLAGS = $(inherited) -framework "MSPageControl" 5 | PODS_BUILD_DIR = ${BUILD_DIR} 6 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 8 | PODS_ROOT = ${SRCROOT}/Pods 9 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 lztb 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /MSLaunchView.podspec: -------------------------------------------------------------------------------- 1 | # 2 | # Be sure to run `pod spec lint MSLaunchView.podspec' to ensure this is a 3 | # valid spec and to remove all comments including this before submitting the spec. 4 | # 5 | # To learn more about Podspec attributes see https://docs.cocoapods.org/specification.html 6 | # To see working Podspecs in the CocoaPods repo see https://github.com/CocoaPods/Specs/ 7 | # 8 | 9 | Pod::Spec.new do |spec| 10 | 11 | spec.name = "MSLaunchView" 12 | spec.version = "1.0.0" 13 | spec.summary = "一行代码可集成性能强大的APP启动引导页,不仅支持普通格式的图片,还支持GIF,短视频,不会让你失望的!" 14 | spec.description = <<-DESC 15 | 一行代码合成APP引导页,包含不同状态下的引导页操作方式,同时支持动态图片引导页和静态图片引导页,支持单个视频播放,同事支持跳过按钮,立即体验按钮完全自定义,欢迎大家来使用! 16 | DESC 17 | 18 | 19 | spec.homepage = "https://github.com/lztbwlkj/MSLaunchView" 20 | # spec.screenshots = "www.example.com/screenshots_1.gif", "www.example.com/screenshots_2.gif" 21 | 22 | 23 | # ――― Spec License ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 24 | # 25 | # Licensing your code is important. See https://choosealicense.com for more info. 26 | # CocoaPods will detect a license file if there is a named LICENSE* 27 | # Popular ones are 'MIT', 'BSD' and 'Apache License, Version 2.0'. 28 | # 29 | 30 | spec.license = "MIT" 31 | # spec.license = { :type => "MIT", :file => "LICENSE" } 32 | 33 | spec.author = { "lztbwlkj" => "lztbwlkj@gmail.com" } 34 | # Or just: spec.author = "lztbwlkj" 35 | # spec.authors = { "lztbwlkj" => "lztbwlkj@gmail.com" } 36 | # spec.social_media_url = "https://twitter.com/lztbwlkj" 37 | 38 | # spec.platform = :ios 39 | spec.platform = :ios, "9.0" 40 | 41 | # When using multiple platforms 42 | # spec.ios.deployment_target = "8.0" 43 | # spec.osx.deployment_target = "10.7" 44 | # spec.watchos.deployment_target = "2.0" 45 | # spec.tvos.deployment_target = "9.0" 46 | 47 | 48 | # ――― Source Location ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 49 | # 50 | # Specify the location from where the source should be retrieved. 51 | # Supports git, hg, bzr, svn and HTTP. 52 | # 53 | 54 | spec.source = { :git => "https://github.com/lztbwlkj/MSLaunchView.git", :tag => "#{spec.version}" } 55 | 56 | 57 | # ――― Source Code ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 58 | # 59 | # CocoaPods is smart about how it includes source code. For source files 60 | # giving a folder will include any swift, h, m, mm, c & cpp files. 61 | # For header files it will include any header in the folder. 62 | # Not including the public_header_files will make all headers public. 63 | # 64 | 65 | spec.source_files = "MSLaunchView/**/*" 66 | #spec.exclude_files = "Classes/Exclude" 67 | 68 | # spec.public_header_files = "Classes/**/*.h" 69 | 70 | 71 | # ――― Resources ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 72 | # 73 | # A list of resources included with the Pod. These are copied into the 74 | # target bundle with a build phase script. Anything else will be cleaned. 75 | # You can preserve files from being cleaned, please don't preserve 76 | # non-essential files like tests, examples and documentation. 77 | # 78 | 79 | # spec.resource = "icon.png" 80 | # spec.resources = "Resources/*.png" 81 | 82 | # spec.preserve_paths = "FilesToSave", "MoreFilesToSave" 83 | 84 | 85 | # ――― Project Linking ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 86 | # 87 | # Link your library with frameworks, or libraries. Libraries do not include 88 | # the lib prefix of their name. 89 | # 90 | 91 | # spec.framework = "" 92 | spec.frameworks = "UIKit","AVFoundation","AVKit" 93 | 94 | # spec.library = "iconv" 95 | # spec.libraries = "iconv", "xml2" 96 | 97 | 98 | # ――― Project Settings ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 99 | # 100 | # If your library depends on compiler flags you can set them in the xcconfig hash 101 | # where they will only apply to your library. If you depend on other Podspecs 102 | # you can include multiple dependencies to ensure it works. 103 | 104 | spec.requires_arc = true 105 | 106 | # spec.xcconfig = { "HEADER_SEARCH_PATHS" => "$(SDKROOT)/usr/include/libxml2" } 107 | spec.dependency "MSPageControl" 108 | 109 | end 110 | -------------------------------------------------------------------------------- /MSLaunchView/MSLaunchOperation.h: -------------------------------------------------------------------------------- 1 | // 2 | // MSLaunchOperation.h 3 | // MSLaunchView 4 | // 5 | // Created by TuBo on 2018/11/8. 6 | // Copyright © 2018 TuBur. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface MSLaunchOperation : UIView 14 | /** 15 | * 通过图片Data数据第一个字节来获取图片扩展名(严谨) 16 | */ 17 | + (NSString *)ms_contentTypeForImageData:(NSData *)data; 18 | 19 | /** 20 | * 通过图片URL的截取来获取图片的扩展名(不严谨) 21 | */ 22 | + (NSString *)ms_contentTypeForImageURL:(NSString *)url; 23 | 24 | /** 25 | * 自定义播放Gif图片(Path) 26 | * 27 | * @param frame 位置和大小 28 | * @param gifImagePath Gif图片路径 29 | * 30 | * @return Gif图片对象 31 | */ 32 | - (id)initWithFrame:(CGRect)frame gifImagePath:(NSString *)gifImagePath; 33 | 34 | /** 35 | * 自定义播放Gif图片(Data)(本地+网络) 36 | * 37 | * @param frame 位置和大小 38 | * @param gifImageData Gif图片Data 39 | * 40 | * @return Gif图片对象 41 | */ 42 | - (id)initWithFrame:(CGRect)frame gifImageData:(NSData *)gifImageData; 43 | 44 | /** 45 | * 自定义播放Gif图片(Name) 46 | * 47 | * @param frame 位置和大小 48 | * @param gifImageName Gif图片Name 49 | * 50 | * @return Gif图片对象 51 | */ 52 | - (id)initWithFrame:(CGRect)frame gifImageName:(NSString *)gifImageName; 53 | @end 54 | 55 | NS_ASSUME_NONNULL_END 56 | -------------------------------------------------------------------------------- /MSLaunchView/MSLaunchOperation.m: -------------------------------------------------------------------------------- 1 | // 2 | // MSLaunchOperation.m 3 | // MSLaunchView 4 | // 5 | // Created by TuBo on 2018/11/8. 6 | // Copyright © 2018 TuBur. All rights reserved. 7 | // 8 | 9 | #import "MSLaunchOperation.h" 10 | #import 11 | 12 | @interface MSLaunchOperation(){ 13 | CGImageSourceRef gif; 14 | NSDictionary *gifProperties; 15 | size_t index; 16 | size_t count; 17 | NSTimer *timer; 18 | } 19 | 20 | @end 21 | 22 | @implementation MSLaunchOperation 23 | #pragma mark - 通过图片Data数据第一个字节来获取图片扩展名 24 | + (NSString *)ms_contentTypeForImageData:(NSData *)data { 25 | uint8_t c; 26 | [data getBytes:&c length:1]; 27 | switch (c) { 28 | case 0xFF: 29 | return @"jpeg"; 30 | case 0x89: 31 | return @"png"; 32 | case 0x47: 33 | return @"gif"; 34 | case 0x49: 35 | case 0x4D: 36 | return @"tiff"; 37 | case 0x52: 38 | if ([data length] < 12) { 39 | return nil; 40 | } 41 | NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 12)] encoding:NSASCIIStringEncoding]; 42 | if ([testString hasPrefix:@"RIFF"] && [testString hasSuffix:@"WEBP"]) { 43 | return @"webp"; 44 | } 45 | return nil; 46 | } 47 | return nil; 48 | } 49 | 50 | #pragma mark - 通过图片字符串的截取来获取图片的扩展名 51 | + (NSString *)ms_contentTypeForImageURL:(NSString *)url { 52 | NSString *extensionName = url.pathExtension; 53 | if ([extensionName.lowercaseString isEqualToString:@"jpeg"]) { 54 | return @"jpeg"; 55 | } 56 | if ([extensionName.lowercaseString isEqualToString:@"gif"]) { 57 | return @"gif"; 58 | } 59 | if ([extensionName.lowercaseString isEqualToString:@"png"]) { 60 | return @"png"; 61 | } 62 | return nil; 63 | } 64 | 65 | 66 | #pragma mark - 自定义播放Gif图片(Path) 67 | - (id)initWithFrame:(CGRect)frame gifImagePath:(NSString *)gifImagePath { 68 | self = [super initWithFrame:frame]; 69 | if (self) { 70 | gifProperties = [NSDictionary dictionaryWithObject:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:0] forKey:(NSString *)kCGImagePropertyGIFLoopCount] forKey:(NSString *)kCGImagePropertyGIFDictionary]; 71 | gif = CGImageSourceCreateWithURL((CFURLRef)[NSURL fileURLWithPath:gifImagePath], (CFDictionaryRef)gifProperties); 72 | count =CGImageSourceGetCount(gif); 73 | timer = [NSTimer scheduledTimerWithTimeInterval:0.06 target:self selector:@selector(play) userInfo:nil repeats:YES];/**< 0.12->0.06 */ 74 | [timer fire]; 75 | } 76 | return self; 77 | } 78 | 79 | #pragma mark - 自定义播放Gif图片(Data)(本地+网络) 80 | - (id)initWithFrame:(CGRect)frame gifImageData:(NSData *)gifImageData { 81 | self = [super initWithFrame:frame]; 82 | if (self) { 83 | gifProperties = [NSDictionary dictionaryWithObject:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:0] forKey:(NSString *)kCGImagePropertyGIFLoopCount] forKey:(NSString *)kCGImagePropertyGIFDictionary]; 84 | gif = CGImageSourceCreateWithData((CFDataRef)gifImageData, (CFDictionaryRef)gifProperties); 85 | count =CGImageSourceGetCount(gif); 86 | timer = [NSTimer scheduledTimerWithTimeInterval:0.06 target:self selector:@selector(play) userInfo:nil repeats:YES];/**< 0.12->0.06 */ 87 | [timer fire]; 88 | } 89 | return self; 90 | } 91 | 92 | - (void)play { 93 | if (count > 0) { 94 | index ++; 95 | index = index%count; 96 | CGImageRef ref = CGImageSourceCreateImageAtIndex(gif, index, (CFDictionaryRef)gifProperties); 97 | self.layer.contents = (__bridge id)ref; 98 | CFRelease(ref); 99 | } else { 100 | static dispatch_once_t onceToken; 101 | // 只执行一次 102 | dispatch_once(&onceToken, ^{ 103 | NSLog(@"[DHGifImageOperation]:请检测网络或者http协议"); 104 | }); 105 | } 106 | } 107 | 108 | - (void)removeFromSuperview { 109 | [timer invalidate]; 110 | timer = nil; 111 | [super removeFromSuperview]; 112 | } 113 | 114 | #pragma mark - 加载本地GIF图片无需设置NSTimer(自定义播放Gif图片(Name)) 115 | /**< 使用案例: [self.XXX addSubview:[[DHGifImageOperation alloc] initWithFrame:self.adFrame gifImageName:@"XXX.gif"]]; */ 116 | - (id)initWithFrame:(CGRect)frame gifImageName:(NSString *)gifImageName { 117 | self = [super initWithFrame:frame]; 118 | if (self) { 119 | NSString *gifImgName = [gifImageName stringByReplacingOccurrencesOfString:@".gif" withString:@""]; 120 | NSData *gifData = [NSData dataWithContentsOfFile: [[NSBundle mainBundle] pathForResource:gifImgName ofType:@"gif"]]; 121 | WKWebView *webView = [[WKWebView alloc] initWithFrame:frame]; 122 | [webView setBackgroundColor:[UIColor clearColor]]; 123 | [webView.scrollView setScrollEnabled:NO]; 124 | [webView loadData:gifData MIMEType:@"image/gif" characterEncodingName:@"" baseURL:[NSURL URLWithString:@""]]; 125 | UIButton *clearButton = [UIButton buttonWithType:UIButtonTypeCustom]; 126 | [clearButton setFrame:webView.frame]; 127 | [clearButton setBackgroundColor:[UIColor clearColor]]; 128 | [clearButton addTarget:self action:@selector(activiTap:) forControlEvents:UIControlEventTouchUpInside]; 129 | [webView addSubview:clearButton]; 130 | [self addSubview:webView]; 131 | } 132 | return self; 133 | } 134 | 135 | - (void)activiTap:(UITapGestureRecognizer*)recognizer{ 136 | NSLog(@"[DHGifImageOperation.h]:activiTap:recognizer"); 137 | } 138 | @end 139 | -------------------------------------------------------------------------------- /MSLaunchView/MSLaunchView.h: -------------------------------------------------------------------------------- 1 | // 2 | // MSLaunchView.h 3 | // MSLaunchView 4 | // 5 | // Created by TuBo on 2018/11/8. 6 | // Copyright © 2018 TuBur. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | #import 12 | #import "MSPageControl.h" 13 | 14 | NS_ASSUME_NONNULL_BEGIN 15 | 16 | #define kisFirstLaunch [MSLaunchView isFirstLaunch] 17 | 18 | @class MSLaunchView; 19 | 20 | typedef void (^launchViewLoadFinish)(MSLaunchView *launchView); 21 | 22 | @protocol MSLaunchViewDeleagte 23 | 24 | -(void)launchViewLoadFinish:(MSLaunchView *)launchView; 25 | 26 | @end 27 | 28 | @interface MSLaunchView : UIView 29 | 30 | /** 31 | 加载完成的代理 32 | */ 33 | @property (nonatomic, weak) id delegate; 34 | 35 | /** 36 | 加载完成Block回调 37 | */ 38 | @property (nonatomic, copy) launchViewLoadFinish loadFinishBlock; 39 | 40 | /** 41 | 立即体验按钮的标题设置 默认“立即体验” 比较简陋 可以使用guideBtnCustom:自行定义 42 | */ 43 | @property (nonatomic, copy) NSString *guideTitle; 44 | 45 | /** 46 | 立即体验按钮的标题颜色设置 默认black 47 | */ 48 | @property (nonatomic, strong) UIColor *guideTitleColor; 49 | 50 | /** 51 | 立即体验按钮文字字体 52 | */ 53 | @property (nonatomic, strong) UIFont *guideTitleFont; 54 | 55 | /** 56 | 跳过按钮文字 比较简陋 可以使用skipBtnCustom:自行定义样式 57 | */ 58 | @property (nonatomic, copy) NSString *skipTitle; 59 | 60 | /** 61 | 跳过按钮背景颜色 62 | */ 63 | @property (nonatomic, strong) UIColor *skipBackgroundColor; 64 | 65 | /** 66 | 跳过按钮背景图片 67 | */ 68 | @property (nonatomic, strong) UIImage *skipBackgroundImage; 69 | 70 | /** 71 | 跳过按钮文字颜色 72 | */ 73 | @property (nonatomic, strong) UIColor *skipTitleColor; 74 | 75 | /** 76 | 跳过按钮文字字体 77 | */ 78 | @property (nonatomic, strong) UIFont *skipTitleFont; 79 | 80 | /** 81 | 是否隐藏跳过按钮 82 | */ 83 | @property (nonatomic, assign) BOOL isHiddenSkipBtn; 84 | 85 | #pragma mark - >>PageControl属性简单设置 86 | 87 | /** 88 | MSPageControl的样式 目前只支持两种样式 89 | */ 90 | @property(nonatomic,assign) MSPageControlStyle pageControlStyle; 91 | 92 | /** 93 | MSPageControl的过渡动画 目前只支持两种样式 其他样式需要自定义(自定义样式暂未开放) 94 | */ 95 | @property(nonatomic,assign) MSPageControlAnimation pageControlAnimation; 96 | 97 | /** 98 | 是否显示分页控件 默认为YES 99 | */ 100 | @property (nonatomic, assign) BOOL showPageControl; 101 | 102 | /** 103 | 分页控件距离轮播图的底部间距(在默认间距基础上)的偏移量 104 | */ 105 | @property (nonatomic, assign) CGFloat pageControlBottomOffset; 106 | 107 | /** 108 | 相邻两个小圆点间的间隔大小 Default is 8. 109 | */ 110 | @property (nonatomic,assign) CGFloat spacingBetweenDots; 111 | 112 | /** 113 | 分页控件距离轮播图的右边间距(在默认间距基础上)的偏移量 114 | */ 115 | @property (nonatomic, assign) CGFloat pageControlRightOffset; 116 | 117 | /** 118 | * 分页控件小圆标大小 119 | * 如果设置了 currentPageDotImage 和 pageDotImage 则pageControlDotSize将失效 120 | */ 121 | @property (nonatomic, assign) CGSize pageControlDotSize; 122 | 123 | /** 124 | 当前分页控件小圆标颜色 125 | */ 126 | @property (nonatomic, strong) UIColor *currentPageDotColor; 127 | 128 | /** 129 | 其他分页控件小圆标颜色 130 | */ 131 | @property (nonatomic, strong) UIColor *pageDotColor; 132 | 133 | /** 134 | * 当前分页控件小圆标图片 设置图片后 135 | * 设置图片后currentWidthMultiple和pageControlDotSize属性失效 136 | */ 137 | @property (nonatomic, strong) UIImage *currentPageDotImage; 138 | 139 | /** 140 | * 其他分页控件小圆标图片 141 | * 设置图片后currentWidthMultiple和pageControlDotSize属性失效 142 | */ 143 | @property (nonatomic, strong) UIImage *pageDotImage; 144 | 145 | #pragma mark - 新增属性 146 | 147 | /** 148 | 是否为方形点,默认为NO 149 | */ 150 | @property(nonatomic, assign) BOOL dotsIsSquare; 151 | 152 | 153 | /** 154 | 最后一页是否隐藏pageControl 默认为NO 不隐藏 155 | */ 156 | @property(nonatomic, assign) BOOL lastDotsIsHidden; 157 | 158 | /** 159 | 当前选中点宽度与未选中点的宽度的倍数 默认是1 160 | * 计算方法 pageDotSize.width = pageDotSize.width * currentWidthMultiple; 161 | * 设置currentPageDotImage或者pageDotImage图片后currentWidthMultiple失效 162 | */ 163 | @property(nonatomic, assign) CGFloat currentWidthMultiple; 164 | 165 | /** 166 | 未选中点的layerColor 167 | */ 168 | @property(nonatomic, strong) UIColor *dotBorderColor; 169 | 170 | /** 171 | 选中点的layerColor 172 | */ 173 | @property(nonatomic, strong) UIColor *currentDotBorderColor; 174 | 175 | /** 176 | 未选中点的layer宽度 177 | */ 178 | @property(nonatomic, assign) CGFloat dotBorderWidth; 179 | 180 | /** 181 | 选中点的layer宽度 182 | */ 183 | @property(nonatomic, assign) CGFloat currentDotBorderWidth; 184 | 185 | /** 186 | 轮播文字label对齐方式 187 | */ 188 | @property (nonatomic, assign) NSTextAlignment titleLabelTextAlignment; 189 | 190 | 191 | /** 192 | pageControlAnimation为MSPageControlStyleNumber时字体设置 193 | */ 194 | @property(nonatomic,strong) UIFont *textFont; 195 | 196 | /** 197 | pageControlAnimation为MSPageControlStyleNumber时文本颜色设置 198 | */ 199 | @property(nonatomic,strong) UIColor *textColor; 200 | 201 | 202 | /** 203 | * 自定义立即体验按钮() 204 | * 如果使用launchWithImages:guideFrame:gImage:方法初始化,该方法将会失效 205 | * @param btn 自定义按钮块 206 | */ 207 | -(void)guideBtnCustom:(UIButton *(^)(void))btn; 208 | 209 | /** 210 | 自定义跳过按钮 211 | 212 | @param btn 自定义按钮块 213 | */ 214 | -(void)skipBtnCustom:(UIButton *(^)(void))btn; 215 | 216 | 217 | 218 | #pragma mark ----可自动识别动态图片和静态图片 219 | #pragma 图片引导页 220 | /** 221 | APP 是否是首次进入 222 | 223 | @return YES 是首次进入(首次进入定义:APP第一次安装打开或者版本更新后第一次进入) 224 | */ 225 | + (BOOL)isFirstLaunch; 226 | 227 | /** 228 | 不带按钮的引导页,滑动到最后一页,再向右滑直接隐藏引导页 229 | 230 | @param images 背景图片数组(支持gif) 231 | @param isScrollOut 最后一页面是否自动退出 232 | @return MSLaunchView对象 233 | */ 234 | +(instancetype) launchWithImages:(NSArray *)images isScrollOut:(BOOL)isScrollOut; 235 | 236 | /** 237 | * 带按钮的引导页(如果使用该方法初始化,guideBtnCustom将会失效) 238 | * 239 | * @param images 背景图片数组 240 | * @param gframe 按钮的frame 241 | * @param gImage 按钮的图片 242 | * @param isScrollOut 是否最后一页左滑自动退出 243 | * @return MSLaunchView对象 244 | */ 245 | +(instancetype) launchWithImages:(NSArray *)images guideFrame:(CGRect)gframe gImage:(UIImage *)gImage isScrollOut:(BOOL)isScrollOut; 246 | 247 | 248 | /** 249 | * 用storyboard创建的project调用此方法 250 | * (如果使用该方法初始化,guideBtnCustom将会失效) 251 | * @param images 图片名字数组 252 | * @param sbName storyboardName 默认为@"Main" 253 | * @param gframe 按钮的frame 254 | * @param gImage 按钮图片名字 255 | * @param isScrollOut 是否最后一页左滑自动退出 256 | * @return MSLaunchView对象 257 | */ 258 | +(instancetype) launchWithImages:(NSArray *)images sbName:(NSString *)sbName guideFrame:(CGRect)gframe gImage:(UIImage *)gImage isScrollOut:(BOOL)isScrollOut; 259 | /** 260 | 用storyboard创建的project调用此方法(不带t立即体验按钮) 261 | 262 | @param images 图片名字数组 263 | @param sbName storyboardName 默认为@"Main" 264 | @param isScrollOut 是否最后一页左滑自动退出 265 | @return MSLaunchView对象 266 | */ 267 | +(instancetype)launchWithImages:(NSArray *)images sbName:(NSString *)sbName isScrollOut:(BOOL)isScrollOut; 268 | 269 | #pragma 视频引导页 目前仅支持单个视频 270 | 271 | /** 272 | 是否播放完成后自动推出 默认:YES 273 | */ 274 | @property (nonatomic, assign) BOOL isPalyEndOut; 275 | 276 | /** 277 | 视频拉伸方式 默认:AVLayerVideoGravityResizeAspectFill 278 | */ 279 | @property (nonatomic, copy) AVLayerVideoGravity videoGravity; 280 | 281 | /** 282 | * MSLaunchView(视频引导页) 283 | * 284 | * @param videoFrame 位置大小 285 | * @param videoURL 引导页视频地址 286 | * 287 | * @return MSLaunchView对象 288 | */ 289 | + (instancetype)launchWithVideo:(CGRect)videoFrame videoURL:(NSURL *)videoURL; 290 | 291 | 292 | /** 293 | 带按钮的视频引导页(如果使用该方法初始化,guideBtnCustom将会失效) 294 | 295 | @param videoFrame 位置大小 296 | @param videoURL 引导页视频地址 297 | @param gframe 按钮的frame 298 | @param gImage 按钮图片名字 299 | @return MSLaunchView对象 300 | */ 301 | + (instancetype)launchWithVideo:(CGRect)videoFrame videoURL:(NSURL *)videoURL guideFrame:(CGRect)gframe gImage:(UIImage *)gImage; 302 | 303 | 304 | /** 305 | 用storyboard创建的project调用此方法 306 | 307 | @param videoFrame 位置大小 308 | @param videoURL 引导页视频地址 309 | @param sbName storyboardName 默认为@"Main" 310 | @return MSLaunchView对象 311 | */ 312 | + (instancetype)launchWithVideo:(CGRect)videoFrame videoURL:(NSURL *)videoURL sbName:(NSString *)sbName; 313 | 314 | 315 | /** 316 | 用storyboard创建的project调用此方法 (如果使用该方法初始化,guideBtnCustom将会失效) 317 | 318 | @param videoFrame 位置大小 319 | @param videoURL 引导页视频地址 320 | @param sbName storyboardName 默认为@"Main" 321 | @param gframe 按钮的frame 322 | @param gImage 按钮图片名字 323 | @return MSLaunchView对象 324 | */ 325 | + (instancetype)launchWithVideo:(CGRect)videoFrame videoURL:(NSURL *)videoURL sbName:(NSString *)sbName guideFrame:(CGRect)gframe gImage:(UIImage *)gImage; 326 | 327 | /** 328 | 隐藏引导页面 329 | */ 330 | -(void)hideGuidView; 331 | 332 | 333 | @end 334 | 335 | NS_ASSUME_NONNULL_END 336 | -------------------------------------------------------------------------------- /MSLaunchView/MSLaunchView.m: -------------------------------------------------------------------------------- 1 | // 2 | // MSLaunchView.m 3 | // MSLaunchView 4 | // 5 | // Created by TuBo on 2018/11/8. 6 | // Copyright © 2018 TuBur. All rights reserved. 7 | // 8 | 9 | #import "MSLaunchView.h" 10 | #import "MSLaunchOperation.h" 11 | 12 | #define MSHidden_TIME 1.0 13 | #define MSScreenW [UIScreen mainScreen].bounds.size.width 14 | #define MSScreenH [UIScreen mainScreen].bounds.size.height 15 | 16 | #define MS_LAZY(object,assignment) (object = object ?:assignment) 17 | #define kCycleScrollViewInitialPageControlDotSize CGSizeMake(8, 8) 18 | 19 | @interface MSLaunchView(){ 20 | UIImageView *launchView;//获取到最后一个imageView 添加自定义按钮 21 | // 22 | CGFloat oldlastContentOffset; 23 | CGFloat newlastContentOffset; 24 | 25 | CGRect guideFrame;// 26 | CGRect videoFrame; 27 | UIImage *gbgImage;//按钮背景图片 28 | } 29 | @property (nonatomic, strong) UIButton *skipButton;//跳过按钮 30 | @property (nonatomic, strong) UIButton *guideButton;//立即进入按钮 31 | @property (nonatomic, strong) MSPageControl *pageControl; 32 | @property (nonatomic, strong) AVPlayerViewController *playerController;//视频播放 33 | @property (nonatomic, copy) NSMutableArray *dataImages; //图片数据 34 | @property (nonatomic, strong) NSURL *videoUrl; 35 | @property (nonatomic, assign) BOOL isScrollOut;//是否左滑推出 36 | 37 | @property (nonatomic, strong) UIScrollView *scrollView; 38 | 39 | @end 40 | 41 | static NSString *const kAppVersion = @"appVersion"; 42 | 43 | @implementation MSLaunchView 44 | 45 | #pragma mark - 创建对象-->>不带button 左滑动消失 46 | +(instancetype) launchWithImages:(NSArray *)images isScrollOut:(BOOL)isScrollOut{ 47 | return [[MSLaunchView alloc] initWithVideoframe:CGRectZero guideFrame:CGRectZero images:images gImage:nil sbName:nil videoUrl:nil isScrollOut:isScrollOut]; 48 | } 49 | 50 | #pragma mark - 创建对象-->>带button 51 | +(instancetype)launchWithImages:(NSArray *)images guideFrame:(CGRect)gframe gImage:(UIImage *)gImage isScrollOut:(BOOL)isScrollOut{ 52 | return [[MSLaunchView alloc] initWithVideoframe:CGRectZero guideFrame:gframe images:images gImage:gImage sbName:nil videoUrl:nil isScrollOut:isScrollOut]; 53 | } 54 | 55 | #pragma mark - 用storyboard创建的项目时调用,不带button左滑动不消失 56 | +(instancetype)launchWithImages:(NSArray *)images sbName:(NSString *)sbName isScrollOut:(BOOL)isScrollOut{ 57 | return [[MSLaunchView alloc] initWithVideoframe:CGRectZero guideFrame:CGRectZero images:images gImage:nil sbName:![MSLaunchView isBlankString:sbName]? sbName:@"Main" videoUrl:nil isScrollOut:isScrollOut]; 58 | } 59 | 60 | #pragma mark - 用storyboard创建的项目时调用,带button左滑动不消失 61 | +(instancetype)launchWithImages:(NSArray *)images sbName:(NSString *)sbName guideFrame:(CGRect)gframe gImage:(UIImage *)gImage isScrollOut:(BOOL)isScrollOut{ 62 | return [[MSLaunchView alloc] initWithVideoframe:CGRectZero guideFrame:gframe images:images gImage:nil sbName:![MSLaunchView isBlankString:sbName]? sbName:@"Main" videoUrl:nil isScrollOut:isScrollOut]; 63 | } 64 | 65 | 66 | #pragma mark - 关于Video引导页 67 | 68 | #pragma mark - 创建对象,不带button 左滑动消失 69 | + (instancetype)launchWithVideo:(CGRect)videoFrame videoURL:(NSURL *)videoURL{ 70 | return [[MSLaunchView alloc] initWithVideoframe:videoFrame guideFrame:CGRectZero images:nil gImage:nil sbName:nil videoUrl:videoURL isScrollOut:YES]; 71 | } 72 | 73 | #pragma mark - 创建对象,不带button 左滑动不消失 74 | + (instancetype)launchWithVideo:(CGRect)videoFrame videoURL:(NSURL *)videoURL guideFrame:(CGRect)gframe gImage:(UIImage *)gImage{ 75 | return [[MSLaunchView alloc] initWithVideoframe:videoFrame guideFrame:gframe images:nil gImage:gImage sbName:nil videoUrl:videoURL isScrollOut:NO]; 76 | } 77 | 78 | 79 | #pragma mark - 用storyboard创建的项目时调用,不带button左滑动消失 80 | + (instancetype)launchWithVideo:(CGRect)videoFrame videoURL:(NSURL *)videoURL sbName:(NSString *)sbName{ 81 | return [[MSLaunchView alloc] initWithVideoframe:videoFrame guideFrame:CGRectZero images:nil gImage:nil sbName:![MSLaunchView isBlankString:sbName]? sbName:@"Main" videoUrl:videoURL isScrollOut:YES]; 82 | } 83 | 84 | #pragma mark - 用storyboard创建的项目时调用,带button左滑动不消失 85 | + (instancetype)launchWithVideo:(CGRect)videoFrame videoURL:(NSURL *)videoURL sbName:(NSString *)sbName guideFrame:(CGRect)gframe gImage:(UIImage *)gImage { 86 | return [[MSLaunchView alloc] initWithVideoframe:videoFrame guideFrame:gframe images:nil gImage:gImage sbName:![MSLaunchView isBlankString:sbName]? sbName:@"Main" videoUrl:videoURL isScrollOut:NO]; 87 | } 88 | 89 | 90 | #pragma mark - 初始化 91 | - (instancetype)initWithVideoframe:(CGRect)frame guideFrame:(CGRect)gframe images:(NSArray *)images gImage:(UIImage *)gImage sbName:(NSString *)sbName videoUrl:(NSURL *)videoUrl isScrollOut:(BOOL)isScrollOut{ 92 | self = [super init]; 93 | if (self) { 94 | 95 | self.frame = CGRectMake(0, 0, MSScreenW, MSScreenH); 96 | self.backgroundColor = [UIColor whiteColor]; 97 | if (images.count>0) { 98 | self.dataImages = [NSMutableArray arrayWithArray:images]; 99 | } 100 | 101 | //初始化默认数据 102 | [self initialization]; 103 | 104 | self.videoUrl = videoUrl; 105 | videoFrame = frame; 106 | guideFrame = gframe; 107 | gbgImage = gImage; 108 | self.isScrollOut = isScrollOut; 109 | self.isPalyEndOut = YES; 110 | self.videoGravity = AVLayerVideoGravityResizeAspectFill; 111 | 112 | if ([MSLaunchView isFirstLaunch]) { 113 | //保存当前的最新版本号 114 | NSDictionary *infoDic = [[NSBundle mainBundle] infoDictionary]; 115 | NSString *currentAppVersion = infoDic[@"CFBundleShortVersionString"]; 116 | [[NSUserDefaults standardUserDefaults] setObject:currentAppVersion forKey:kAppVersion]; 117 | [[NSUserDefaults standardUserDefaults] synchronize]; 118 | 119 | UIWindow *window = [UIApplication sharedApplication].windows.lastObject; 120 | 121 | if (sbName != nil) { 122 | UIStoryboard *story = [UIStoryboard storyboardWithName:sbName bundle:nil]; 123 | UIViewController * vc = story.instantiateInitialViewController; 124 | window.rootViewController = vc; 125 | [vc.view addSubview:self]; 126 | }else{ 127 | [window addSubview:self]; 128 | } 129 | 130 | if (videoUrl && images == nil) { 131 | [self addVideo]; 132 | }else{ 133 | [self addImages]; 134 | [self setupPageControl]; 135 | } 136 | }else{ 137 | [self removeGuidePageHUD]; 138 | } 139 | } 140 | return self; 141 | } 142 | 143 | - (void)initialization{ 144 | 145 | self.backgroundColor = [UIColor lightGrayColor]; 146 | 147 | _showPageControl = YES; 148 | _pageControlDotSize = kCycleScrollViewInitialPageControlDotSize; 149 | _pageControlBottomOffset = 0; 150 | _pageControlRightOffset = 0; 151 | _currentPageDotColor = [UIColor whiteColor]; 152 | _pageDotColor = [UIColor lightGrayColor]; 153 | _spacingBetweenDots = 8; 154 | _currentWidthMultiple = 1;//当前选中点宽度与未选中点的宽度的倍数,默认为1倍 155 | _dotsIsSquare = NO;//默认是圆点 156 | _lastDotsIsHidden = NO; 157 | _currentDotBorderWidth = 0; 158 | _currentDotBorderColor = [UIColor clearColor]; 159 | 160 | _dotBorderColor = [UIColor whiteColor]; 161 | _dotBorderWidth = 0; 162 | 163 | _pageControlStyle = MSPageControlStyleSystem; 164 | _pageControlAnimation = MSPageControlAnimationNone; 165 | 166 | self.textFont = [UIFont systemFontOfSize:9]; 167 | self.textColor = [UIColor blackColor]; 168 | } 169 | 170 | 171 | #pragma mark - 判断是不是首次登录或者版本更新 172 | + (BOOL) isFirstLaunch{ 173 | //获取当前版本号 174 | NSDictionary *infoDic = [[NSBundle mainBundle] infoDictionary]; 175 | NSString *currentAppVersion = infoDic[@"CFBundleShortVersionString"]; 176 | //获取上次启动应用保存的appVersion 177 | NSString *version = [[NSUserDefaults standardUserDefaults] objectForKey:kAppVersion]; 178 | //版本升级或首次登录 179 | if ([MSLaunchView isBlankString:version] || ![version isEqualToString:currentAppVersion]) { 180 | return YES; 181 | }else{ 182 | return NO; 183 | } 184 | } 185 | 186 | 187 | 188 | #pragma mark - 创建滚动视图、添加引导页图片 189 | -(void)addImages{ 190 | 191 | self.scrollView.contentSize = CGSizeMake(MSScreenW * self.dataImages.count, MSScreenH); 192 | [self addSubview:self.scrollView]; 193 | 194 | for (int i = 0; i < self.dataImages.count; i ++) { 195 | UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(i * MSScreenW, 0, MSScreenW, MSScreenH)]; 196 | imageView.userInteractionEnabled = YES; 197 | if ([[MSLaunchOperation ms_contentTypeForImageData:[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:self.dataImages[i] ofType:nil]]] isEqualToString:@"gif"]) { 198 | NSData *localData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:self.dataImages[i] ofType:nil]]; 199 | imageView = (UIImageView *)[[MSLaunchOperation alloc] initWithFrame:imageView.frame gifImageData:localData]; 200 | [_scrollView addSubview:imageView]; 201 | } else { 202 | imageView.image = [UIImage imageNamed:self.dataImages[i]]; 203 | [_scrollView addSubview:imageView]; 204 | } 205 | 206 | if (i == self.dataImages.count - 1) { 207 | //拿到最后一个图片,添加自定义体验按钮 208 | launchView = imageView; 209 | //判断要不要添加button 210 | if (!self.isScrollOut) { 211 | [imageView addSubview:self.guideButton]; 212 | } 213 | } 214 | } 215 | 216 | [self addSubview:self.skipButton]; 217 | } 218 | 219 | 220 | #pragma mark - APP视频新特性页面(新增测试模块内容) 221 | -(void)addVideo{ 222 | 223 | [self addSubview:self.playerController.view]; 224 | [self addSubview:self.guideButton]; 225 | 226 | [UIView animateWithDuration:MSHidden_TIME animations:^{ 227 | [self.guideButton setAlpha:1.0]; 228 | }]; 229 | 230 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(hideGuidView) name:AVPlayerItemDidPlayToEndTimeNotification object:nil]; 231 | 232 | [self addSubview:self.skipButton]; 233 | 234 | } 235 | 236 | #pragma mark -- >> 自定义属性设置 237 | 238 | #pragma mark - 跳过按钮的简单设置 239 | -(void)setSkipTitle:(NSString *)skipTitle{ 240 | [self.skipButton setTitle:skipTitle forState:UIControlStateNormal]; 241 | } 242 | 243 | -(void)setSkipBackgroundColor:(UIColor *)skipBackgroundColor{ 244 | [self.skipButton setBackgroundColor:skipBackgroundColor]; 245 | } 246 | 247 | -(void)setSkipBackgroundImage:(UIImage *)skipBackgroundImage{ 248 | [self.skipButton setBackgroundImage:skipBackgroundImage forState:UIControlStateNormal]; 249 | } 250 | 251 | -(void)setSkipTitleColor:(UIColor *)skipTitleColor{ 252 | [self.skipButton setTitleColor:skipTitleColor forState:UIControlStateNormal]; 253 | } 254 | 255 | -(void)setSkipTitleFont:(UIFont *)skipTitleFont{ 256 | self.skipButton.titleLabel.font = skipTitleFont; 257 | } 258 | 259 | 260 | -(void)setIsHiddenSkipBtn:(BOOL)isHiddenSkipBtn{ 261 | self.skipButton.hidden = isHiddenSkipBtn; 262 | } 263 | 264 | 265 | -(void)skipBtnCustom:(UIButton *(^)(void))btn{ 266 | [self.skipButton removeFromSuperview]; 267 | [self addSubview:btn()]; 268 | } 269 | 270 | 271 | 272 | #pragma mark - 立即体验按钮的简单设置 273 | -(void)setGuideTitle:(NSString *)guideTitle{ 274 | [self.guideButton setTitle:guideTitle forState:UIControlStateNormal]; 275 | } 276 | 277 | -(void)setGuideBackgroundImage:(UIImage *)guideBackgroundImage{ 278 | [self.guideButton setBackgroundImage:guideBackgroundImage forState:UIControlStateNormal]; 279 | } 280 | 281 | -(void)setGuideTitleColor:(UIColor *)guideTitleColor{ 282 | [self.guideButton setTitleColor:guideTitleColor forState:UIControlStateNormal]; 283 | } 284 | 285 | -(void)setGuideTitleFont:(UIFont *)guideTitleFont{ 286 | self.guideButton.titleLabel.font = guideTitleFont; 287 | } 288 | 289 | #pragma mark - 自定义进入按钮 290 | -(void)guideBtnCustom:(UIButton *(^)(void))btn{ 291 | 292 | if(guideFrame.size.height || guideFrame.origin.x) return; 293 | 294 | //移除当前的体验按钮 295 | [self.guideButton removeFromSuperview]; 296 | if (_videoUrl) { 297 | [self addSubview:btn()]; 298 | }else{ 299 | [launchView addSubview:btn()]; 300 | } 301 | } 302 | 303 | #pragma mark - UIPageControl简单设置 304 | -(void)setLastDotsIsHidden:(BOOL)lastDotsIsHidden{ 305 | _lastDotsIsHidden = lastDotsIsHidden; 306 | } 307 | 308 | - (void)setPageControlDotSize:(CGSize)pageControlDotSize 309 | { 310 | _pageControlDotSize = pageControlDotSize; 311 | MSPageControl *pageControl = (MSPageControl *)_pageControl; 312 | pageControl.pageDotSize = pageControlDotSize; 313 | } 314 | 315 | - (void)setShowPageControl:(BOOL)showPageControl{ 316 | _showPageControl = showPageControl; 317 | _pageControl.hidden = !showPageControl; 318 | } 319 | 320 | -(void)setSpacingBetweenDots:(CGFloat)spacingBetweenDots{ 321 | if (_spacingBetweenDots == spacingBetweenDots) return; 322 | 323 | _spacingBetweenDots = spacingBetweenDots; 324 | MSPageControl *pageControl = (MSPageControl *)_pageControl; 325 | pageControl.spacingBetweenDots = spacingBetweenDots; 326 | } 327 | 328 | - (void)setDotBorderWidth:(CGFloat)dotBorderWidth{ 329 | if (_dotBorderWidth == dotBorderWidth) return; 330 | 331 | _dotBorderWidth = dotBorderWidth; 332 | MSPageControl *pageControl = (MSPageControl *)_pageControl; 333 | pageControl.dotBorderWidth = dotBorderWidth; 334 | } 335 | 336 | -(void)setCurrentDotBorderWidth:(CGFloat)currentDotBorderWidth{ 337 | if (_currentDotBorderWidth == currentDotBorderWidth) return; 338 | _currentDotBorderWidth = currentDotBorderWidth; 339 | MSPageControl *pageControl = (MSPageControl *)_pageControl; 340 | pageControl.currentDotBorderWidth = currentDotBorderWidth; 341 | 342 | } 343 | 344 | -(void)setDotBorderColor:(UIColor *)dotBorderColor{ 345 | if (_dotBorderColor == dotBorderColor) return; 346 | _dotBorderColor = dotBorderColor; 347 | MSPageControl *pageControl = (MSPageControl *)_pageControl; 348 | pageControl.dotBorderColor = dotBorderColor; 349 | } 350 | -(void)setPageControlAnimation:(MSPageControlAnimation)pageControlAnimation{ 351 | if (_pageControlAnimation == pageControlAnimation) return; 352 | _pageControlAnimation = pageControlAnimation; 353 | MSPageControl *pageControl = (MSPageControl *)_pageControl; 354 | pageControl.pageControlAnimation = pageControlAnimation; 355 | } 356 | 357 | -(void)setCurrentDotBorderColor:(UIColor *)currentDotBorderColor{ 358 | if (_currentDotBorderColor == currentDotBorderColor) return; 359 | 360 | _currentDotBorderColor = currentDotBorderColor; 361 | MSPageControl *pageControl = (MSPageControl *)_pageControl; 362 | pageControl.currentDotBorderColor = currentDotBorderColor; 363 | } 364 | 365 | -(void)setCurrentWidthMultiple:(CGFloat)currentWidthMultiple{ 366 | if (_currentWidthMultiple == currentWidthMultiple) return; 367 | 368 | _currentWidthMultiple = currentWidthMultiple; 369 | MSPageControl *pageControl = (MSPageControl *)_pageControl; 370 | pageControl.currentWidthMultiple = currentWidthMultiple; 371 | } 372 | 373 | -(void)setDotsIsSquare:(BOOL)dotsIsSquare{ 374 | if (_dotsIsSquare == dotsIsSquare) return; 375 | _dotsIsSquare = dotsIsSquare; 376 | MSPageControl *pageControl = (MSPageControl *)_pageControl; 377 | pageControl.dotsIsSquare = dotsIsSquare; 378 | } 379 | 380 | -(void)setPageControlStyle:(MSPageControlStyle)pageControlStyle{ 381 | if (_pageControlStyle == pageControlStyle) return; 382 | _pageControlStyle = pageControlStyle; 383 | MSPageControl *pageControl = (MSPageControl *)_pageControl; 384 | pageControl.pageControlStyle = pageControlStyle; 385 | } 386 | 387 | 388 | - (void)setCurrentPageDotColor:(UIColor *)currentPageDotColor 389 | { 390 | _currentPageDotColor = currentPageDotColor; 391 | 392 | MSPageControl *pageControl = (MSPageControl *)_pageControl; 393 | pageControl.currentDotColor = currentPageDotColor; 394 | } 395 | 396 | - (void)setPageDotColor:(UIColor *)pageDotColor 397 | { 398 | if (_pageDotColor == pageDotColor) return; 399 | _pageDotColor = pageDotColor; 400 | MSPageControl *pageControl = (MSPageControl *)_pageControl; 401 | pageControl.dotColor = pageDotColor; 402 | } 403 | -(void)setTextFont:(UIFont *)textFont{ 404 | if (_textFont == textFont) return; 405 | _textFont = textFont; 406 | MSPageControl *pageControl = (MSPageControl *)_pageControl; 407 | pageControl.textFont = textFont; 408 | } 409 | 410 | -(void)setTextColor:(UIColor *)textColor{ 411 | if (_textColor == textColor) return; 412 | _textColor = textColor; 413 | MSPageControl *pageControl = (MSPageControl *)_pageControl; 414 | pageControl.textColor = textColor; 415 | } 416 | 417 | - (void)setCurrentPageDotImage:(UIImage *)currentPageDotImage 418 | { 419 | _currentPageDotImage = currentPageDotImage; 420 | 421 | [self setCustomPageControlDotImage:currentPageDotImage isCurrentPageDot:YES]; 422 | } 423 | 424 | - (void)setPageDotImage:(UIImage *)pageDotImage 425 | { 426 | _pageDotImage = pageDotImage; 427 | 428 | [self setCustomPageControlDotImage:pageDotImage isCurrentPageDot:NO]; 429 | } 430 | 431 | 432 | - (void)setCustomPageControlDotImage:(UIImage *)image isCurrentPageDot:(BOOL)isCurrentPageDot 433 | { 434 | if (!image || !self.pageControl) return; 435 | 436 | if ([self.pageControl isKindOfClass:[MSPageControl class]]) { 437 | MSPageControl *pageControl = (MSPageControl *)_pageControl; 438 | if (isCurrentPageDot) { 439 | pageControl.currentDotImage = image; 440 | } else { 441 | pageControl.dotImage = image; 442 | } 443 | } 444 | } 445 | 446 | #pragma mark - UIPageControl简单设置 447 | 448 | 449 | -(void)setVideoGravity:(AVLayerVideoGravity)videoGravity{ 450 | self.playerController.videoGravity = videoGravity; 451 | } 452 | 453 | -(void)setIsPalyEndOut:(BOOL)isPalyEndOut{ 454 | if (!isPalyEndOut) { 455 | [[NSNotificationCenter defaultCenter] removeObserver:self]; 456 | } 457 | } 458 | 459 | #pragma mark - 隐藏引导页 460 | 461 | -(void)hideGuidView{ 462 | 463 | [UIView animateWithDuration:MSHidden_TIME animations:^{ 464 | self.alpha = 0; 465 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(MSHidden_TIME * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 466 | [self performSelector:@selector(removeGuidePageHUD) withObject:nil afterDelay:1]; 467 | }); 468 | }]; 469 | 470 | [[NSNotificationCenter defaultCenter] removeObserver:self]; 471 | 472 | if (self.delegate && [self.delegate respondsToSelector:@selector(launchViewLoadFinish:)]) { 473 | [self.delegate launchViewLoadFinish:self]; 474 | } 475 | 476 | if (self.loadFinishBlock) { 477 | self.loadFinishBlock(self); 478 | } 479 | } 480 | 481 | - (void)removeGuidePageHUD { 482 | //解决第二次进入视屏不显示还能听到声音的BUG 483 | if (self.videoUrl) { 484 | self.playerController = nil; 485 | } 486 | [self removeFromSuperview]; 487 | } 488 | 489 | 490 | 491 | #pragma mark - ScrollerView Delegate 492 | 493 | -(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{ 494 | oldlastContentOffset = scrollView.contentOffset.x; 495 | } 496 | 497 | - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{ 498 | [self scrollViewDidEndScrollingAnimation:self.scrollView]; 499 | } 500 | 501 | - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{ 502 | newlastContentOffset = scrollView.contentOffset.x; 503 | int cuttentIndex = [self currentIndex]; 504 | 505 | if (cuttentIndex == self.dataImages.count - 1) { 506 | if ([self isScrolltoLeft:scrollView]) { 507 | if (!self.isScrollOut) { 508 | return ; 509 | } 510 | [self hideGuidView]; 511 | } 512 | } 513 | } 514 | 515 | - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ 516 | if (!self.dataImages.count) return; 517 | int cuttentIndex = (int)(scrollView.contentOffset.x/MSScreenW); 518 | if (self.lastDotsIsHidden && cuttentIndex == self.dataImages.count - 1) { 519 | return; 520 | } 521 | MSPageControl *pageControl = (MSPageControl *)_pageControl; 522 | pageControl.currentPage = [self currentIndex]; 523 | } 524 | 525 | - (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView 526 | { 527 | int cuttentIndex = (int)(scrollView.contentOffset.x/MSScreenW); 528 | 529 | MSPageControl *pageControl = (MSPageControl *)_pageControl; 530 | if (self.lastDotsIsHidden && cuttentIndex == self.dataImages.count - 1) { 531 | pageControl.hidden = YES; 532 | return; 533 | } 534 | pageControl.hidden = NO; 535 | } 536 | 537 | - (int)currentIndex{ 538 | int index = 0; 539 | index = (_scrollView.contentOffset.x) / MSScreenW; 540 | return MAX(0, index); 541 | } 542 | 543 | 544 | #pragma mark - 判断滚动方向 545 | -(BOOL)isScrolltoLeft:(UIScrollView *)scrollView{ 546 | if (oldlastContentOffset - newlastContentOffset >0 ){ 547 | return NO; 548 | } 549 | return YES; 550 | } 551 | 552 | #pragma mark - prvite void 553 | //判断字符串是否为空 554 | + (BOOL)isBlankString:(NSString *)string{ 555 | 556 | if (string == nil || string == NULL) { 557 | return YES; 558 | } 559 | 560 | if ([string isKindOfClass:[NSNull class]]) { 561 | return YES; 562 | } 563 | if ([[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] length] ==0) { 564 | return YES; 565 | } 566 | 567 | return NO; 568 | } 569 | 570 | - (void)setupPageControl 571 | { 572 | if (_pageControl) [_pageControl removeFromSuperview]; // 重新加载数据时调整 573 | 574 | if (!self.showPageControl) return; 575 | 576 | if (self.dataImages.count == 0) return; 577 | // 578 | if (self.dataImages.count == 1) return; 579 | 580 | [self addSubview:self.pageControl]; 581 | 582 | // 重设pagecontroldot图片 583 | if (self.currentPageDotImage) { 584 | self.currentPageDotImage = self.currentPageDotImage; 585 | } 586 | if (self.pageDotImage) { 587 | self.pageDotImage = self.pageDotImage; 588 | } 589 | } 590 | 591 | - (void)layoutSubviews{ 592 | 593 | [super layoutSubviews]; 594 | 595 | CGSize size = CGSizeZero; 596 | 597 | if ([self.pageControl isKindOfClass:[MSPageControl class]]) { 598 | MSPageControl *pageControl = (MSPageControl *)_pageControl; 599 | if (!(self.pageDotImage && self.currentPageDotImage && CGSizeEqualToSize(kCycleScrollViewInitialPageControlDotSize, self.pageControlDotSize))) { 600 | pageControl.pageDotSize = self.pageControlDotSize; 601 | } 602 | size = [pageControl sizeForNumberOfPages:self.dataImages.count]; 603 | } else { 604 | size = CGSizeMake(self.dataImages.count * self.pageControlDotSize.width * 1.5, self.pageControlDotSize.height); 605 | } 606 | CGFloat x = (self.frame.size.width - size.width) * 0.5; 607 | // if (self.pageControlAliment == kMSPageContolAlimentRight) { 608 | // x = self.mainView.sd_width - size.width - 10; 609 | // } 610 | CGFloat y = self.frame.size.height - size.height - 20; 611 | 612 | if ([self.pageControl isKindOfClass:[MSPageControl class]]) { 613 | MSPageControl *pageControl = (MSPageControl *)_pageControl; 614 | [pageControl sizeToFit]; 615 | } 616 | 617 | CGRect pageControlFrame = CGRectMake(x, y, size.width, size.height); 618 | pageControlFrame.origin.y -= self.pageControlBottomOffset; 619 | // pageControlFrame.origin.x -= self.pageControlRightOffset; 620 | self.pageControl.frame = pageControlFrame; 621 | self.pageControl.hidden = !_showPageControl; 622 | 623 | } 624 | 625 | #pragma mark - >> 懒加载部分 626 | -(MSPageControl *)pageControl{ 627 | return MS_LAZY(_pageControl,({ 628 | MSPageControl *pageControl = [[MSPageControl alloc] init]; 629 | pageControl.numberOfPages = self.dataImages.count; 630 | pageControl.userInteractionEnabled = NO; 631 | pageControl.currentPage = [self currentIndex]; 632 | pageControl; 633 | })); 634 | } 635 | #pragma mark - 跳过按钮 636 | -(UIButton *)skipButton{ 637 | return MS_LAZY(_skipButton, ({ 638 | // 设置引导页上的跳过按钮 639 | UIButton *skipButton = [UIButton buttonWithType:UIButtonTypeCustom]; 640 | skipButton.frame = CGRectMake(MSScreenW*0.8, MSScreenW*0.1, 50, 25); 641 | [skipButton setTitle:@"跳过" forState:UIControlStateNormal]; 642 | [skipButton.titleLabel setFont:[UIFont systemFontOfSize:14.0]]; 643 | [skipButton setBackgroundColor:[UIColor grayColor]]; 644 | [skipButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; 645 | [skipButton.layer setCornerRadius:(skipButton.frame.size.height * 0.5)]; 646 | [skipButton addTarget:self action:@selector(hideGuidView) forControlEvents:UIControlEventTouchUpInside]; 647 | skipButton; 648 | })); 649 | } 650 | 651 | #pragma mark - 进入按钮 652 | -(UIButton *)guideButton{ 653 | return MS_LAZY(_guideButton, ({ 654 | // 设置引导页上的跳过按钮 655 | //CGRectMake(MSScreenW*0.3, MSScreenH*0.8, MSScreenW*0.4, MSScreenH*0.08) 656 | UIButton *guideButton = [UIButton buttonWithType:UIButtonTypeCustom]; 657 | guideButton.frame = guideFrame; 658 | [guideButton setTitle:@"开始体验" forState:UIControlStateNormal]; 659 | [guideButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; 660 | [guideButton setBackgroundImage:gbgImage forState:UIControlStateNormal]; 661 | [guideButton.titleLabel setFont:[UIFont systemFontOfSize:21]]; 662 | [guideButton addTarget:self action:@selector(hideGuidView) forControlEvents:UIControlEventTouchUpInside]; 663 | guideButton; 664 | })); 665 | } 666 | 667 | 668 | #pragma mark - 视频播放VC 669 | -(AVPlayerViewController *)playerController{ 670 | return MS_LAZY(_playerController, ({ 671 | AVPlayerViewController *playerController = [[AVPlayerViewController alloc] init]; 672 | playerController.view.frame = videoFrame; 673 | playerController.view.backgroundColor = [UIColor whiteColor]; 674 | [playerController.view setAlpha:1.0]; 675 | playerController.player = [[AVPlayer alloc] initWithURL:self.videoUrl]; 676 | playerController.videoGravity = self.videoGravity; 677 | playerController.showsPlaybackControls = NO; 678 | [playerController.player play]; 679 | playerController; 680 | })); 681 | } 682 | 683 | - (UIScrollView *)scrollView{ 684 | return MS_LAZY(_scrollView, ({ 685 | UIScrollView *launchScrollView = [[UIScrollView alloc] initWithFrame:[UIScreen mainScreen].bounds]; 686 | launchScrollView.showsHorizontalScrollIndicator = NO; 687 | launchScrollView.bounces = NO; 688 | launchScrollView.pagingEnabled = YES; 689 | launchScrollView.delegate = self; 690 | launchScrollView; 691 | })); 692 | } 693 | 694 | @end 695 | 696 | 697 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MSLaunchView 2 | ### 一键合成APP引导页,包含不同状态下的引导页操作方式,同时支持动态图片引导页和静态图片引导页,支持按钮跳过按钮,立即体验按钮完全自定义,PageControl样式多样(支持方形点,圆形点,横线+小圆点样式等),省掉冗余的代码,集成性高,使用方便; 3 | --- 4 | #### 声明:部分图片来源于网络,如有涉及版权会马上删除,敬请谅解; 5 | 6 | ### 效果图展示: 7 | #### APP静态图片引导页(上) | APP动态图片引导页(下) 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 |
手动进入体验自动进入体验
手动进入体验自动进入体验
26 | 27 | #### [更新记录:](https://github.com/lztbwlkj/MSLaunchView/blob/master/CHANGELOG.md) 28 | 29 | #### 使用方式(支持代码创建和StoryBoard创建项目): 30 | 31 | ##### 图片数组(gif自动识别): 32 | 33 | ###### 使用代码创建的项目,无进入立即按钮: 34 | ```objc 35 | MSLaunchView *launchView = [MSLaunchView launchWithImages:imageNameArray isScrollOut:YES]; 36 | ``` 37 | 38 | ###### 使用StoryBoard创建的项目,无进入立即按钮: 39 | ```objc 40 | MSLaunchView *launchView = [MSLaunchView launchWithImages:imageNameArray sbName:@"" isScrollOut:NO]; 41 | ``` 42 | 43 | ###### 使用代码创建的项目,有进入立即按钮: 44 | ```objc 45 | MSLaunchView *launchView = [MSLaunchView launchWithImages:imageNameArray guideFrame:rt gImage:[UIImage imageNamed:@""] isScrollOut:NO]; 46 | ``` 47 | 48 | 49 | ###### 使用StoryBoard创建的项目,有进入立即按钮: 50 | ```objc 51 | MSLaunchView *launchView = [MSLaunchView launchWithImages:imageNameArray sbName:@"" guideFrame:rt gImage:[UIImage imageNamed:@""] isScrollOut:YES]; 52 | ``` 53 | 54 | ##### 小视频(目前仅支持单个视频文件): 55 | ```objc 56 | NSString *path = [[NSBundle mainBundle] pathForResource:@"测试" ofType:@"mp4"]; 57 | NSURL *url = [NSURL fileURLWithPath:path]; 58 | [MSLaunchView launchWithVideo:CGRectMake(0, 0, MSScreenW, MSScreenH) videoURL:url]; 59 | ``` 60 | 61 | ==!!!如果你使用带立即进入按钮的初始化方法,那么后面的guideBtnCustom:方法将会失效!!!== 62 | 63 | ##### 视频的用法和图片的用法基本一致 这里就不再赘述,具体请参考Demo 64 | 65 | ### 集成方式: 66 | #### 1.下载项目或者下载项目中MSLaunchView文件夹,将下载好的文件拖拽到自己的工程文件夹中,并在AppDelegate.h中导入#import "MSLaunchView.h"头文件; 67 | 68 | #### 2. cocoapods集成: 69 | ###### 在项目的podfile文件中加入下面代码 70 | ```objc 71 | pod 'MSLaunchView', '~>0.0.5' 72 | ``` 73 | 74 | #### 你还可以进行简单设置: 75 | ```objc 76 | launchView.guideTitle = @""; 77 | launchView.guideTitleColor = [UIColor redColor]; 78 | 79 | //是否隐藏跳过按钮 80 | launchView.isHiddenSkipBtn = YES; 81 | //PageControl属性 82 | launchView.nomalColor = [UIColor lightGrayColor]; 83 | launchView.currentColor = [UIColor orangeColor]; 84 | 85 | //视频拉伸方式 86 | launchView.videoGravity = AVLayerVideoGravityResize; 87 | //播放完成是否自动推出 默认:YES 88 | launchView.isPalyEndOut = NO; 89 | 90 | ``` 91 | 92 | #### 自定义按钮: 93 | ###### 自定义立即进入按钮: 94 | ```objc 95 | [launchView guideBtnCustom:^UIButton * _Nonnull{ 96 | UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; 97 | btn.frame = CGRectMake(60, 60, 120, 120); 98 | [btn setBackgroundColor:[UIColor redColor]]; 99 | [btn addTarget:self action:@selector(hidde) forControlEvents:UIControlEventTouchUpInside]; 100 | return btn; 101 | }]; 102 | 103 | -(void)hidde{ 104 | [_launchView hideGuidView]; 105 | ``` 106 | 107 | ###### 自定义跳过按钮: 108 | ```objc 109 | [launchView skipBtnCustom:^UIButton * _Nonnull{ 110 | UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; 111 | btn.frame = CGRectMake(60, 200, 120, 120); 112 | [btn setBackgroundColor:[UIColor blueColor]]; 113 | [btn addTarget:self action:@selector(hidde) forControlEvents:UIControlEventTouchUpInside]; 114 | return btn; 115 | }]; 116 | 117 | -(void)hidde{ 118 | [_launchView hideGuidView]; 119 | } 120 | ``` 121 | 122 | 123 | ## <<分享是一种美德,你的Star是我更新的动力,使用过程如果有什么问题可以[issues](https://github.com/lztbwlkj/MSLaunchView/issues/new),我会及时回复大家!>> 124 | 125 | 126 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-slate --------------------------------------------------------------------------------