├── .gitignore ├── JGCALayer.gif ├── JGCALayer ├── .DS_Store ├── JGCALayer.xcodeproj │ ├── project.pbxproj │ └── project.xcworkspace │ │ └── contents.xcworkspacedata ├── JGCALayer │ ├── .DS_Store │ ├── Apps │ │ ├── AppDelegate.h │ │ └── AppDelegate.m │ ├── Assets.xcassets │ │ ├── 1.imageset │ │ │ ├── 1.png │ │ │ └── Contents.json │ │ ├── 2.imageset │ │ │ ├── 2.png │ │ │ └── Contents.json │ │ ├── 3.imageset │ │ │ ├── 3.png │ │ │ └── Contents.json │ │ ├── AppIcon.appiconset │ │ │ └── Contents.json │ │ ├── Contents.json │ │ ├── Lucky │ │ │ ├── Contents.json │ │ │ ├── LuckyAnimal.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── LuckyAnimal.png │ │ │ │ └── LuckyAnimal@2x.png │ │ │ ├── LuckyAnimalPressed.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── LuckyAnimalPressed.png │ │ │ │ └── LuckyAnimalPressed@2x.png │ │ │ ├── LuckyAstrology.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── LuckyAstrology.png │ │ │ │ └── LuckyAstrology@2x.png │ │ │ ├── LuckyAstrologyPressed.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── LuckyAstrologyPressed.png │ │ │ │ └── LuckyAstrologyPressed@2x.png │ │ │ ├── LuckyBaseBackground.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── LuckyBaseBackground@2x.png │ │ │ ├── LuckyCenterButton.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── LuckyCenterButton@2x.png │ │ │ ├── LuckyCenterButtonPressed.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── LuckyCenterButtonPressed@2x.png │ │ │ ├── LuckyRotateWheel.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── LuckyRotateWheel.png │ │ │ │ └── LuckyRotateWheel@2x.png │ │ │ └── LuckyRototeSelected.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── LuckyRototeSelected.png │ │ │ │ └── LuckyRototeSelected@2x.png │ │ ├── coi_net.imageset │ │ │ ├── Contents.json │ │ │ └── coi_net.png │ │ ├── weibo │ │ │ ├── Contents.json │ │ │ ├── doubi.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── doubi.jpg │ │ │ ├── tabbar_compose_camera.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── tabbar_compose_camera@2x.png │ │ │ │ └── tabbar_compose_camera@3x.png │ │ │ ├── tabbar_compose_idea.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── tabbar_compose_idea@2x.png │ │ │ │ └── tabbar_compose_idea@3x.png │ │ │ ├── tabbar_compose_lbs.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── tabbar_compose_lbs@2x.png │ │ │ │ └── tabbar_compose_lbs@3x.png │ │ │ ├── tabbar_compose_more.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── tabbar_compose_more@2x.png │ │ │ │ └── tabbar_compose_more@3x.png │ │ │ ├── tabbar_compose_photo.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── tabbar_compose_photo@2x.png │ │ │ │ └── tabbar_compose_photo@3x.png │ │ │ ├── tabbar_compose_review.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── tabbar_compose_review@2x.png │ │ │ │ └── tabbar_compose_review@3x.png │ │ │ ├── 发送界面 │ │ │ │ ├── Contents.json │ │ │ │ ├── tabbar_compose_background_icon_close.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── tabbar_compose_background_icon_close@2x.png │ │ │ │ │ └── tabbar_compose_background_icon_close@3x.png │ │ │ │ ├── tabbar_compose_button.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── tabbar_compose_button@2x.png │ │ │ │ │ └── tabbar_compose_button@3x.png │ │ │ │ ├── tabbar_compose_button_highlighted.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── tabbar_compose_button_highlighted@2x.png │ │ │ │ │ └── tabbar_compose_button_highlighted@3x.png │ │ │ │ ├── tabbar_compose_icon_add.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── tabbar_compose_icon_add@2x.png │ │ │ │ │ └── tabbar_compose_icon_add@3x.png │ │ │ │ └── tabbar_compose_icon_add_highlighted.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── tabbar_compose_icon_add_highlighted@2x.png │ │ │ │ │ └── tabbar_compose_icon_add_highlighted@3x.png │ │ │ └── 欢迎界面 │ │ │ │ ├── Contents.json │ │ │ │ ├── ad_background.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── ad_background-568h@2x.png │ │ │ │ ├── ad_background-667h@2x.png │ │ │ │ ├── ad_background-736h@3x.png │ │ │ │ ├── ad_background@2x.png │ │ │ │ └── ad_background@3x.png │ │ │ │ └── compose_slogan.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── compose_slogan@2x.png │ │ │ │ └── compose_slogan@3x.png │ │ ├── 卡哇伊.imageset │ │ │ ├── Contents.json │ │ │ └── 卡哇伊.jpg │ │ ├── 心.imageset │ │ │ ├── Contents.json │ │ │ └── 心.png │ │ ├── 爆炸_gif │ │ │ ├── 1.imageset │ │ │ │ ├── 1.jpg │ │ │ │ └── Contents.json │ │ │ ├── 2.imageset │ │ │ │ ├── 2.jpg │ │ │ │ └── Contents.json │ │ │ ├── 3.imageset │ │ │ │ ├── 3.jpg │ │ │ │ └── Contents.json │ │ │ ├── 4.imageset │ │ │ │ ├── 4.jpg │ │ │ │ └── Contents.json │ │ │ ├── 5.imageset │ │ │ │ ├── 5.jpg │ │ │ │ └── Contents.json │ │ │ ├── 6.imageset │ │ │ │ ├── 6.jpg │ │ │ │ └── Contents.json │ │ │ ├── 7.imageset │ │ │ │ ├── 7.jpg │ │ │ │ └── Contents.json │ │ │ ├── 8.imageset │ │ │ │ ├── 8.jpg │ │ │ │ └── Contents.json │ │ │ └── Contents.json │ │ ├── 知道错了.imageset │ │ │ ├── Contents.json │ │ │ └── 知道错了.jpg │ │ ├── 钟表.imageset │ │ │ ├── Contents.json │ │ │ └── 钟表.png │ │ └── 阿狸头像.imageset │ │ │ ├── Contents.json │ │ │ └── 阿狸头像.png │ ├── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard │ ├── CateGorys │ │ ├── UIImage+JGMosaic.h │ │ └── UIImage+JGMosaic.m │ ├── Controllers │ │ ├── JGBageValueController.h │ │ ├── JGBageValueController.m │ │ ├── JGBasicViewController.h │ │ ├── JGBasicViewController.m │ │ ├── JGClockViewController.h │ │ ├── JGClockViewController.m │ │ ├── JGHeartBeatAndTranstionController.h │ │ ├── JGHeartBeatAndTranstionController.m │ │ ├── JGMosaicController.h │ │ ├── JGMosaicController.m │ │ ├── JGMusicVibrationController.h │ │ ├── JGMusicVibrationController.m │ │ ├── JGParticleViewController.h │ │ ├── JGParticleViewController.m │ │ ├── JGPicFoldViewController.h │ │ ├── JGPicFoldViewController.m │ │ ├── JGReflectionController.h │ │ ├── JGReflectionController.m │ │ ├── JGRootTableViewController.h │ │ ├── JGRootTableViewController.m │ │ ├── JGRotaryTableViewController.h │ │ ├── JGRotaryTableViewController.m │ │ ├── JGWeiBoAniController.h │ │ ├── JGWeiBoAniController.m │ │ ├── JGWeiBoComposeController.h │ │ └── JGWeiBoComposeController.m │ ├── Info.plist │ ├── Models │ │ ├── JGMuneItem.h │ │ └── JGMuneItem.m │ ├── Views │ │ ├── JGBageValue.h │ │ ├── JGBageValue.m │ │ ├── JGItemBtn.h │ │ ├── JGItemBtn.m │ │ ├── JGMosaicView.h │ │ ├── JGMosaicView.m │ │ ├── JGParticleView.h │ │ ├── JGParticleView.m │ │ ├── JGReflectionView.h │ │ ├── JGReflectionView.m │ │ ├── JGWheelView.h │ │ ├── JGWheelView.m │ │ ├── JGWheelView.xib │ │ ├── JGWheelsBtn.h │ │ └── JGWheelsBtn.m │ └── main.m ├── JGCALayerTests │ ├── Info.plist │ └── JGCALayerTests.m └── JGCALayerUITests │ ├── Info.plist │ └── JGCALayerUITests.m ├── LICENSE └── README.md /.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 | *.xcuserstate 23 | 24 | ## Obj-C/Swift specific 25 | *.hmap 26 | *.ipa 27 | *.dSYM.zip 28 | *.dSYM 29 | 30 | # CocoaPods 31 | # 32 | # We recommend against adding the Pods directory to your .gitignore. However 33 | # you should judge for yourself, the pros and cons are mentioned at: 34 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 35 | # 36 | # Pods/ 37 | 38 | # Carthage 39 | # 40 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 41 | # Carthage/Checkouts 42 | 43 | Carthage/Build 44 | 45 | # fastlane 46 | # 47 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 48 | # screenshots whenever they are needed. 49 | # For more information about the recommended setup visit: 50 | # https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md 51 | 52 | fastlane/report.xml 53 | fastlane/screenshots 54 | 55 | #Code Injection 56 | # 57 | # After new code Injection tools there's a generated folder /iOSInjectionProject 58 | # https://github.com/johnno1962/injectionforxcode 59 | 60 | iOSInjectionProject/ 61 | -------------------------------------------------------------------------------- /JGCALayer.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer.gif -------------------------------------------------------------------------------- /JGCALayer/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/.DS_Store -------------------------------------------------------------------------------- /JGCALayer/JGCALayer.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1A0D4BC51D84FBAE00BD341D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A0D4BC41D84FBAE00BD341D /* main.m */; }; 11 | 1A0D4BCE1D84FBAE00BD341D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1A0D4BCC1D84FBAE00BD341D /* Main.storyboard */; }; 12 | 1A0D4BD01D84FBAE00BD341D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1A0D4BCF1D84FBAE00BD341D /* Assets.xcassets */; }; 13 | 1A0D4BD31D84FBAE00BD341D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1A0D4BD11D84FBAE00BD341D /* LaunchScreen.storyboard */; }; 14 | 1A0D4BDE1D84FBAE00BD341D /* JGCALayerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A0D4BDD1D84FBAE00BD341D /* JGCALayerTests.m */; }; 15 | 1A0D4BE91D84FBAE00BD341D /* JGCALayerUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A0D4BE81D84FBAE00BD341D /* JGCALayerUITests.m */; }; 16 | 1A0D4BFB1D84FC0000BD341D /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A0D4BF81D84FC0000BD341D /* AppDelegate.m */; }; 17 | 1A0D4BFE1D84FC4800BD341D /* JGRootTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A0D4BFD1D84FC4800BD341D /* JGRootTableViewController.m */; }; 18 | 1A0D4C011D84FFE000BD341D /* JGBasicViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A0D4C001D84FFE000BD341D /* JGBasicViewController.m */; }; 19 | 1A0D4C041D852A6300BD341D /* JGClockViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A0D4C031D852A6300BD341D /* JGClockViewController.m */; }; 20 | 1A0D4C071D85386D00BD341D /* JGHeartBeatAndTranstionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A0D4C061D85386D00BD341D /* JGHeartBeatAndTranstionController.m */; }; 21 | 1A0D4C0A1D85422400BD341D /* JGRotaryTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A0D4C091D85422400BD341D /* JGRotaryTableViewController.m */; }; 22 | 1A0D4C0D1D85434700BD341D /* JGWheelView.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A0D4C0C1D85434700BD341D /* JGWheelView.m */; }; 23 | 1A0D4C0F1D85435200BD341D /* JGWheelView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1A0D4C0E1D85435200BD341D /* JGWheelView.xib */; }; 24 | 1A0D4C121D854EB000BD341D /* JGWheelsBtn.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A0D4C111D854EB000BD341D /* JGWheelsBtn.m */; }; 25 | 1AF153D21D8633F3005D63DC /* JGPicFoldViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AF153D11D8633F3005D63DC /* JGPicFoldViewController.m */; }; 26 | 1AF153D51D863CE7005D63DC /* JGMusicVibrationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AF153D41D863CE7005D63DC /* JGMusicVibrationController.m */; }; 27 | 1AF153D81D8644A4005D63DC /* JGReflectionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AF153D71D8644A4005D63DC /* JGReflectionController.m */; }; 28 | 1AF153DB1D8645FA005D63DC /* JGReflectionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AF153DA1D8645FA005D63DC /* JGReflectionView.m */; }; 29 | 1AF153DE1D864C44005D63DC /* JGParticleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AF153DD1D864C44005D63DC /* JGParticleViewController.m */; }; 30 | 1AF153E41D864EC3005D63DC /* JGParticleView.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AF153E31D864EC3005D63DC /* JGParticleView.m */; }; 31 | 1AF153E71D865454005D63DC /* JGBageValueController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AF153E61D865454005D63DC /* JGBageValueController.m */; }; 32 | 1AF153ED1D865531005D63DC /* JGBageValue.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AF153EC1D865531005D63DC /* JGBageValue.m */; }; 33 | 1AF153F01D868257005D63DC /* JGWeiBoAniController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AF153EF1D868257005D63DC /* JGWeiBoAniController.m */; }; 34 | 1AF153F31D86832D005D63DC /* JGWeiBoComposeController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AF153F21D86832D005D63DC /* JGWeiBoComposeController.m */; }; 35 | 1AF153F71D868383005D63DC /* JGMuneItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AF153F61D868383005D63DC /* JGMuneItem.m */; }; 36 | 1AF153FA1D868DA6005D63DC /* JGItemBtn.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AF153F91D868DA6005D63DC /* JGItemBtn.m */; }; 37 | 1AF153FD1D8691E3005D63DC /* JGMosaicController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AF153FC1D8691E3005D63DC /* JGMosaicController.m */; }; 38 | 1AF154001D869312005D63DC /* JGMosaicView.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AF153FF1D869312005D63DC /* JGMosaicView.m */; }; 39 | 1AF154041D8699DE005D63DC /* UIImage+JGMosaic.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AF154031D8699DE005D63DC /* UIImage+JGMosaic.m */; }; 40 | /* End PBXBuildFile section */ 41 | 42 | /* Begin PBXContainerItemProxy section */ 43 | 1A0D4BDA1D84FBAE00BD341D /* PBXContainerItemProxy */ = { 44 | isa = PBXContainerItemProxy; 45 | containerPortal = 1A0D4BB81D84FBAE00BD341D /* Project object */; 46 | proxyType = 1; 47 | remoteGlobalIDString = 1A0D4BBF1D84FBAE00BD341D; 48 | remoteInfo = JGCALayer; 49 | }; 50 | 1A0D4BE51D84FBAE00BD341D /* PBXContainerItemProxy */ = { 51 | isa = PBXContainerItemProxy; 52 | containerPortal = 1A0D4BB81D84FBAE00BD341D /* Project object */; 53 | proxyType = 1; 54 | remoteGlobalIDString = 1A0D4BBF1D84FBAE00BD341D; 55 | remoteInfo = JGCALayer; 56 | }; 57 | /* End PBXContainerItemProxy section */ 58 | 59 | /* Begin PBXFileReference section */ 60 | 1A0D4BC01D84FBAE00BD341D /* JGCALayer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = JGCALayer.app; sourceTree = BUILT_PRODUCTS_DIR; }; 61 | 1A0D4BC41D84FBAE00BD341D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 62 | 1A0D4BCD1D84FBAE00BD341D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 63 | 1A0D4BCF1D84FBAE00BD341D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 64 | 1A0D4BD21D84FBAE00BD341D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 65 | 1A0D4BD41D84FBAE00BD341D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 66 | 1A0D4BD91D84FBAE00BD341D /* JGCALayerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = JGCALayerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 67 | 1A0D4BDD1D84FBAE00BD341D /* JGCALayerTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = JGCALayerTests.m; sourceTree = ""; }; 68 | 1A0D4BDF1D84FBAE00BD341D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 69 | 1A0D4BE41D84FBAE00BD341D /* JGCALayerUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = JGCALayerUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 70 | 1A0D4BE81D84FBAE00BD341D /* JGCALayerUITests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = JGCALayerUITests.m; sourceTree = ""; }; 71 | 1A0D4BEA1D84FBAE00BD341D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 72 | 1A0D4BF71D84FC0000BD341D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 73 | 1A0D4BF81D84FC0000BD341D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 74 | 1A0D4BFC1D84FC4800BD341D /* JGRootTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JGRootTableViewController.h; sourceTree = ""; }; 75 | 1A0D4BFD1D84FC4800BD341D /* JGRootTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JGRootTableViewController.m; sourceTree = ""; }; 76 | 1A0D4BFF1D84FFE000BD341D /* JGBasicViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JGBasicViewController.h; sourceTree = ""; }; 77 | 1A0D4C001D84FFE000BD341D /* JGBasicViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JGBasicViewController.m; sourceTree = ""; }; 78 | 1A0D4C021D852A6300BD341D /* JGClockViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JGClockViewController.h; sourceTree = ""; }; 79 | 1A0D4C031D852A6300BD341D /* JGClockViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JGClockViewController.m; sourceTree = ""; }; 80 | 1A0D4C051D85386D00BD341D /* JGHeartBeatAndTranstionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JGHeartBeatAndTranstionController.h; sourceTree = ""; }; 81 | 1A0D4C061D85386D00BD341D /* JGHeartBeatAndTranstionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JGHeartBeatAndTranstionController.m; sourceTree = ""; }; 82 | 1A0D4C081D85422400BD341D /* JGRotaryTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JGRotaryTableViewController.h; sourceTree = ""; }; 83 | 1A0D4C091D85422400BD341D /* JGRotaryTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JGRotaryTableViewController.m; sourceTree = ""; }; 84 | 1A0D4C0B1D85434700BD341D /* JGWheelView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JGWheelView.h; sourceTree = ""; }; 85 | 1A0D4C0C1D85434700BD341D /* JGWheelView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JGWheelView.m; sourceTree = ""; }; 86 | 1A0D4C0E1D85435200BD341D /* JGWheelView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = JGWheelView.xib; sourceTree = ""; }; 87 | 1A0D4C101D854EB000BD341D /* JGWheelsBtn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JGWheelsBtn.h; sourceTree = ""; }; 88 | 1A0D4C111D854EB000BD341D /* JGWheelsBtn.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JGWheelsBtn.m; sourceTree = ""; }; 89 | 1AF153D01D8633F3005D63DC /* JGPicFoldViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JGPicFoldViewController.h; sourceTree = ""; }; 90 | 1AF153D11D8633F3005D63DC /* JGPicFoldViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JGPicFoldViewController.m; sourceTree = ""; }; 91 | 1AF153D31D863CE7005D63DC /* JGMusicVibrationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JGMusicVibrationController.h; sourceTree = ""; }; 92 | 1AF153D41D863CE7005D63DC /* JGMusicVibrationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JGMusicVibrationController.m; sourceTree = ""; }; 93 | 1AF153D61D8644A4005D63DC /* JGReflectionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JGReflectionController.h; sourceTree = ""; }; 94 | 1AF153D71D8644A4005D63DC /* JGReflectionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JGReflectionController.m; sourceTree = ""; }; 95 | 1AF153D91D8645FA005D63DC /* JGReflectionView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JGReflectionView.h; sourceTree = ""; }; 96 | 1AF153DA1D8645FA005D63DC /* JGReflectionView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JGReflectionView.m; sourceTree = ""; }; 97 | 1AF153DC1D864C44005D63DC /* JGParticleViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JGParticleViewController.h; sourceTree = ""; }; 98 | 1AF153DD1D864C44005D63DC /* JGParticleViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JGParticleViewController.m; sourceTree = ""; }; 99 | 1AF153E21D864EC3005D63DC /* JGParticleView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JGParticleView.h; sourceTree = ""; }; 100 | 1AF153E31D864EC3005D63DC /* JGParticleView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JGParticleView.m; sourceTree = ""; }; 101 | 1AF153E51D865454005D63DC /* JGBageValueController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JGBageValueController.h; sourceTree = ""; }; 102 | 1AF153E61D865454005D63DC /* JGBageValueController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JGBageValueController.m; sourceTree = ""; }; 103 | 1AF153EB1D865531005D63DC /* JGBageValue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JGBageValue.h; sourceTree = ""; }; 104 | 1AF153EC1D865531005D63DC /* JGBageValue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JGBageValue.m; sourceTree = ""; }; 105 | 1AF153EE1D868257005D63DC /* JGWeiBoAniController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JGWeiBoAniController.h; sourceTree = ""; }; 106 | 1AF153EF1D868257005D63DC /* JGWeiBoAniController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JGWeiBoAniController.m; sourceTree = ""; }; 107 | 1AF153F11D86832D005D63DC /* JGWeiBoComposeController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JGWeiBoComposeController.h; sourceTree = ""; }; 108 | 1AF153F21D86832D005D63DC /* JGWeiBoComposeController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JGWeiBoComposeController.m; sourceTree = ""; }; 109 | 1AF153F51D868383005D63DC /* JGMuneItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JGMuneItem.h; sourceTree = ""; }; 110 | 1AF153F61D868383005D63DC /* JGMuneItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JGMuneItem.m; sourceTree = ""; }; 111 | 1AF153F81D868DA6005D63DC /* JGItemBtn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JGItemBtn.h; sourceTree = ""; }; 112 | 1AF153F91D868DA6005D63DC /* JGItemBtn.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JGItemBtn.m; sourceTree = ""; }; 113 | 1AF153FB1D8691E3005D63DC /* JGMosaicController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JGMosaicController.h; sourceTree = ""; }; 114 | 1AF153FC1D8691E3005D63DC /* JGMosaicController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JGMosaicController.m; sourceTree = ""; }; 115 | 1AF153FE1D869312005D63DC /* JGMosaicView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JGMosaicView.h; sourceTree = ""; }; 116 | 1AF153FF1D869312005D63DC /* JGMosaicView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JGMosaicView.m; sourceTree = ""; }; 117 | 1AF154021D8699DE005D63DC /* UIImage+JGMosaic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+JGMosaic.h"; sourceTree = ""; }; 118 | 1AF154031D8699DE005D63DC /* UIImage+JGMosaic.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImage+JGMosaic.m"; sourceTree = ""; }; 119 | /* End PBXFileReference section */ 120 | 121 | /* Begin PBXFrameworksBuildPhase section */ 122 | 1A0D4BBD1D84FBAE00BD341D /* Frameworks */ = { 123 | isa = PBXFrameworksBuildPhase; 124 | buildActionMask = 2147483647; 125 | files = ( 126 | ); 127 | runOnlyForDeploymentPostprocessing = 0; 128 | }; 129 | 1A0D4BD61D84FBAE00BD341D /* Frameworks */ = { 130 | isa = PBXFrameworksBuildPhase; 131 | buildActionMask = 2147483647; 132 | files = ( 133 | ); 134 | runOnlyForDeploymentPostprocessing = 0; 135 | }; 136 | 1A0D4BE11D84FBAE00BD341D /* Frameworks */ = { 137 | isa = PBXFrameworksBuildPhase; 138 | buildActionMask = 2147483647; 139 | files = ( 140 | ); 141 | runOnlyForDeploymentPostprocessing = 0; 142 | }; 143 | /* End PBXFrameworksBuildPhase section */ 144 | 145 | /* Begin PBXGroup section */ 146 | 1A0D4BB71D84FBAE00BD341D = { 147 | isa = PBXGroup; 148 | children = ( 149 | 1A0D4BC21D84FBAE00BD341D /* JGCALayer */, 150 | 1A0D4BDC1D84FBAE00BD341D /* JGCALayerTests */, 151 | 1A0D4BE71D84FBAE00BD341D /* JGCALayerUITests */, 152 | 1A0D4BC11D84FBAE00BD341D /* Products */, 153 | ); 154 | sourceTree = ""; 155 | }; 156 | 1A0D4BC11D84FBAE00BD341D /* Products */ = { 157 | isa = PBXGroup; 158 | children = ( 159 | 1A0D4BC01D84FBAE00BD341D /* JGCALayer.app */, 160 | 1A0D4BD91D84FBAE00BD341D /* JGCALayerTests.xctest */, 161 | 1A0D4BE41D84FBAE00BD341D /* JGCALayerUITests.xctest */, 162 | ); 163 | name = Products; 164 | sourceTree = ""; 165 | }; 166 | 1A0D4BC21D84FBAE00BD341D /* JGCALayer */ = { 167 | isa = PBXGroup; 168 | children = ( 169 | 1AF154011D8699AE005D63DC /* CateGorys */, 170 | 1A0D4BF61D84FC0000BD341D /* Apps */, 171 | 1A0D4BF91D84FC0000BD341D /* Controllers */, 172 | 1A0D4BFA1D84FC0000BD341D /* Views */, 173 | 1AF153F41D868356005D63DC /* Models */, 174 | 1A0D4BC31D84FBAE00BD341D /* Supporting Files */, 175 | ); 176 | path = JGCALayer; 177 | sourceTree = ""; 178 | }; 179 | 1A0D4BC31D84FBAE00BD341D /* Supporting Files */ = { 180 | isa = PBXGroup; 181 | children = ( 182 | 1A0D4BCC1D84FBAE00BD341D /* Main.storyboard */, 183 | 1A0D4BCF1D84FBAE00BD341D /* Assets.xcassets */, 184 | 1A0D4BD11D84FBAE00BD341D /* LaunchScreen.storyboard */, 185 | 1A0D4BD41D84FBAE00BD341D /* Info.plist */, 186 | 1A0D4BC41D84FBAE00BD341D /* main.m */, 187 | ); 188 | name = "Supporting Files"; 189 | sourceTree = ""; 190 | }; 191 | 1A0D4BDC1D84FBAE00BD341D /* JGCALayerTests */ = { 192 | isa = PBXGroup; 193 | children = ( 194 | 1A0D4BDD1D84FBAE00BD341D /* JGCALayerTests.m */, 195 | 1A0D4BDF1D84FBAE00BD341D /* Info.plist */, 196 | ); 197 | path = JGCALayerTests; 198 | sourceTree = ""; 199 | }; 200 | 1A0D4BE71D84FBAE00BD341D /* JGCALayerUITests */ = { 201 | isa = PBXGroup; 202 | children = ( 203 | 1A0D4BE81D84FBAE00BD341D /* JGCALayerUITests.m */, 204 | 1A0D4BEA1D84FBAE00BD341D /* Info.plist */, 205 | ); 206 | path = JGCALayerUITests; 207 | sourceTree = ""; 208 | }; 209 | 1A0D4BF61D84FC0000BD341D /* Apps */ = { 210 | isa = PBXGroup; 211 | children = ( 212 | 1A0D4BF71D84FC0000BD341D /* AppDelegate.h */, 213 | 1A0D4BF81D84FC0000BD341D /* AppDelegate.m */, 214 | ); 215 | path = Apps; 216 | sourceTree = ""; 217 | }; 218 | 1A0D4BF91D84FC0000BD341D /* Controllers */ = { 219 | isa = PBXGroup; 220 | children = ( 221 | 1A0D4BFC1D84FC4800BD341D /* JGRootTableViewController.h */, 222 | 1A0D4BFD1D84FC4800BD341D /* JGRootTableViewController.m */, 223 | 1A0D4BFF1D84FFE000BD341D /* JGBasicViewController.h */, 224 | 1A0D4C001D84FFE000BD341D /* JGBasicViewController.m */, 225 | 1A0D4C021D852A6300BD341D /* JGClockViewController.h */, 226 | 1A0D4C031D852A6300BD341D /* JGClockViewController.m */, 227 | 1A0D4C051D85386D00BD341D /* JGHeartBeatAndTranstionController.h */, 228 | 1A0D4C061D85386D00BD341D /* JGHeartBeatAndTranstionController.m */, 229 | 1A0D4C081D85422400BD341D /* JGRotaryTableViewController.h */, 230 | 1A0D4C091D85422400BD341D /* JGRotaryTableViewController.m */, 231 | 1AF153D01D8633F3005D63DC /* JGPicFoldViewController.h */, 232 | 1AF153D11D8633F3005D63DC /* JGPicFoldViewController.m */, 233 | 1AF153D31D863CE7005D63DC /* JGMusicVibrationController.h */, 234 | 1AF153D41D863CE7005D63DC /* JGMusicVibrationController.m */, 235 | 1AF153D61D8644A4005D63DC /* JGReflectionController.h */, 236 | 1AF153D71D8644A4005D63DC /* JGReflectionController.m */, 237 | 1AF153DC1D864C44005D63DC /* JGParticleViewController.h */, 238 | 1AF153DD1D864C44005D63DC /* JGParticleViewController.m */, 239 | 1AF153E51D865454005D63DC /* JGBageValueController.h */, 240 | 1AF153E61D865454005D63DC /* JGBageValueController.m */, 241 | 1AF153EE1D868257005D63DC /* JGWeiBoAniController.h */, 242 | 1AF153EF1D868257005D63DC /* JGWeiBoAniController.m */, 243 | 1AF153F11D86832D005D63DC /* JGWeiBoComposeController.h */, 244 | 1AF153F21D86832D005D63DC /* JGWeiBoComposeController.m */, 245 | 1AF153FB1D8691E3005D63DC /* JGMosaicController.h */, 246 | 1AF153FC1D8691E3005D63DC /* JGMosaicController.m */, 247 | ); 248 | path = Controllers; 249 | sourceTree = ""; 250 | }; 251 | 1A0D4BFA1D84FC0000BD341D /* Views */ = { 252 | isa = PBXGroup; 253 | children = ( 254 | 1A0D4C0B1D85434700BD341D /* JGWheelView.h */, 255 | 1A0D4C0C1D85434700BD341D /* JGWheelView.m */, 256 | 1A0D4C0E1D85435200BD341D /* JGWheelView.xib */, 257 | 1A0D4C101D854EB000BD341D /* JGWheelsBtn.h */, 258 | 1A0D4C111D854EB000BD341D /* JGWheelsBtn.m */, 259 | 1AF153D91D8645FA005D63DC /* JGReflectionView.h */, 260 | 1AF153DA1D8645FA005D63DC /* JGReflectionView.m */, 261 | 1AF153E21D864EC3005D63DC /* JGParticleView.h */, 262 | 1AF153E31D864EC3005D63DC /* JGParticleView.m */, 263 | 1AF153EB1D865531005D63DC /* JGBageValue.h */, 264 | 1AF153EC1D865531005D63DC /* JGBageValue.m */, 265 | 1AF153F81D868DA6005D63DC /* JGItemBtn.h */, 266 | 1AF153F91D868DA6005D63DC /* JGItemBtn.m */, 267 | 1AF153FE1D869312005D63DC /* JGMosaicView.h */, 268 | 1AF153FF1D869312005D63DC /* JGMosaicView.m */, 269 | ); 270 | path = Views; 271 | sourceTree = ""; 272 | }; 273 | 1AF153F41D868356005D63DC /* Models */ = { 274 | isa = PBXGroup; 275 | children = ( 276 | 1AF153F51D868383005D63DC /* JGMuneItem.h */, 277 | 1AF153F61D868383005D63DC /* JGMuneItem.m */, 278 | ); 279 | path = Models; 280 | sourceTree = ""; 281 | }; 282 | 1AF154011D8699AE005D63DC /* CateGorys */ = { 283 | isa = PBXGroup; 284 | children = ( 285 | 1AF154021D8699DE005D63DC /* UIImage+JGMosaic.h */, 286 | 1AF154031D8699DE005D63DC /* UIImage+JGMosaic.m */, 287 | ); 288 | path = CateGorys; 289 | sourceTree = ""; 290 | }; 291 | /* End PBXGroup section */ 292 | 293 | /* Begin PBXNativeTarget section */ 294 | 1A0D4BBF1D84FBAE00BD341D /* JGCALayer */ = { 295 | isa = PBXNativeTarget; 296 | buildConfigurationList = 1A0D4BED1D84FBAE00BD341D /* Build configuration list for PBXNativeTarget "JGCALayer" */; 297 | buildPhases = ( 298 | 1A0D4BBC1D84FBAE00BD341D /* Sources */, 299 | 1A0D4BBD1D84FBAE00BD341D /* Frameworks */, 300 | 1A0D4BBE1D84FBAE00BD341D /* Resources */, 301 | ); 302 | buildRules = ( 303 | ); 304 | dependencies = ( 305 | ); 306 | name = JGCALayer; 307 | productName = JGCALayer; 308 | productReference = 1A0D4BC01D84FBAE00BD341D /* JGCALayer.app */; 309 | productType = "com.apple.product-type.application"; 310 | }; 311 | 1A0D4BD81D84FBAE00BD341D /* JGCALayerTests */ = { 312 | isa = PBXNativeTarget; 313 | buildConfigurationList = 1A0D4BF01D84FBAE00BD341D /* Build configuration list for PBXNativeTarget "JGCALayerTests" */; 314 | buildPhases = ( 315 | 1A0D4BD51D84FBAE00BD341D /* Sources */, 316 | 1A0D4BD61D84FBAE00BD341D /* Frameworks */, 317 | 1A0D4BD71D84FBAE00BD341D /* Resources */, 318 | ); 319 | buildRules = ( 320 | ); 321 | dependencies = ( 322 | 1A0D4BDB1D84FBAE00BD341D /* PBXTargetDependency */, 323 | ); 324 | name = JGCALayerTests; 325 | productName = JGCALayerTests; 326 | productReference = 1A0D4BD91D84FBAE00BD341D /* JGCALayerTests.xctest */; 327 | productType = "com.apple.product-type.bundle.unit-test"; 328 | }; 329 | 1A0D4BE31D84FBAE00BD341D /* JGCALayerUITests */ = { 330 | isa = PBXNativeTarget; 331 | buildConfigurationList = 1A0D4BF31D84FBAE00BD341D /* Build configuration list for PBXNativeTarget "JGCALayerUITests" */; 332 | buildPhases = ( 333 | 1A0D4BE01D84FBAE00BD341D /* Sources */, 334 | 1A0D4BE11D84FBAE00BD341D /* Frameworks */, 335 | 1A0D4BE21D84FBAE00BD341D /* Resources */, 336 | ); 337 | buildRules = ( 338 | ); 339 | dependencies = ( 340 | 1A0D4BE61D84FBAE00BD341D /* PBXTargetDependency */, 341 | ); 342 | name = JGCALayerUITests; 343 | productName = JGCALayerUITests; 344 | productReference = 1A0D4BE41D84FBAE00BD341D /* JGCALayerUITests.xctest */; 345 | productType = "com.apple.product-type.bundle.ui-testing"; 346 | }; 347 | /* End PBXNativeTarget section */ 348 | 349 | /* Begin PBXProject section */ 350 | 1A0D4BB81D84FBAE00BD341D /* Project object */ = { 351 | isa = PBXProject; 352 | attributes = { 353 | CLASSPREFIX = JG; 354 | LastUpgradeCheck = 0730; 355 | ORGANIZATIONNAME = stkcctv; 356 | TargetAttributes = { 357 | 1A0D4BBF1D84FBAE00BD341D = { 358 | CreatedOnToolsVersion = 7.3.1; 359 | DevelopmentTeam = ND8RLZC6KU; 360 | }; 361 | 1A0D4BD81D84FBAE00BD341D = { 362 | CreatedOnToolsVersion = 7.3.1; 363 | TestTargetID = 1A0D4BBF1D84FBAE00BD341D; 364 | }; 365 | 1A0D4BE31D84FBAE00BD341D = { 366 | CreatedOnToolsVersion = 7.3.1; 367 | TestTargetID = 1A0D4BBF1D84FBAE00BD341D; 368 | }; 369 | }; 370 | }; 371 | buildConfigurationList = 1A0D4BBB1D84FBAE00BD341D /* Build configuration list for PBXProject "JGCALayer" */; 372 | compatibilityVersion = "Xcode 3.2"; 373 | developmentRegion = English; 374 | hasScannedForEncodings = 0; 375 | knownRegions = ( 376 | en, 377 | Base, 378 | ); 379 | mainGroup = 1A0D4BB71D84FBAE00BD341D; 380 | productRefGroup = 1A0D4BC11D84FBAE00BD341D /* Products */; 381 | projectDirPath = ""; 382 | projectRoot = ""; 383 | targets = ( 384 | 1A0D4BBF1D84FBAE00BD341D /* JGCALayer */, 385 | 1A0D4BD81D84FBAE00BD341D /* JGCALayerTests */, 386 | 1A0D4BE31D84FBAE00BD341D /* JGCALayerUITests */, 387 | ); 388 | }; 389 | /* End PBXProject section */ 390 | 391 | /* Begin PBXResourcesBuildPhase section */ 392 | 1A0D4BBE1D84FBAE00BD341D /* Resources */ = { 393 | isa = PBXResourcesBuildPhase; 394 | buildActionMask = 2147483647; 395 | files = ( 396 | 1A0D4BD31D84FBAE00BD341D /* LaunchScreen.storyboard in Resources */, 397 | 1A0D4C0F1D85435200BD341D /* JGWheelView.xib in Resources */, 398 | 1A0D4BD01D84FBAE00BD341D /* Assets.xcassets in Resources */, 399 | 1A0D4BCE1D84FBAE00BD341D /* Main.storyboard in Resources */, 400 | ); 401 | runOnlyForDeploymentPostprocessing = 0; 402 | }; 403 | 1A0D4BD71D84FBAE00BD341D /* Resources */ = { 404 | isa = PBXResourcesBuildPhase; 405 | buildActionMask = 2147483647; 406 | files = ( 407 | ); 408 | runOnlyForDeploymentPostprocessing = 0; 409 | }; 410 | 1A0D4BE21D84FBAE00BD341D /* Resources */ = { 411 | isa = PBXResourcesBuildPhase; 412 | buildActionMask = 2147483647; 413 | files = ( 414 | ); 415 | runOnlyForDeploymentPostprocessing = 0; 416 | }; 417 | /* End PBXResourcesBuildPhase section */ 418 | 419 | /* Begin PBXSourcesBuildPhase section */ 420 | 1A0D4BBC1D84FBAE00BD341D /* Sources */ = { 421 | isa = PBXSourcesBuildPhase; 422 | buildActionMask = 2147483647; 423 | files = ( 424 | 1AF153F71D868383005D63DC /* JGMuneItem.m in Sources */, 425 | 1A0D4C011D84FFE000BD341D /* JGBasicViewController.m in Sources */, 426 | 1AF154001D869312005D63DC /* JGMosaicView.m in Sources */, 427 | 1A0D4C0D1D85434700BD341D /* JGWheelView.m in Sources */, 428 | 1A0D4BFB1D84FC0000BD341D /* AppDelegate.m in Sources */, 429 | 1AF153F31D86832D005D63DC /* JGWeiBoComposeController.m in Sources */, 430 | 1AF154041D8699DE005D63DC /* UIImage+JGMosaic.m in Sources */, 431 | 1AF153E71D865454005D63DC /* JGBageValueController.m in Sources */, 432 | 1AF153E41D864EC3005D63DC /* JGParticleView.m in Sources */, 433 | 1AF153DE1D864C44005D63DC /* JGParticleViewController.m in Sources */, 434 | 1AF153FD1D8691E3005D63DC /* JGMosaicController.m in Sources */, 435 | 1A0D4BC51D84FBAE00BD341D /* main.m in Sources */, 436 | 1A0D4C121D854EB000BD341D /* JGWheelsBtn.m in Sources */, 437 | 1AF153F01D868257005D63DC /* JGWeiBoAniController.m in Sources */, 438 | 1A0D4C041D852A6300BD341D /* JGClockViewController.m in Sources */, 439 | 1A0D4C071D85386D00BD341D /* JGHeartBeatAndTranstionController.m in Sources */, 440 | 1AF153ED1D865531005D63DC /* JGBageValue.m in Sources */, 441 | 1AF153D81D8644A4005D63DC /* JGReflectionController.m in Sources */, 442 | 1A0D4C0A1D85422400BD341D /* JGRotaryTableViewController.m in Sources */, 443 | 1AF153DB1D8645FA005D63DC /* JGReflectionView.m in Sources */, 444 | 1A0D4BFE1D84FC4800BD341D /* JGRootTableViewController.m in Sources */, 445 | 1AF153D51D863CE7005D63DC /* JGMusicVibrationController.m in Sources */, 446 | 1AF153FA1D868DA6005D63DC /* JGItemBtn.m in Sources */, 447 | 1AF153D21D8633F3005D63DC /* JGPicFoldViewController.m in Sources */, 448 | ); 449 | runOnlyForDeploymentPostprocessing = 0; 450 | }; 451 | 1A0D4BD51D84FBAE00BD341D /* Sources */ = { 452 | isa = PBXSourcesBuildPhase; 453 | buildActionMask = 2147483647; 454 | files = ( 455 | 1A0D4BDE1D84FBAE00BD341D /* JGCALayerTests.m in Sources */, 456 | ); 457 | runOnlyForDeploymentPostprocessing = 0; 458 | }; 459 | 1A0D4BE01D84FBAE00BD341D /* Sources */ = { 460 | isa = PBXSourcesBuildPhase; 461 | buildActionMask = 2147483647; 462 | files = ( 463 | 1A0D4BE91D84FBAE00BD341D /* JGCALayerUITests.m in Sources */, 464 | ); 465 | runOnlyForDeploymentPostprocessing = 0; 466 | }; 467 | /* End PBXSourcesBuildPhase section */ 468 | 469 | /* Begin PBXTargetDependency section */ 470 | 1A0D4BDB1D84FBAE00BD341D /* PBXTargetDependency */ = { 471 | isa = PBXTargetDependency; 472 | target = 1A0D4BBF1D84FBAE00BD341D /* JGCALayer */; 473 | targetProxy = 1A0D4BDA1D84FBAE00BD341D /* PBXContainerItemProxy */; 474 | }; 475 | 1A0D4BE61D84FBAE00BD341D /* PBXTargetDependency */ = { 476 | isa = PBXTargetDependency; 477 | target = 1A0D4BBF1D84FBAE00BD341D /* JGCALayer */; 478 | targetProxy = 1A0D4BE51D84FBAE00BD341D /* PBXContainerItemProxy */; 479 | }; 480 | /* End PBXTargetDependency section */ 481 | 482 | /* Begin PBXVariantGroup section */ 483 | 1A0D4BCC1D84FBAE00BD341D /* Main.storyboard */ = { 484 | isa = PBXVariantGroup; 485 | children = ( 486 | 1A0D4BCD1D84FBAE00BD341D /* Base */, 487 | ); 488 | name = Main.storyboard; 489 | sourceTree = ""; 490 | }; 491 | 1A0D4BD11D84FBAE00BD341D /* LaunchScreen.storyboard */ = { 492 | isa = PBXVariantGroup; 493 | children = ( 494 | 1A0D4BD21D84FBAE00BD341D /* Base */, 495 | ); 496 | name = LaunchScreen.storyboard; 497 | sourceTree = ""; 498 | }; 499 | /* End PBXVariantGroup section */ 500 | 501 | /* Begin XCBuildConfiguration section */ 502 | 1A0D4BEB1D84FBAE00BD341D /* Debug */ = { 503 | isa = XCBuildConfiguration; 504 | buildSettings = { 505 | ALWAYS_SEARCH_USER_PATHS = NO; 506 | CLANG_ANALYZER_NONNULL = YES; 507 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 508 | CLANG_CXX_LIBRARY = "libc++"; 509 | CLANG_ENABLE_MODULES = YES; 510 | CLANG_ENABLE_OBJC_ARC = YES; 511 | CLANG_WARN_BOOL_CONVERSION = YES; 512 | CLANG_WARN_CONSTANT_CONVERSION = YES; 513 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 514 | CLANG_WARN_EMPTY_BODY = YES; 515 | CLANG_WARN_ENUM_CONVERSION = YES; 516 | CLANG_WARN_INT_CONVERSION = YES; 517 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 518 | CLANG_WARN_UNREACHABLE_CODE = YES; 519 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 520 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 521 | COPY_PHASE_STRIP = NO; 522 | DEBUG_INFORMATION_FORMAT = dwarf; 523 | ENABLE_STRICT_OBJC_MSGSEND = YES; 524 | ENABLE_TESTABILITY = YES; 525 | GCC_C_LANGUAGE_STANDARD = gnu99; 526 | GCC_DYNAMIC_NO_PIC = NO; 527 | GCC_NO_COMMON_BLOCKS = YES; 528 | GCC_OPTIMIZATION_LEVEL = 0; 529 | GCC_PREPROCESSOR_DEFINITIONS = ( 530 | "DEBUG=1", 531 | "$(inherited)", 532 | ); 533 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 534 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 535 | GCC_WARN_UNDECLARED_SELECTOR = YES; 536 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 537 | GCC_WARN_UNUSED_FUNCTION = YES; 538 | GCC_WARN_UNUSED_VARIABLE = YES; 539 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 540 | MTL_ENABLE_DEBUG_INFO = YES; 541 | ONLY_ACTIVE_ARCH = YES; 542 | SDKROOT = iphoneos; 543 | TARGETED_DEVICE_FAMILY = "1,2"; 544 | }; 545 | name = Debug; 546 | }; 547 | 1A0D4BEC1D84FBAE00BD341D /* Release */ = { 548 | isa = XCBuildConfiguration; 549 | buildSettings = { 550 | ALWAYS_SEARCH_USER_PATHS = NO; 551 | CLANG_ANALYZER_NONNULL = YES; 552 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 553 | CLANG_CXX_LIBRARY = "libc++"; 554 | CLANG_ENABLE_MODULES = YES; 555 | CLANG_ENABLE_OBJC_ARC = YES; 556 | CLANG_WARN_BOOL_CONVERSION = YES; 557 | CLANG_WARN_CONSTANT_CONVERSION = YES; 558 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 559 | CLANG_WARN_EMPTY_BODY = YES; 560 | CLANG_WARN_ENUM_CONVERSION = YES; 561 | CLANG_WARN_INT_CONVERSION = YES; 562 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 563 | CLANG_WARN_UNREACHABLE_CODE = YES; 564 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 565 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 566 | COPY_PHASE_STRIP = NO; 567 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 568 | ENABLE_NS_ASSERTIONS = NO; 569 | ENABLE_STRICT_OBJC_MSGSEND = YES; 570 | GCC_C_LANGUAGE_STANDARD = gnu99; 571 | GCC_NO_COMMON_BLOCKS = YES; 572 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 573 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 574 | GCC_WARN_UNDECLARED_SELECTOR = YES; 575 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 576 | GCC_WARN_UNUSED_FUNCTION = YES; 577 | GCC_WARN_UNUSED_VARIABLE = YES; 578 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 579 | MTL_ENABLE_DEBUG_INFO = NO; 580 | SDKROOT = iphoneos; 581 | TARGETED_DEVICE_FAMILY = "1,2"; 582 | VALIDATE_PRODUCT = YES; 583 | }; 584 | name = Release; 585 | }; 586 | 1A0D4BEE1D84FBAE00BD341D /* Debug */ = { 587 | isa = XCBuildConfiguration; 588 | buildSettings = { 589 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 590 | CODE_SIGN_IDENTITY = "iPhone Developer"; 591 | INFOPLIST_FILE = JGCALayer/Info.plist; 592 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 593 | PRODUCT_BUNDLE_IDENTIFIER = com.shengHanDL.JGCALayer; 594 | PRODUCT_NAME = "$(TARGET_NAME)"; 595 | }; 596 | name = Debug; 597 | }; 598 | 1A0D4BEF1D84FBAE00BD341D /* Release */ = { 599 | isa = XCBuildConfiguration; 600 | buildSettings = { 601 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 602 | CODE_SIGN_IDENTITY = "iPhone Developer"; 603 | INFOPLIST_FILE = JGCALayer/Info.plist; 604 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 605 | PRODUCT_BUNDLE_IDENTIFIER = com.shengHanDL.JGCALayer; 606 | PRODUCT_NAME = "$(TARGET_NAME)"; 607 | }; 608 | name = Release; 609 | }; 610 | 1A0D4BF11D84FBAE00BD341D /* Debug */ = { 611 | isa = XCBuildConfiguration; 612 | buildSettings = { 613 | BUNDLE_LOADER = "$(TEST_HOST)"; 614 | INFOPLIST_FILE = JGCALayerTests/Info.plist; 615 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 616 | PRODUCT_BUNDLE_IDENTIFIER = com.shengHanDL.JGCALayerTests; 617 | PRODUCT_NAME = "$(TARGET_NAME)"; 618 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/JGCALayer.app/JGCALayer"; 619 | }; 620 | name = Debug; 621 | }; 622 | 1A0D4BF21D84FBAE00BD341D /* Release */ = { 623 | isa = XCBuildConfiguration; 624 | buildSettings = { 625 | BUNDLE_LOADER = "$(TEST_HOST)"; 626 | INFOPLIST_FILE = JGCALayerTests/Info.plist; 627 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 628 | PRODUCT_BUNDLE_IDENTIFIER = com.shengHanDL.JGCALayerTests; 629 | PRODUCT_NAME = "$(TARGET_NAME)"; 630 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/JGCALayer.app/JGCALayer"; 631 | }; 632 | name = Release; 633 | }; 634 | 1A0D4BF41D84FBAE00BD341D /* Debug */ = { 635 | isa = XCBuildConfiguration; 636 | buildSettings = { 637 | INFOPLIST_FILE = JGCALayerUITests/Info.plist; 638 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 639 | PRODUCT_BUNDLE_IDENTIFIER = com.shengHanDL.JGCALayerUITests; 640 | PRODUCT_NAME = "$(TARGET_NAME)"; 641 | TEST_TARGET_NAME = JGCALayer; 642 | }; 643 | name = Debug; 644 | }; 645 | 1A0D4BF51D84FBAE00BD341D /* Release */ = { 646 | isa = XCBuildConfiguration; 647 | buildSettings = { 648 | INFOPLIST_FILE = JGCALayerUITests/Info.plist; 649 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 650 | PRODUCT_BUNDLE_IDENTIFIER = com.shengHanDL.JGCALayerUITests; 651 | PRODUCT_NAME = "$(TARGET_NAME)"; 652 | TEST_TARGET_NAME = JGCALayer; 653 | }; 654 | name = Release; 655 | }; 656 | /* End XCBuildConfiguration section */ 657 | 658 | /* Begin XCConfigurationList section */ 659 | 1A0D4BBB1D84FBAE00BD341D /* Build configuration list for PBXProject "JGCALayer" */ = { 660 | isa = XCConfigurationList; 661 | buildConfigurations = ( 662 | 1A0D4BEB1D84FBAE00BD341D /* Debug */, 663 | 1A0D4BEC1D84FBAE00BD341D /* Release */, 664 | ); 665 | defaultConfigurationIsVisible = 0; 666 | defaultConfigurationName = Release; 667 | }; 668 | 1A0D4BED1D84FBAE00BD341D /* Build configuration list for PBXNativeTarget "JGCALayer" */ = { 669 | isa = XCConfigurationList; 670 | buildConfigurations = ( 671 | 1A0D4BEE1D84FBAE00BD341D /* Debug */, 672 | 1A0D4BEF1D84FBAE00BD341D /* Release */, 673 | ); 674 | defaultConfigurationIsVisible = 0; 675 | defaultConfigurationName = Release; 676 | }; 677 | 1A0D4BF01D84FBAE00BD341D /* Build configuration list for PBXNativeTarget "JGCALayerTests" */ = { 678 | isa = XCConfigurationList; 679 | buildConfigurations = ( 680 | 1A0D4BF11D84FBAE00BD341D /* Debug */, 681 | 1A0D4BF21D84FBAE00BD341D /* Release */, 682 | ); 683 | defaultConfigurationIsVisible = 0; 684 | defaultConfigurationName = Release; 685 | }; 686 | 1A0D4BF31D84FBAE00BD341D /* Build configuration list for PBXNativeTarget "JGCALayerUITests" */ = { 687 | isa = XCConfigurationList; 688 | buildConfigurations = ( 689 | 1A0D4BF41D84FBAE00BD341D /* Debug */, 690 | 1A0D4BF51D84FBAE00BD341D /* Release */, 691 | ); 692 | defaultConfigurationIsVisible = 0; 693 | defaultConfigurationName = Release; 694 | }; 695 | /* End XCConfigurationList section */ 696 | }; 697 | rootObject = 1A0D4BB81D84FBAE00BD341D /* Project object */; 698 | } 699 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/.DS_Store -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Apps/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/11. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | 16 | @end 17 | 18 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Apps/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/11. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | 11 | @interface AppDelegate () 12 | 13 | @end 14 | 15 | @implementation AppDelegate 16 | 17 | 18 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 19 | // Override point for customization after application launch. 20 | self.window.backgroundColor = [UIColor whiteColor]; 21 | return YES; 22 | } 23 | 24 | - (void)applicationWillResignActive:(UIApplication *)application { 25 | // 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. 26 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 27 | } 28 | 29 | - (void)applicationDidEnterBackground:(UIApplication *)application { 30 | // 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. 31 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 32 | } 33 | 34 | - (void)applicationWillEnterForeground:(UIApplication *)application { 35 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 36 | } 37 | 38 | - (void)applicationDidBecomeActive:(UIApplication *)application { 39 | // 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. 40 | } 41 | 42 | - (void)applicationWillTerminate:(UIApplication *)application { 43 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 44 | } 45 | 46 | @end 47 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/1.imageset/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/1.imageset/1.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "1.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/2.imageset/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/2.imageset/2.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "2.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/3.imageset/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/3.imageset/3.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "3.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "ipad", 35 | "size" : "29x29", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "idiom" : "ipad", 40 | "size" : "29x29", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "40x40", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "40x40", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "76x76", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "76x76", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "83.5x83.5", 66 | "scale" : "2x" 67 | } 68 | ], 69 | "info" : { 70 | "version" : 1, 71 | "author" : "xcode" 72 | } 73 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/Lucky/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyAnimal.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LuckyAnimal.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LuckyAnimal@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyAnimal.imageset/LuckyAnimal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyAnimal.imageset/LuckyAnimal.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyAnimal.imageset/LuckyAnimal@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyAnimal.imageset/LuckyAnimal@2x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyAnimalPressed.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LuckyAnimalPressed.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LuckyAnimalPressed@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyAnimalPressed.imageset/LuckyAnimalPressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyAnimalPressed.imageset/LuckyAnimalPressed.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyAnimalPressed.imageset/LuckyAnimalPressed@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyAnimalPressed.imageset/LuckyAnimalPressed@2x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyAstrology.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LuckyAstrology.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LuckyAstrology@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyAstrology.imageset/LuckyAstrology.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyAstrology.imageset/LuckyAstrology.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyAstrology.imageset/LuckyAstrology@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyAstrology.imageset/LuckyAstrology@2x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyAstrologyPressed.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LuckyAstrologyPressed.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LuckyAstrologyPressed@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyAstrologyPressed.imageset/LuckyAstrologyPressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyAstrologyPressed.imageset/LuckyAstrologyPressed.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyAstrologyPressed.imageset/LuckyAstrologyPressed@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyAstrologyPressed.imageset/LuckyAstrologyPressed@2x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyBaseBackground.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "LuckyBaseBackground@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 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyBaseBackground.imageset/LuckyBaseBackground@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyBaseBackground.imageset/LuckyBaseBackground@2x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyCenterButton.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "LuckyCenterButton@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 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyCenterButton.imageset/LuckyCenterButton@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyCenterButton.imageset/LuckyCenterButton@2x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyCenterButtonPressed.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "LuckyCenterButtonPressed@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 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyCenterButtonPressed.imageset/LuckyCenterButtonPressed@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyCenterButtonPressed.imageset/LuckyCenterButtonPressed@2x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyRotateWheel.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LuckyRotateWheel.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LuckyRotateWheel@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyRotateWheel.imageset/LuckyRotateWheel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyRotateWheel.imageset/LuckyRotateWheel.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyRotateWheel.imageset/LuckyRotateWheel@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyRotateWheel.imageset/LuckyRotateWheel@2x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyRototeSelected.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LuckyRototeSelected.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LuckyRototeSelected@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyRototeSelected.imageset/LuckyRototeSelected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyRototeSelected.imageset/LuckyRototeSelected.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyRototeSelected.imageset/LuckyRototeSelected@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/Lucky/LuckyRototeSelected.imageset/LuckyRototeSelected@2x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/coi_net.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "coi_net.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/coi_net.imageset/coi_net.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/coi_net.imageset/coi_net.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/doubi.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "doubi.jpg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/doubi.imageset/doubi.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/weibo/doubi.imageset/doubi.jpg -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/tabbar_compose_camera.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "tabbar_compose_camera@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "tabbar_compose_camera@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/tabbar_compose_camera.imageset/tabbar_compose_camera@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/weibo/tabbar_compose_camera.imageset/tabbar_compose_camera@2x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/tabbar_compose_camera.imageset/tabbar_compose_camera@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/weibo/tabbar_compose_camera.imageset/tabbar_compose_camera@3x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/tabbar_compose_idea.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "tabbar_compose_idea@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "tabbar_compose_idea@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/tabbar_compose_idea.imageset/tabbar_compose_idea@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/weibo/tabbar_compose_idea.imageset/tabbar_compose_idea@2x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/tabbar_compose_idea.imageset/tabbar_compose_idea@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/weibo/tabbar_compose_idea.imageset/tabbar_compose_idea@3x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/tabbar_compose_lbs.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "tabbar_compose_lbs@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "tabbar_compose_lbs@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/tabbar_compose_lbs.imageset/tabbar_compose_lbs@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/weibo/tabbar_compose_lbs.imageset/tabbar_compose_lbs@2x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/tabbar_compose_lbs.imageset/tabbar_compose_lbs@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/weibo/tabbar_compose_lbs.imageset/tabbar_compose_lbs@3x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/tabbar_compose_more.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "tabbar_compose_more@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "tabbar_compose_more@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/tabbar_compose_more.imageset/tabbar_compose_more@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/weibo/tabbar_compose_more.imageset/tabbar_compose_more@2x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/tabbar_compose_more.imageset/tabbar_compose_more@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/weibo/tabbar_compose_more.imageset/tabbar_compose_more@3x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/tabbar_compose_photo.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "tabbar_compose_photo@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "tabbar_compose_photo@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/tabbar_compose_photo.imageset/tabbar_compose_photo@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/weibo/tabbar_compose_photo.imageset/tabbar_compose_photo@2x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/tabbar_compose_photo.imageset/tabbar_compose_photo@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/weibo/tabbar_compose_photo.imageset/tabbar_compose_photo@3x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/tabbar_compose_review.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "tabbar_compose_review@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "tabbar_compose_review@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/tabbar_compose_review.imageset/tabbar_compose_review@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/weibo/tabbar_compose_review.imageset/tabbar_compose_review@2x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/tabbar_compose_review.imageset/tabbar_compose_review@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/weibo/tabbar_compose_review.imageset/tabbar_compose_review@3x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/发送界面/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/发送界面/tabbar_compose_background_icon_close.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "tabbar_compose_background_icon_close@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "tabbar_compose_background_icon_close@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/发送界面/tabbar_compose_background_icon_close.imageset/tabbar_compose_background_icon_close@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/weibo/发送界面/tabbar_compose_background_icon_close.imageset/tabbar_compose_background_icon_close@2x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/发送界面/tabbar_compose_background_icon_close.imageset/tabbar_compose_background_icon_close@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/weibo/发送界面/tabbar_compose_background_icon_close.imageset/tabbar_compose_background_icon_close@3x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/发送界面/tabbar_compose_button.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "tabbar_compose_button@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "tabbar_compose_button@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/发送界面/tabbar_compose_button.imageset/tabbar_compose_button@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/weibo/发送界面/tabbar_compose_button.imageset/tabbar_compose_button@2x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/发送界面/tabbar_compose_button.imageset/tabbar_compose_button@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/weibo/发送界面/tabbar_compose_button.imageset/tabbar_compose_button@3x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/发送界面/tabbar_compose_button_highlighted.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "tabbar_compose_button_highlighted@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "tabbar_compose_button_highlighted@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/发送界面/tabbar_compose_button_highlighted.imageset/tabbar_compose_button_highlighted@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/weibo/发送界面/tabbar_compose_button_highlighted.imageset/tabbar_compose_button_highlighted@2x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/发送界面/tabbar_compose_button_highlighted.imageset/tabbar_compose_button_highlighted@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/weibo/发送界面/tabbar_compose_button_highlighted.imageset/tabbar_compose_button_highlighted@3x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/发送界面/tabbar_compose_icon_add.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "tabbar_compose_icon_add@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "tabbar_compose_icon_add@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/发送界面/tabbar_compose_icon_add.imageset/tabbar_compose_icon_add@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/weibo/发送界面/tabbar_compose_icon_add.imageset/tabbar_compose_icon_add@2x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/发送界面/tabbar_compose_icon_add.imageset/tabbar_compose_icon_add@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/weibo/发送界面/tabbar_compose_icon_add.imageset/tabbar_compose_icon_add@3x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/发送界面/tabbar_compose_icon_add_highlighted.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "tabbar_compose_icon_add_highlighted@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "tabbar_compose_icon_add_highlighted@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/发送界面/tabbar_compose_icon_add_highlighted.imageset/tabbar_compose_icon_add_highlighted@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/weibo/发送界面/tabbar_compose_icon_add_highlighted.imageset/tabbar_compose_icon_add_highlighted@2x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/发送界面/tabbar_compose_icon_add_highlighted.imageset/tabbar_compose_icon_add_highlighted@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/weibo/发送界面/tabbar_compose_icon_add_highlighted.imageset/tabbar_compose_icon_add_highlighted@3x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/欢迎界面/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/欢迎界面/ad_background.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "ad_background@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "ad_background@3x.png", 15 | "scale" : "3x" 16 | }, 17 | { 18 | "idiom" : "universal", 19 | "filename" : "ad_background-568h@2x.png", 20 | "subtype" : "retina4", 21 | "scale" : "2x" 22 | }, 23 | { 24 | "idiom" : "universal", 25 | "filename" : "ad_background-667h@2x.png", 26 | "subtype" : "667h", 27 | "scale" : "2x" 28 | }, 29 | { 30 | "idiom" : "universal", 31 | "filename" : "ad_background-736h@3x.png", 32 | "subtype" : "736h", 33 | "scale" : "3x" 34 | } 35 | ], 36 | "info" : { 37 | "version" : 1, 38 | "author" : "xcode" 39 | } 40 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/欢迎界面/ad_background.imageset/ad_background-568h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/weibo/欢迎界面/ad_background.imageset/ad_background-568h@2x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/欢迎界面/ad_background.imageset/ad_background-667h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/weibo/欢迎界面/ad_background.imageset/ad_background-667h@2x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/欢迎界面/ad_background.imageset/ad_background-736h@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/weibo/欢迎界面/ad_background.imageset/ad_background-736h@3x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/欢迎界面/ad_background.imageset/ad_background@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/weibo/欢迎界面/ad_background.imageset/ad_background@2x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/欢迎界面/ad_background.imageset/ad_background@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/weibo/欢迎界面/ad_background.imageset/ad_background@3x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/欢迎界面/compose_slogan.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "compose_slogan@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "compose_slogan@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/欢迎界面/compose_slogan.imageset/compose_slogan@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/weibo/欢迎界面/compose_slogan.imageset/compose_slogan@2x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/weibo/欢迎界面/compose_slogan.imageset/compose_slogan@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/weibo/欢迎界面/compose_slogan.imageset/compose_slogan@3x.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/卡哇伊.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "卡哇伊.jpg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/卡哇伊.imageset/卡哇伊.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/卡哇伊.imageset/卡哇伊.jpg -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/心.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "心.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/心.imageset/心.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/心.imageset/心.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/爆炸_gif/1.imageset/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/爆炸_gif/1.imageset/1.jpg -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/爆炸_gif/1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "1.jpg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/爆炸_gif/2.imageset/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/爆炸_gif/2.imageset/2.jpg -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/爆炸_gif/2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "2.jpg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/爆炸_gif/3.imageset/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/爆炸_gif/3.imageset/3.jpg -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/爆炸_gif/3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "3.jpg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/爆炸_gif/4.imageset/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/爆炸_gif/4.imageset/4.jpg -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/爆炸_gif/4.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "4.jpg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/爆炸_gif/5.imageset/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/爆炸_gif/5.imageset/5.jpg -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/爆炸_gif/5.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "5.jpg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/爆炸_gif/6.imageset/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/爆炸_gif/6.imageset/6.jpg -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/爆炸_gif/6.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "6.jpg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/爆炸_gif/7.imageset/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/爆炸_gif/7.imageset/7.jpg -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/爆炸_gif/7.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "7.jpg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/爆炸_gif/8.imageset/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/爆炸_gif/8.imageset/8.jpg -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/爆炸_gif/8.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "8.jpg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/爆炸_gif/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/知道错了.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "知道错了.jpg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/知道错了.imageset/知道错了.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/知道错了.imageset/知道错了.jpg -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/钟表.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "钟表.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/钟表.imageset/钟表.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/钟表.imageset/钟表.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/阿狸头像.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "阿狸头像.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Assets.xcassets/阿狸头像.imageset/阿狸头像.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengzhihun6/JGCALayer/5433b1fa4480d68a689546b351c0e5297b139176/JGCALayer/JGCALayer/Assets.xcassets/阿狸头像.imageset/阿狸头像.png -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/CateGorys/UIImage+JGMosaic.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIImage+JGMosaic.h 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/12. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface UIImage (JGMosaic) 12 | 13 | + (UIImage *)transToMosaicImage:(UIImage*)orginImage blockLevel:(NSUInteger)level; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/CateGorys/UIImage+JGMosaic.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIImage+JGMosaic.m 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/12. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import "UIImage+JGMosaic.h" 10 | 11 | #define kBitsPerComponent (8) 12 | #define kBitsPerPixel (32) 13 | #define kPixelChannelCount (4) 14 | 15 | @implementation UIImage (JGMosaic) 16 | 17 | + (UIImage *)transToMosaicImage:(UIImage*)orginImage blockLevel:(NSUInteger)level { 18 | 19 | CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 20 | CGImageRef imgRef = orginImage.CGImage; 21 | CGFloat width = CGImageGetWidth(imgRef); 22 | CGFloat height = CGImageGetHeight(imgRef); 23 | CGContextRef context = CGBitmapContextCreate (nil, 24 | width, 25 | height, 26 | kBitsPerComponent, //每个颜色值8bit 27 | width*kPixelChannelCount, //每一行的像素点占用的字节数,每个像素点的ARGB四个通道各占8个bit 28 | colorSpace, 29 | kCGImageAlphaPremultipliedLast); 30 | CGContextDrawImage(context, CGRectMake(0, 0, width, height), imgRef); 31 | unsigned char *bitmapData = CGBitmapContextGetData (context); 32 | 33 | //这里把BitmapData进行马赛克转换,就是用一个点的颜色填充一个level*level的正方形 34 | unsigned char pixel[kPixelChannelCount] = {0}; 35 | NSUInteger index,preIndex; 36 | for (NSUInteger i = 0; i < height - 1 ; i++) { 37 | for (NSUInteger j = 0; j < width - 1; j++) { 38 | index = i * width + j; 39 | if (i % level == 0) { 40 | if (j % level == 0) { 41 | memcpy(pixel, bitmapData + kPixelChannelCount*index, kPixelChannelCount); 42 | }else{ 43 | memcpy(bitmapData + kPixelChannelCount*index, pixel, kPixelChannelCount); 44 | } 45 | } else { 46 | preIndex = (i-1)*width +j; 47 | memcpy(bitmapData + kPixelChannelCount*index, bitmapData + kPixelChannelCount*preIndex, kPixelChannelCount); 48 | } 49 | } 50 | } 51 | 52 | NSInteger dataLength = width*height* kPixelChannelCount; 53 | CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, bitmapData, dataLength, NULL); 54 | //创建要输出的图像 55 | CGImageRef mosaicImageRef = CGImageCreate(width, height, 56 | kBitsPerComponent, 57 | kBitsPerPixel, 58 | width*kPixelChannelCount , 59 | colorSpace, 60 | kCGBitmapByteOrderDefault, 61 | provider, 62 | NULL, NO, 63 | kCGRenderingIntentDefault); 64 | CGContextRef outputContext = CGBitmapContextCreate(nil, 65 | width, 66 | height, 67 | kBitsPerComponent, 68 | width*kPixelChannelCount, 69 | colorSpace, 70 | kCGImageAlphaPremultipliedLast); 71 | CGContextDrawImage(outputContext, CGRectMake(0.0f, 0.0f, width, height), mosaicImageRef); 72 | CGImageRef resultImageRef = CGBitmapContextCreateImage(outputContext); 73 | UIImage *resultImage = nil; 74 | if([UIImage respondsToSelector:@selector(imageWithCGImage:scale:orientation:)]) { 75 | float scale = [[UIScreen mainScreen] scale]; 76 | resultImage = [UIImage imageWithCGImage:resultImageRef scale:scale orientation:UIImageOrientationUp]; 77 | } else { 78 | resultImage = [UIImage imageWithCGImage:resultImageRef]; 79 | } 80 | //释放 81 | if(resultImageRef){ 82 | CFRelease(resultImageRef); 83 | } 84 | if(mosaicImageRef){ 85 | CFRelease(mosaicImageRef); 86 | } 87 | if(colorSpace){ 88 | CGColorSpaceRelease(colorSpace); 89 | } 90 | if(provider){ 91 | CGDataProviderRelease(provider); 92 | } 93 | if(context){ 94 | CGContextRelease(context); 95 | } 96 | if(outputContext){ 97 | CGContextRelease(outputContext); 98 | } 99 | return resultImage ; 100 | } 101 | 102 | 103 | @end 104 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Controllers/JGBageValueController.h: -------------------------------------------------------------------------------- 1 | // 2 | // JGBageValueController.h 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/12. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface JGBageValueController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Controllers/JGBageValueController.m: -------------------------------------------------------------------------------- 1 | // 2 | // JGBageValueController.m 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/12. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import "JGBageValueController.h" 10 | 11 | @interface JGBageValueController () 12 | 13 | @end 14 | 15 | @implementation JGBageValueController 16 | 17 | - (void)viewDidLoad { 18 | [super viewDidLoad]; 19 | // Do any additional setup after loading the view. 20 | 21 | // self.view.translatesAutoresizingMaskIntoConstraints = NO; 22 | 23 | 24 | 25 | } 26 | 27 | - (void)didReceiveMemoryWarning { 28 | [super didReceiveMemoryWarning]; 29 | // Dispose of any resources that can be recreated. 30 | } 31 | 32 | 33 | 34 | @end 35 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Controllers/JGBasicViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // JGBasicViewController.h 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/11. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface JGBasicViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Controllers/JGBasicViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // JGBasicViewController.m 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/11. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import "JGBasicViewController.h" 10 | 11 | @interface JGBasicViewController () 12 | @property (weak, nonatomic) IBOutlet UIView *redView; 13 | @property (weak, nonatomic) IBOutlet UIImageView *imageV; 14 | @property (weak, nonatomic) IBOutlet UIView *cusView; 15 | 16 | @property(nonatomic,weak)CALayer *layer; 17 | @end 18 | 19 | @implementation JGBasicViewController 20 | 21 | - (void)viewDidLoad { 22 | [super viewDidLoad]; 23 | 24 | CALayer *layer = [CALayer layer]; 25 | layer.bounds = CGRectMake(0, 64, 100, 100); 26 | layer.position = CGPointMake(100, 200); 27 | layer.backgroundColor = [UIColor greenColor].CGColor; 28 | self.layer = layer; 29 | [self.view.layer addSublayer:layer]; 30 | 31 | 32 | } 33 | 34 | - (void)didReceiveMemoryWarning { 35 | [super didReceiveMemoryWarning]; 36 | // Dispose of any resources that can be recreated. 37 | } 38 | 39 | #pragma mark - 自定义CALayer - 40 | - (IBAction)CusCALayer:(UIButton *)sender { 41 | 42 | CALayer *layer = [CALayer layer]; 43 | layer.frame = self.cusView.bounds; 44 | layer.backgroundColor = [UIColor redColor].CGColor; 45 | [self.cusView.layer addSublayer:layer]; 46 | layer.contents = (id)[UIImage imageNamed:@"阿狸头像"].CGImage; 47 | } 48 | 49 | 50 | #pragma mark - 隐式动画 - 51 | - (IBAction)implicitAnimationBtn:(UIButton *)sender { 52 | 53 | //动画底层都是包装成多个事务 54 | //有很多操作绑定在一起,当这些操作全部执行完毕时,它才进行下一步操作 55 | [CATransaction begin]; 56 | 57 | //设置事务有没有动画 58 | [CATransaction setDisableActions:NO]; 59 | //设置事务动画的执行时长 60 | [CATransaction setAnimationDuration:1.0f]; 61 | 62 | self.layer.bounds = CGRectMake(100, 100, arc4random_uniform(200), arc4random_uniform(200)); 63 | self.layer.position = CGPointMake(arc4random_uniform(300) + 100, arc4random_uniform(400) + 100); 64 | self.layer.backgroundColor = [self randomColor].CGColor; 65 | self.layer.cornerRadius = arc4random_uniform(self.layer.bounds.size.width); 66 | [CATransaction commit]; 67 | } 68 | 69 | - (UIColor *)randomColor{ 70 | 71 | CGFloat r = arc4random_uniform(256) /255.0; 72 | CGFloat g = arc4random_uniform(256) /255.0; 73 | CGFloat b = arc4random_uniform(256) /255.0; 74 | 75 | return [UIColor colorWithRed:r green:g blue:b alpha:1]; 76 | } 77 | 78 | 79 | #pragma mark - 翻转 - 80 | - (IBAction)UIViewAni:(UIButton *)sender { 81 | 82 | [UIView animateWithDuration:1 animations:^{ 83 | //3D 84 | //self.imageV.layer.transform = CATransform3DMakeRotation(M_PI, 1, 1, 0); 85 | 86 | //self.imageV.layer.transform = CATransform3DMakeTranslation(100, 50, 1); 87 | 88 | //self.imageV.layer.transform = CATransform3DMakeScale(0.5, 0.5, 0); 89 | 90 | //把结构体转成对象 91 | //做3d旋转的时候一般不用KVC 92 | //什么时候用KVC 93 | //做一些快速缩放,平移,二维旋转. 94 | // NSValue *value = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI, 1, 1, 0)]; 95 | [self.imageV.layer setValue:@(M_PI) forKeyPath:@"transform.rotation.x"]; 96 | 97 | }]; 98 | } 99 | 100 | 101 | #pragma mark - 变圆 - 102 | - (IBAction)UIImageVLayer:(UIButton *)sender { 103 | 104 | //UIView本身就自带阴影效果,它是透明. 105 | self.imageV.layer.shadowOpacity = 1; 106 | //设置阴影的偏移量 107 | self.imageV.layer.shadowOffset = CGSizeMake(-30, -10); 108 | //设置阴影的模糊程度 109 | self.imageV.layer.shadowRadius = 10; 110 | //设置阴影的颜色 111 | self.imageV.layer.shadowColor = [UIColor blueColor].CGColor; 112 | 113 | //设置边框的颜色 114 | self.imageV.layer.borderColor = [UIColor greenColor].CGColor; 115 | //设置边框的宽度 116 | self.imageV.layer.borderWidth = 2; 117 | 118 | //设置圆角半径. 119 | self.imageV.layer.cornerRadius = 50; 120 | 121 | //我们设置的所有layer的属性只作用在根层上. 122 | // NSLog(@"%@",self.imageV.layer.contents); 123 | //超过根层以外东西都会被裁剪掉. 124 | self.imageV.layer.masksToBounds = YES; 125 | } 126 | 127 | 128 | #pragma mark - 变圆带阴影 - 129 | - (IBAction)UIViewLayer:(UIButton *)sender { 130 | 131 | //UIView本身就自带阴影效果,它是透明. 132 | self.redView.layer.shadowOpacity = 1; 133 | //设置阴影的偏移量 134 | self.redView.layer.shadowOffset = CGSizeMake(-30, -10); 135 | //设置阴影的模糊程度 136 | self.redView.layer.shadowRadius = 10; 137 | //设置阴影的颜色 138 | self.redView.layer.shadowColor = [UIColor blueColor].CGColor; 139 | 140 | //设置边框的颜色 141 | self.redView.layer.borderColor = [UIColor greenColor].CGColor; 142 | //设置边框的宽度 143 | self.redView.layer.borderWidth = 2; 144 | 145 | //设置圆角半径. 146 | self.redView.layer.cornerRadius = 50; 147 | } 148 | 149 | 150 | @end 151 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Controllers/JGClockViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // JGClockViewController.h 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/11. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface JGClockViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Controllers/JGClockViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // JGClockViewController.m 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/11. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import "JGClockViewController.h" 10 | 11 | #define angle2Rad(angle) ((angle) / 180.0 * M_PI) 12 | 13 | //每一秒旋转6度 14 | #define perSecondA 6 15 | //每一分旋转 16 | #define perMinA 6 17 | //每一小时旋转30 18 | #define perHourA 30 19 | //第一分时针旋转的度数 20 | #define perMinHour 0.5 21 | 22 | 23 | @interface JGClockViewController () 24 | @property (weak, nonatomic) IBOutlet UIImageView *clockView; 25 | 26 | @property(nonatomic,weak)CALayer *secondL; 27 | 28 | @property(nonatomic,weak)CALayer *minuteL; 29 | 30 | @property(nonatomic,weak)CALayer *hourL; 31 | 32 | @end 33 | 34 | @implementation JGClockViewController 35 | 36 | - (void)viewDidLoad { 37 | [super viewDidLoad]; 38 | // Do any additional setup after loading the view. 39 | 40 | //添加时针 41 | [self addHour]; 42 | 43 | //添加分针 44 | [self addMinue]; 45 | 46 | //添加秒针 47 | [self addSecond]; 48 | 49 | //添加定时器 50 | [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(timeChange) userInfo:nil repeats:YES]; 51 | 52 | [self timeChange]; 53 | 54 | CALayer *layer = [CALayer layer]; 55 | layer.bounds = CGRectMake(0, 0, 6, 6); 56 | layer.backgroundColor = [UIColor blackColor].CGColor; 57 | layer.cornerRadius = layer.bounds.size.width * 0.5; 58 | layer.position = CGPointMake(self.clockView.bounds.size.width * 0.5, self.clockView.bounds.size.height * 0.5); 59 | [self.clockView.layer addSublayer:layer]; 60 | 61 | } 62 | 63 | //每一秒调用一次 64 | - (void)timeChange { 65 | 66 | NSCalendar *calendar = [NSCalendar currentCalendar]; 67 | //components日历单元:年,月,日,时,分,秒 68 | //fromDate:从哪个时间开始取 69 | NSDateComponents *cmp = [calendar components:NSCalendarUnitSecond | NSCalendarUnitHour | NSCalendarUnitMinute fromDate:[NSDate date]]; 70 | //获取当时是多少秒 71 | NSInteger curSecond = cmp.second; 72 | //获取当前是多少分 73 | NSInteger curMinute = cmp.minute; 74 | //获取当前是多少小时 75 | NSInteger curHour = cmp.hour; 76 | 77 | //秒针旋转多少度 78 | CGFloat angle = curSecond * perSecondA; 79 | self.secondL.transform = CATransform3DMakeRotation(angle2Rad(angle), 0, 0, 1); 80 | 81 | //让分针开始旋转 82 | CGFloat minuteA = curMinute * perMinA; 83 | self.minuteL.transform = CATransform3DMakeRotation(angle2Rad(minuteA), 0, 0, 1); 84 | 85 | //让时针开始旋转 86 | CGFloat hourA = curHour * perHourA + curMinute * perMinHour; 87 | self.hourL.transform = CATransform3DMakeRotation(angle2Rad(hourA), 0, 0, 1); 88 | 89 | 90 | } 91 | 92 | 93 | 94 | //添加时针 95 | - (void)addHour { 96 | 97 | CALayer *layer = [CALayer layer]; 98 | layer.backgroundColor = [UIColor blackColor].CGColor; 99 | layer.bounds = CGRectMake(0, 0, 2.5, 50); 100 | layer.position = CGPointMake(self.clockView.bounds.size.width * 0.5, self.clockView.bounds.size.height * 0.5); 101 | layer.anchorPoint = CGPointMake(0.5, 0.95); 102 | self.hourL = layer; 103 | [self.clockView.layer addSublayer:layer]; 104 | } 105 | 106 | //添加分针 107 | - (void)addMinue { 108 | 109 | CALayer *layer = [CALayer layer]; 110 | layer.backgroundColor = [UIColor blackColor].CGColor; 111 | layer.bounds = CGRectMake(0, 0, 2, 70); 112 | layer.position = CGPointMake(self.clockView.bounds.size.width * 0.5, self.clockView.bounds.size.height * 0.5); 113 | layer.anchorPoint = CGPointMake(0.5, 0.9); 114 | self.minuteL = layer; 115 | [self.clockView.layer addSublayer:layer]; 116 | 117 | 118 | } 119 | 120 | //添加秒针 121 | - (void)addSecond { 122 | 123 | //一般做旋转,缩放,都是根据锚点进旋转,缩放 124 | CALayer *layer = [CALayer layer]; 125 | layer.backgroundColor = [UIColor redColor].CGColor; 126 | layer.bounds = CGRectMake(0, 0, 1, 82); 127 | layer.position = CGPointMake(self.clockView.bounds.size.width * 0.5, self.clockView.bounds.size.height * 0.5); 128 | layer.anchorPoint = CGPointMake(0.5, 0.85); 129 | self.secondL = layer; 130 | [self.clockView.layer addSublayer:layer]; 131 | 132 | 133 | } 134 | 135 | 136 | - (void)didReceiveMemoryWarning { 137 | [super didReceiveMemoryWarning]; 138 | // Dispose of any resources that can be recreated. 139 | } 140 | 141 | /* 142 | #pragma mark - Navigation 143 | 144 | // In a storyboard-based application, you will often want to do a little preparation before navigation 145 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 146 | // Get the new view controller using [segue destinationViewController]. 147 | // Pass the selected object to the new view controller. 148 | } 149 | */ 150 | 151 | @end 152 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Controllers/JGHeartBeatAndTranstionController.h: -------------------------------------------------------------------------------- 1 | // 2 | // JGHeartBeatAndTranstionController.h 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/11. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface JGHeartBeatAndTranstionController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Controllers/JGHeartBeatAndTranstionController.m: -------------------------------------------------------------------------------- 1 | // 2 | // JGHeartBeatAndTranstionController.m 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/11. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import "JGHeartBeatAndTranstionController.h" 10 | 11 | @interface JGHeartBeatAndTranstionController () 12 | 13 | @property (weak, nonatomic) IBOutlet UIImageView *heartImageV; 14 | 15 | @property (weak, nonatomic) IBOutlet UIImageView *picImageV; 16 | 17 | 18 | @end 19 | 20 | 21 | static int _i = 1; 22 | 23 | @implementation JGHeartBeatAndTranstionController 24 | 25 | - (void)viewDidLoad { 26 | [super viewDidLoad]; 27 | // Do any additional setup after loading the view. 28 | 29 | [self CATransition]; 30 | 31 | } 32 | 33 | - (void)CATransition { 34 | 35 | //转场代码必须和转场动画在同一个方法中 36 | //创建动画 37 | CATransition *anim = [CATransition animation]; 38 | //设置转场类型 39 | anim.type = @"pageCurl"; 40 | //设置转场方向 41 | anim.subtype = kCATransitionFromTop; 42 | //设置动画的开始点 43 | anim.startProgress = 0.2; 44 | //设置动画的结束点 45 | anim.endProgress = 0.8; 46 | 47 | anim.duration = 1; 48 | [self.picImageV.layer addAnimation:anim forKey:nil]; 49 | 50 | //转场代码 51 | _i++; 52 | if (_i > 3) { 53 | _i = 1; 54 | } 55 | 56 | NSString *imageName = [NSString stringWithFormat:@"%d",_i]; 57 | self.picImageV.image = [UIImage imageNamed:imageName]; 58 | } 59 | 60 | 61 | //转场 62 | - (IBAction)transitionBtnClick:(UIButton *)sender { 63 | 64 | [UIView transitionWithView:self.picImageV duration:1.0f options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ 65 | 66 | _i++; 67 | if (_i > 3) { 68 | _i = 1; 69 | } 70 | NSString *imageName = [NSString stringWithFormat:@"%d",_i]; 71 | self.picImageV.image = [UIImage imageNamed:imageName]; 72 | } completion:nil]; 73 | } 74 | 75 | //心跳 76 | - (IBAction)heartBeatBtnClick:(UIButton *)sender { 77 | 78 | //创建动画对象 79 | CABasicAnimation *anim = [CABasicAnimation animation]; 80 | //设置属性 81 | anim.keyPath = @"transform.scale"; 82 | //设置属性值 83 | anim.toValue = @0; 84 | //设置动画的执行次数 85 | anim.repeatCount = MAXFLOAT; 86 | //设置动画的执行时长 87 | anim.duration = 0.5; 88 | 89 | //自动反转 90 | anim.autoreverses = YES; 91 | //添加动画 92 | [self.heartImageV.layer addAnimation:anim forKey:nil]; 93 | } 94 | 95 | 96 | - (void)didReceiveMemoryWarning { 97 | [super didReceiveMemoryWarning]; 98 | // Dispose of any resources that can be recreated. 99 | } 100 | 101 | 102 | @end 103 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Controllers/JGMosaicController.h: -------------------------------------------------------------------------------- 1 | // 2 | // JGMosaicController.h 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/12. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface JGMosaicController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Controllers/JGMosaicController.m: -------------------------------------------------------------------------------- 1 | // 2 | // JGMosaicController.m 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/12. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import "JGMosaicController.h" 10 | #import "JGMosaicView.h" 11 | #import "UIImage+JGMosaic.h" 12 | 13 | #define kDeviceWidth [UIScreen mainScreen].bounds.size.width 14 | 15 | @interface JGMosaicController () 16 | 17 | @property (nonatomic, strong) JGMosaicView *mosaicV; 18 | 19 | @end 20 | 21 | @implementation JGMosaicController 22 | 23 | - (void)viewDidLoad { 24 | [super viewDidLoad]; 25 | // Do any additional setup after loading the view. 26 | 27 | [self createMosaic]; 28 | 29 | [self createSlider]; 30 | } 31 | 32 | - (void)createMosaic { 33 | 34 | CGFloat x = kDeviceWidth * 0.1; 35 | _mosaicV = [[JGMosaicView alloc] initWithFrame:CGRectMake(x, 100, kDeviceWidth - x * 2, 300)]; 36 | UIImage *image = [UIImage imageNamed:@"阿狸头像"]; 37 | 38 | //顶图 39 | _mosaicV.surfaceImage = image; 40 | //底图 41 | _mosaicV.image = [UIImage transToMosaicImage:image blockLevel:5]; 42 | // _mosaicV.mosaicValue = 100; 43 | 44 | [self.view addSubview:_mosaicV]; 45 | } 46 | 47 | 48 | - (void)createSlider { 49 | 50 | 51 | //左右轨的图片 52 | UIImage *stetchLeftTrack = [UIImage imageNamed:@"LuckyAnimal"]; 53 | UIImage *stetchRightTrack = [UIImage imageNamed:@"LuckyAnimalPressed"]; 54 | //滑块图片 55 | UIImage *thumbImage = [UIImage imageNamed:@"coi_net"]; 56 | 57 | CGFloat x = kDeviceWidth * 0.1; 58 | UISlider *slider = [[UISlider alloc] initWithFrame:CGRectMake(x,450,kDeviceWidth - x * 2,7)]; 59 | slider.backgroundColor = [UIColor clearColor]; 60 | slider.value = 0.0; 61 | slider.minimumValue = 0; 62 | slider.maximumValue = 100; 63 | 64 | [slider setMinimumTrackImage:stetchLeftTrack forState:UIControlStateNormal]; 65 | [slider setMaximumTrackImage:stetchRightTrack forState:UIControlStateNormal]; 66 | //注意这里务必加上UIControlStateHightlighted的状态,否则当拖动滑块时滑块将变成原生的控件 67 | [slider setThumbImage:thumbImage forState:UIControlStateHighlighted]; 68 | [slider setThumbImage:thumbImage forState:UIControlStateNormal]; 69 | 70 | //滑块拖动后的事件 71 | [slider addTarget:self action:@selector(sliderDragUp:) forControlEvents:UIControlEventTouchUpInside]; 72 | 73 | [self.view addSubview:slider]; 74 | 75 | 76 | 77 | 78 | 79 | } 80 | 81 | 82 | - (void)sliderDragUp:(UISlider *)slider { 83 | 84 | // NSLog(@"===== %f", slider.value); 85 | 86 | _mosaicV.mosaicValue = slider.value; 87 | } 88 | 89 | 90 | - (void)didReceiveMemoryWarning { 91 | [super didReceiveMemoryWarning]; 92 | // Dispose of any resources that can be recreated. 93 | } 94 | 95 | 96 | 97 | @end 98 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Controllers/JGMusicVibrationController.h: -------------------------------------------------------------------------------- 1 | // 2 | // JGMusicVibrationController.h 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/12. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface JGMusicVibrationController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Controllers/JGMusicVibrationController.m: -------------------------------------------------------------------------------- 1 | // 2 | // JGMusicVibrationController.m 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/12. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import "JGMusicVibrationController.h" 10 | 11 | @interface JGMusicVibrationController () 12 | //音乐震动条图 13 | @property (weak, nonatomic) IBOutlet UIView *contentView; 14 | //复制层 15 | @property (weak, nonatomic) IBOutlet UIView *contentV; 16 | @end 17 | 18 | @implementation JGMusicVibrationController 19 | 20 | - (void)viewDidLoad { 21 | [super viewDidLoad]; 22 | // Do any additional setup after loading the view. 23 | 24 | //音乐震动条 25 | [self MusicVibration]; 26 | 27 | //复制层 28 | [self replicatorL]; 29 | 30 | 31 | } 32 | 33 | #pragma mark - 复制层 - 34 | - (void)replicatorL { 35 | 36 | //复制层可以复制它里面的层 37 | //想要复制它里面的内容,也要把它添加到层上面 38 | CAReplicatorLayer *repL = [CAReplicatorLayer layer]; 39 | repL.frame = self.contentV.bounds; 40 | repL.backgroundColor = [UIColor redColor].CGColor; 41 | [self.contentV.layer addSublayer:repL]; 42 | 43 | 44 | CALayer *layer = [CALayer layer]; 45 | layer.frame = CGRectMake(30, 20, 50, 50); 46 | layer.backgroundColor = [UIColor greenColor].CGColor; 47 | [repL addSublayer:layer]; 48 | 49 | CALayer *layer2 = [CALayer layer]; 50 | layer2.frame = CGRectMake(30, 80, 50, 50); 51 | layer2.backgroundColor = [UIColor yellowColor].CGColor; 52 | [repL addSublayer:layer2]; 53 | 54 | //要复制的份。包括它自己 55 | repL.instanceCount = 4; 56 | //相对复制出来的上一个层做平移 57 | repL.instanceTransform = CATransform3DMakeTranslation(60, 0, 0); 58 | 59 | 60 | 61 | } 62 | 63 | #pragma mark - 音乐震动条 - 64 | - (void)MusicVibration { 65 | 66 | //复制层 67 | CAReplicatorLayer *repL = [CAReplicatorLayer layer]; 68 | repL.frame = self.contentView.bounds; 69 | 70 | repL.instanceCount = 7; 71 | 72 | repL.instanceTransform = CATransform3DMakeTranslation(40, 0, 0); 73 | //设置动画延时执行时间 74 | repL.instanceDelay = 0.5; 75 | [self.contentView.layer addSublayer:repL]; 76 | 77 | 78 | //创建一个音乐震动条 79 | CALayer *layer = [CALayer layer]; 80 | CGFloat w = 30; 81 | CGFloat h = 150; 82 | layer.bounds = CGRectMake(0, 0, w, h); 83 | layer.backgroundColor = [UIColor redColor].CGColor; 84 | layer.anchorPoint = CGPointMake(0 , 1); 85 | layer.position = CGPointMake(0 , self.contentView.bounds.size.height); 86 | [repL addSublayer:layer]; 87 | 88 | //添加动画 89 | CABasicAnimation *anim = [CABasicAnimation animation]; 90 | anim.keyPath = @"transform.scale.y"; 91 | anim.toValue = @0; 92 | anim.duration = 0.5; 93 | anim.repeatCount = MAXFLOAT; 94 | anim.autoreverses = YES; 95 | [layer addAnimation:anim forKey:nil]; 96 | 97 | 98 | } 99 | 100 | 101 | - (void)didReceiveMemoryWarning { 102 | [super didReceiveMemoryWarning]; 103 | // Dispose of any resources that can be recreated. 104 | } 105 | 106 | /* 107 | #pragma mark - Navigation 108 | 109 | // In a storyboard-based application, you will often want to do a little preparation before navigation 110 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 111 | // Get the new view controller using [segue destinationViewController]. 112 | // Pass the selected object to the new view controller. 113 | } 114 | */ 115 | 116 | @end 117 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Controllers/JGParticleViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // JGParticleViewController.h 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/12. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface JGParticleViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Controllers/JGParticleViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // JGParticleViewController.m 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/12. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import "JGParticleViewController.h" 10 | #import "JGParticleView.h" 11 | 12 | 13 | @interface JGParticleViewController () 14 | @property (strong, nonatomic) IBOutlet JGParticleView *VCView; 15 | 16 | @end 17 | 18 | @implementation JGParticleViewController 19 | 20 | - (void)viewDidLoad { 21 | [super viewDidLoad]; 22 | // Do any additional setup after loading the view. 23 | } 24 | 25 | 26 | 27 | //开始 28 | - (IBAction)start:(UIButton *)sender { 29 | 30 | [self.VCView start]; 31 | 32 | } 33 | 34 | 35 | //重绘 36 | - (IBAction)reDraw:(UIButton *)sender { 37 | [self.VCView reDraw]; 38 | } 39 | 40 | 41 | 42 | - (void)didReceiveMemoryWarning { 43 | [super didReceiveMemoryWarning]; 44 | // Dispose of any resources that can be recreated. 45 | } 46 | 47 | /* 48 | #pragma mark - Navigation 49 | 50 | // In a storyboard-based application, you will often want to do a little preparation before navigation 51 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 52 | // Get the new view controller using [segue destinationViewController]. 53 | // Pass the selected object to the new view controller. 54 | } 55 | */ 56 | 57 | @end 58 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Controllers/JGPicFoldViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // JGPicFoldViewController.h 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/12. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface JGPicFoldViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Controllers/JGPicFoldViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // JGPicFoldViewController.m 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/12. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import "JGPicFoldViewController.h" 10 | 11 | @interface JGPicFoldViewController () 12 | 13 | @property (weak, nonatomic) IBOutlet UIImageView *topImageV; 14 | @property (weak, nonatomic) IBOutlet UIImageView *bottomImageV; 15 | @property (weak, nonatomic) IBOutlet UIView *dragView; 16 | 17 | @property (nonatomic, weak) CAGradientLayer *gradient; 18 | 19 | @end 20 | 21 | @implementation JGPicFoldViewController 22 | 23 | - (void)viewDidLoad { 24 | [super viewDidLoad]; 25 | // Do any additional setup after loading the view. 26 | 27 | //让上部分图片只显示上半部分 28 | self.topImageV.layer.contentsRect = CGRectMake(0, 0, 1, 0.5); 29 | //让下部分图片只显示下部分 30 | self.bottomImageV.layer.contentsRect = CGRectMake(0, 0.5, 1, 0.5); 31 | 32 | self.topImageV.layer.anchorPoint = CGPointMake(0.5, 1); 33 | self.bottomImageV.layer.anchorPoint = CGPointMake(0.5, 0); 34 | 35 | //添加手势 36 | UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)]; 37 | [self.dragView addGestureRecognizer:pan]; 38 | 39 | //给底部图片添加渐变 40 | //渐变层 41 | CAGradientLayer *gradient = [CAGradientLayer layer]; 42 | gradient.frame = self.bottomImageV.bounds; 43 | gradient.colors = @[(id)[UIColor clearColor].CGColor, (id)[UIColor blackColor].CGColor]; 44 | 45 | //设置不透明度 46 | gradient.opacity = 0; 47 | self.gradient = gradient; 48 | [self.bottomImageV.layer addSublayer:gradient]; 49 | 50 | } 51 | 52 | - (void)pan:(UIPanGestureRecognizer *)pan { 53 | 54 | CGPoint transP = [pan translationInView:self.dragView]; 55 | 56 | CATransform3D transform = CATransform3DIdentity; 57 | //立体的效果, 近大远小 58 | transform.m34 = -1 /550.0; 59 | 60 | //设置不透明度 61 | CGFloat opcity = transP.y * 1 /256.0; 62 | self.gradient.opacity = opcity; 63 | 64 | CGFloat angle = transP.y * M_PI /256.0; 65 | //让上半部分做旋转 66 | self.topImageV.layer.transform = CATransform3DRotate(transform, -angle, 1, 0, 0); 67 | 68 | if (pan.state == UIGestureRecognizerStateEnded) { 69 | 70 | self.gradient.opacity = 0; 71 | 72 | [UIView animateWithDuration:0.5 delay:0 usingSpringWithDamping:0.25 initialSpringVelocity:0 options:UIViewAnimationOptionCurveLinear animations:^{ 73 | 74 | //让上部图片反弹回去 75 | self.topImageV.layer.transform = CATransform3DIdentity; 76 | } completion:^(BOOL finished) { 77 | 78 | }]; 79 | } 80 | } 81 | 82 | //渐变层 83 | - (void)gradientL{ 84 | 85 | //渐变层 86 | CAGradientLayer *gradient = [CAGradientLayer layer]; 87 | gradient.frame = self.bottomImageV.bounds; 88 | gradient.colors = @[(id)[UIColor redColor].CGColor,(id)[UIColor greenColor].CGColor,(id)[UIColor blueColor].CGColor]; 89 | 90 | //设置渐变的方向 91 | gradient.startPoint = CGPointMake(0, 0); 92 | gradient.endPoint = CGPointMake(1, 0); 93 | //设置从哪个位置渐变到下一个颜色. 94 | gradient.locations = @[@0.2,@0.8]; 95 | } 96 | 97 | 98 | - (void)didReceiveMemoryWarning { 99 | [super didReceiveMemoryWarning]; 100 | // Dispose of any resources that can be recreated. 101 | } 102 | 103 | /* 104 | #pragma mark - Navigation 105 | 106 | // In a storyboard-based application, you will often want to do a little preparation before navigation 107 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 108 | // Get the new view controller using [segue destinationViewController]. 109 | // Pass the selected object to the new view controller. 110 | } 111 | */ 112 | 113 | @end 114 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Controllers/JGReflectionController.h: -------------------------------------------------------------------------------- 1 | // 2 | // JGReflectionController.h 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/12. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface JGReflectionController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Controllers/JGReflectionController.m: -------------------------------------------------------------------------------- 1 | // 2 | // JGReflectionController.m 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/12. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import "JGReflectionController.h" 10 | 11 | @interface JGReflectionController () 12 | @property (weak, nonatomic) IBOutlet UIImageView *imageV; 13 | 14 | @end 15 | 16 | @implementation JGReflectionController 17 | 18 | - (void)viewDidLoad { 19 | [super viewDidLoad]; 20 | // Do any additional setup after loading the view. 21 | 22 | // NSLog(@"%@",[self.view.layer class]); 23 | CAReplicatorLayer *repL = (CAReplicatorLayer *)self.view.layer; 24 | repL.instanceCount = 2; 25 | //复制出来的子层,它都是围绕着复制层锚点进行旋转 26 | repL.instanceTransform = CATransform3DMakeRotation(M_PI, 1, 0, 0); 27 | 28 | repL.instanceRedOffset -= 0.1; 29 | repL.instanceGreenOffset -= 0.1; 30 | repL.instanceBlueOffset -= 0.1; 31 | repL.instanceAlphaOffset -= 0.1; 32 | 33 | } 34 | 35 | - (void)didReceiveMemoryWarning { 36 | [super didReceiveMemoryWarning]; 37 | // Dispose of any resources that can be recreated. 38 | } 39 | 40 | 41 | @end 42 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Controllers/JGRootTableViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // JGRootTableViewController.h 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/11. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface JGRootTableViewController : UITableViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Controllers/JGRootTableViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // JGRootTableViewController.m 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/11. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import "JGRootTableViewController.h" 10 | 11 | @interface JGRootTableViewController () 12 | /** 13 | * 数据源 14 | */ 15 | @property (nonatomic, strong) NSArray *dataArray; 16 | 17 | @end 18 | 19 | static NSString * const JGRootCellID = @"JGRootCellID"; 20 | 21 | @implementation JGRootTableViewController 22 | 23 | - (void)viewDidLoad { 24 | [super viewDidLoad]; 25 | 26 | UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStyleDone target:self action:nil]; 27 | self.navigationItem.backBarButtonItem = item; 28 | 29 | [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:JGRootCellID]; 30 | 31 | } 32 | 33 | - (NSArray *)dataArray { 34 | if (!_dataArray) { 35 | _dataArray = @[@"01 - CALayer的基本操作", 36 | @"02 - 时钟效果", 37 | @"03 - 心跳效果/转场动画", 38 | @"04 - 转盘", 39 | @"05 - 图片折叠", 40 | @"06 - 音乐震动条/复制层", 41 | @"07 - 倒影", 42 | @"08 - 粒子效果", 43 | @"09 - QQ粘性布局", 44 | @"10 - 微博动画", 45 | @"11 - 打马赛克"]; 46 | } 47 | return _dataArray; 48 | } 49 | 50 | 51 | 52 | 53 | 54 | #pragma mark - Table view data source 55 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 56 | return self.dataArray.count; 57 | } 58 | 59 | 60 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 61 | UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:JGRootCellID forIndexPath:indexPath]; 62 | cell.textLabel.text = _dataArray[indexPath.row]; 63 | 64 | return cell; 65 | } 66 | 67 | 68 | - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 69 | //反选 70 | [tableView deselectRowAtIndexPath:indexPath animated:YES]; 71 | //取出story 72 | UIStoryboard *story = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 73 | //找到story中对应的控制器 74 | UIViewController *vc; 75 | if (indexPath.row == 0) { //基本操作 76 | 77 | vc = [story instantiateViewControllerWithIdentifier:@"basicVC"]; 78 | }else if (indexPath.row == 1) {//时钟效果 79 | 80 | vc = [story instantiateViewControllerWithIdentifier:@"clockVC"]; 81 | }else if (indexPath.row == 2) { //心跳效果/转场动画 82 | 83 | vc = [story instantiateViewControllerWithIdentifier:@"heartAndTr"]; 84 | }else if (indexPath.row == 3) {//转盘 85 | 86 | vc = [story instantiateViewControllerWithIdentifier:@"RotaryTable"]; 87 | }else if (indexPath.row == 4) {//图片折叠 88 | 89 | vc = [story instantiateViewControllerWithIdentifier:@"picFoldVC"]; 90 | }else if (indexPath.row == 5) {//音乐震动条/复制层 91 | 92 | vc = [story instantiateViewControllerWithIdentifier:@"MusicVibration"]; 93 | }else if (indexPath.row == 6) {//倒影 94 | 95 | vc = [story instantiateViewControllerWithIdentifier:@"reflectionVC"]; 96 | }else if (indexPath.row == 7) {//粒子效果 97 | 98 | vc = [story instantiateViewControllerWithIdentifier:@"particleVC"]; 99 | }else if (indexPath.row == 8) {//QQ粘性布局 100 | 101 | vc = [story instantiateViewControllerWithIdentifier:@"BageValueVC"]; 102 | }else if (indexPath.row == 9) {//微博动画 103 | 104 | vc = [story instantiateViewControllerWithIdentifier:@"weiboVC"]; 105 | }else if (indexPath.row == 10) {//打马赛克 106 | 107 | vc = [story instantiateViewControllerWithIdentifier:@"mosaicVC"]; 108 | } 109 | 110 | //跳转 111 | [self.navigationController pushViewController:vc animated:YES]; 112 | } 113 | 114 | 115 | 116 | 117 | - (void)didReceiveMemoryWarning { 118 | [super didReceiveMemoryWarning]; 119 | // Dispose of any resources that can be recreated. 120 | } 121 | @end 122 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Controllers/JGRotaryTableViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // JGRotaryTableViewController.h 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/11. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface JGRotaryTableViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Controllers/JGRotaryTableViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // JGRotaryTableViewController.m 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/11. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import "JGRotaryTableViewController.h" 10 | #import "JGWheelView.h" 11 | 12 | 13 | @interface JGRotaryTableViewController () 14 | 15 | @property (nonatomic, weak) JGWheelView *wheels; 16 | 17 | @end 18 | 19 | @implementation JGRotaryTableViewController 20 | 21 | - (void)viewDidLoad { 22 | [super viewDidLoad]; 23 | // Do any additional setup after loading the view. 24 | 25 | JGWheelView *wheels = [JGWheelView wheelsView]; 26 | wheels.center = self.view.center; 27 | self.wheels = wheels; 28 | [self.view addSubview:wheels]; 29 | 30 | } 31 | 32 | - (IBAction)startBtnClick:(UIButton *)sender { 33 | [self.wheels start]; 34 | } 35 | 36 | - (IBAction)stopBtnClick:(UIButton *)sender { 37 | [self.wheels stop]; 38 | } 39 | 40 | 41 | 42 | - (void)didReceiveMemoryWarning { 43 | [super didReceiveMemoryWarning]; 44 | // Dispose of any resources that can be recreated. 45 | } 46 | 47 | /* 48 | #pragma mark - Navigation 49 | 50 | // In a storyboard-based application, you will often want to do a little preparation before navigation 51 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 52 | // Get the new view controller using [segue destinationViewController]. 53 | // Pass the selected object to the new view controller. 54 | } 55 | */ 56 | 57 | @end 58 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Controllers/JGWeiBoAniController.h: -------------------------------------------------------------------------------- 1 | // 2 | // JGWeiBoAniController.h 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/12. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface JGWeiBoAniController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Controllers/JGWeiBoAniController.m: -------------------------------------------------------------------------------- 1 | // 2 | // JGWeiBoAniController.m 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/12. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import "JGWeiBoAniController.h" 10 | #import "JGWeiBoComposeController.h" 11 | #import "JGMuneItem.h" 12 | 13 | 14 | 15 | @interface JGWeiBoAniController () 16 | 17 | @end 18 | 19 | @implementation JGWeiBoAniController 20 | 21 | - (void)viewDidLoad { 22 | [super viewDidLoad]; 23 | // Do any additional setup after loading the view. 24 | } 25 | 26 | - (IBAction)btnClick:(UIButton *)sender { 27 | 28 | 29 | JGWeiBoComposeController *vc = [[JGWeiBoComposeController alloc] init]; 30 | 31 | 32 | JGMuneItem *item = [JGMuneItem itemWithTitle:@"点评" image:[UIImage imageNamed:@"tabbar_compose_review"]]; 33 | JGMuneItem *item1 = [JGMuneItem itemWithTitle:@"更多" image:[UIImage imageNamed:@"tabbar_compose_more"]]; 34 | JGMuneItem *item2 = [JGMuneItem itemWithTitle:@"拍摄" image:[UIImage imageNamed:@"tabbar_compose_camera"]]; 35 | JGMuneItem *item3 = [JGMuneItem itemWithTitle:@"相册" image:[UIImage imageNamed:@"tabbar_compose_photo"]]; 36 | JGMuneItem *item4 = [JGMuneItem itemWithTitle:@"文字" image:[UIImage imageNamed:@"tabbar_compose_idea"]]; 37 | JGMuneItem *item5 = [JGMuneItem itemWithTitle:@"签到" image:[UIImage imageNamed:@"tabbar_compose_review"]]; 38 | 39 | vc.itemArray = @[item,item1,item2,item3,item4,item5]; 40 | 41 | [self presentViewController:vc animated:YES completion:nil]; 42 | } 43 | 44 | 45 | 46 | 47 | - (void)didReceiveMemoryWarning { 48 | [super didReceiveMemoryWarning]; 49 | // Dispose of any resources that can be recreated. 50 | } 51 | 52 | /* 53 | #pragma mark - Navigation 54 | 55 | // In a storyboard-based application, you will often want to do a little preparation before navigation 56 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 57 | // Get the new view controller using [segue destinationViewController]. 58 | // Pass the selected object to the new view controller. 59 | } 60 | */ 61 | 62 | @end 63 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Controllers/JGWeiBoComposeController.h: -------------------------------------------------------------------------------- 1 | // 2 | // JGWeiBoComposeController.h 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/12. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface JGWeiBoComposeController : UIViewController 12 | 13 | @property (nonatomic, strong) NSArray *itemArray; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Controllers/JGWeiBoComposeController.m: -------------------------------------------------------------------------------- 1 | // 2 | // JGWeiBoComposeController.m 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/12. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import "JGWeiBoComposeController.h" 10 | #import "JGMuneItem.h" 11 | #import "JGItemBtn.h" 12 | 13 | #define kDeviceHight [UIScreen mainScreen].bounds.size.height 14 | #define kDeviceWidth [UIScreen mainScreen].bounds.size.width 15 | 16 | 17 | @interface JGWeiBoComposeController () 18 | 19 | 20 | @property(nonatomic,strong)NSMutableArray *btnArray; 21 | 22 | @property(nonatomic,assign)int btnIndex; 23 | 24 | @property(nonatomic,strong)NSTimer *timer; 25 | @end 26 | 27 | @implementation JGWeiBoComposeController 28 | 29 | - (NSMutableArray *)btnArray { 30 | if (!_btnArray) { 31 | _btnArray = [NSMutableArray array]; 32 | } 33 | return _btnArray; 34 | } 35 | 36 | - (void)viewDidLoad { 37 | [super viewDidLoad]; 38 | // Do any additional setup after loading the view. 39 | 40 | //回到上一个界面按钮 41 | [self returnSupVC]; 42 | 43 | [self addBtn]; 44 | 45 | self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(update) userInfo:nil repeats:YES]; 46 | 47 | 48 | } 49 | 50 | - (void)returnSupVC { 51 | 52 | UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 200, 50)]; 53 | btn.backgroundColor = [UIColor lightGrayColor]; 54 | [btn setTitle:@"返回上一界面" forState:UIControlStateNormal]; 55 | btn.center = CGPointMake(kDeviceWidth * 0.5, kDeviceHight * 0.9); 56 | [self.view addSubview:btn]; 57 | [btn addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside]; 58 | 59 | } 60 | 61 | - (void)back { 62 | 63 | [self dismissViewControllerAnimated:YES completion:nil]; 64 | 65 | } 66 | 67 | 68 | 69 | 70 | //每隔0.1秒调用一次 71 | - (void)update { 72 | 73 | //如果当前的角标等于当前按钮的个数 74 | //让定时器停止 75 | if (self.btnIndex == self.btnArray.count) { 76 | [self.timer invalidate]; 77 | return; 78 | } 79 | 80 | //每次取出一个按钮 81 | UIButton *btn = self.btnArray[self.btnIndex]; 82 | //取消所有形变 83 | [UIView animateWithDuration:0.4 delay:0 usingSpringWithDamping:0.8 initialSpringVelocity:0 options:UIViewAnimationOptionCurveLinear animations:^{ 84 | btn.transform = CGAffineTransformIdentity; 85 | } completion:nil]; 86 | 87 | self.btnIndex++; 88 | 89 | } 90 | 91 | - (void)addBtn { 92 | 93 | CGFloat btnWH = 100; 94 | int cloumn = 3; 95 | CGFloat margin = ([UIScreen mainScreen].bounds.size.width - cloumn * btnWH) / (cloumn + 1); 96 | CGFloat x = 0; 97 | CGFloat y = 0; 98 | int curCloumn = 0; 99 | int curRow = 0; 100 | CGFloat oriY = 300; 101 | 102 | for (int i = 0; i < self.itemArray.count; i++) { 103 | 104 | JGItemBtn *btn = [JGItemBtn buttonWithType:UIButtonTypeCustom]; 105 | 106 | //当前所在的列 107 | curCloumn = i % cloumn; 108 | //当前所在的行 109 | curRow = i / cloumn; 110 | 111 | x = margin + (btnWH + margin) * curCloumn; 112 | y = oriY + (btnWH + margin) * curRow; 113 | btn.frame = CGRectMake(x, y, btnWH, btnWH); 114 | 115 | 116 | JGMuneItem *item = self.itemArray[i]; 117 | //设置按钮图片 118 | [btn setImage:item.image forState:UIControlStateNormal]; 119 | //设置按钮文字 120 | [btn setTitle:item.title forState:UIControlStateNormal]; 121 | [self.view addSubview:btn]; 122 | 123 | //开始时让所有按钮都移动到最底部 124 | btn.transform = CGAffineTransformMakeTranslation(0, self.view.bounds.size.height); 125 | [self.btnArray addObject:btn]; 126 | 127 | //监听按钮点击 128 | [btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchDown]; 129 | [btn addTarget:self action:@selector(btnClick1:) forControlEvents:UIControlEventTouchUpInside]; 130 | } 131 | } 132 | 133 | //当手指按下的时调用 134 | - (void)btnClick:(UIButton *)btn { 135 | 136 | [UIView animateWithDuration:0.5f animations:^{ 137 | 138 | btn.transform = CGAffineTransformMakeScale(1.2, 1.2); 139 | }]; 140 | } 141 | 142 | //当手指抬起时调用 143 | - (void)btnClick1:(UIButton *)btn { 144 | //让按钮放大,变成透明 145 | [UIView animateWithDuration:0.5f animations:^{ 146 | btn.alpha = 0; 147 | btn.transform = CGAffineTransformMakeScale(2, 2); 148 | }]; 149 | } 150 | 151 | - (void)didReceiveMemoryWarning { 152 | [super didReceiveMemoryWarning]; 153 | // Dispose of any resources that can be recreated. 154 | } 155 | 156 | 157 | 158 | @end 159 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/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 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | UIInterfaceOrientationLandscapeRight 38 | 39 | UISupportedInterfaceOrientations~ipad 40 | 41 | UIInterfaceOrientationPortrait 42 | UIInterfaceOrientationPortraitUpsideDown 43 | UIInterfaceOrientationLandscapeLeft 44 | UIInterfaceOrientationLandscapeRight 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Models/JGMuneItem.h: -------------------------------------------------------------------------------- 1 | // 2 | // JGMuneItem.h 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/12. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | 13 | @interface JGMuneItem : NSObject 14 | 15 | /** 图片 */ 16 | @property (nonatomic, strong) UIImage *image; 17 | /** 标题 */ 18 | @property (nonatomic, strong)NSString *title; 19 | 20 | + (instancetype)itemWithTitle:(NSString *)title image:(UIImage *)image; 21 | 22 | 23 | @end 24 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Models/JGMuneItem.m: -------------------------------------------------------------------------------- 1 | // 2 | // JGMuneItem.m 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/12. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import "JGMuneItem.h" 10 | 11 | @implementation JGMuneItem 12 | 13 | + (instancetype)itemWithTitle:(NSString *)title image:(UIImage *)image { 14 | 15 | JGMuneItem *item = [[self alloc] init]; 16 | item.title = title; 17 | item.image = image; 18 | return item; 19 | } 20 | 21 | 22 | 23 | @end 24 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Views/JGBageValue.h: -------------------------------------------------------------------------------- 1 | // 2 | // JGBageValue.h 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/12. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface JGBageValue : UIButton 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Views/JGBageValue.m: -------------------------------------------------------------------------------- 1 | // 2 | // JGBageValue.m 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/12. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import "JGBageValue.h" 10 | #define kDeviceHight [UIScreen mainScreen].bounds.size.height 11 | #define kDeviceWidth [UIScreen mainScreen].bounds.size.width 12 | 13 | @interface JGBageValue () 14 | 15 | @property (nonatomic, weak) UIView *smallCircle; 16 | @property (nonatomic, weak) CAShapeLayer *shap; 17 | 18 | 19 | 20 | 21 | @end 22 | 23 | @implementation JGBageValue 24 | 25 | - (CAShapeLayer *)shap { 26 | if (!_shap) { 27 | //创建形状图层 28 | CAShapeLayer *shap = [CAShapeLayer layer]; 29 | //设置形状的填充颜色 30 | shap.fillColor = [UIColor redColor].CGColor; 31 | _shap = shap; 32 | [self.superview.layer insertSublayer:shap atIndex:0]; 33 | } 34 | return _shap; 35 | } 36 | 37 | - (void)awakeFromNib { 38 | [self setUp]; 39 | } 40 | 41 | - (instancetype)initWithFrame:(CGRect)frame { 42 | 43 | if (self = [super initWithFrame:frame]) { 44 | [self setUp]; 45 | } 46 | return self; 47 | } 48 | 49 | 50 | //初始化 51 | - (void)setUp { 52 | 53 | //设置圆角 54 | self.layer.cornerRadius = self.bounds.size.width * 0.5; 55 | //设置字体大小 56 | self.titleLabel.font = [UIFont systemFontOfSize:12]; 57 | //设置背景颜色 58 | [self setBackgroundColor:[UIColor redColor]]; 59 | //添加手势 60 | UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)]; 61 | [self addGestureRecognizer:pan]; 62 | 63 | //添加小圆 64 | UIView *smallCircle = [[UIView alloc] initWithFrame:self.bounds]; 65 | smallCircle.center = CGPointMake(kDeviceWidth * 0.5, kDeviceHight * 0.5); 66 | smallCircle.layer.cornerRadius = self.layer.cornerRadius; 67 | smallCircle.backgroundColor = self.backgroundColor; 68 | self.smallCircle = smallCircle; 69 | // NSLog(@"%@", [self.superview class]); 70 | 71 | [self.superview insertSubview:smallCircle belowSubview:self]; 72 | 73 | } 74 | 75 | //当手指开始拖动的时候调用 76 | - (void)pan:(UIPanGestureRecognizer *)pan { 77 | 78 | //当前移动的偏移量 79 | CGPoint tranP = [pan translationInView:self]; 80 | 81 | CGPoint center = self.center; 82 | center.x += tranP.x; 83 | center.y += tranP.y; 84 | self.center = center; 85 | 86 | //复位 87 | [pan setTranslation:CGPointZero inView:self]; 88 | 89 | CGFloat disatnce = [self distanceWithSmallCircle:self.smallCircle bigCircle:self]; 90 | 91 | //取出小圆半径 92 | CGFloat redius = self.bounds.size.width * 0.5; 93 | redius = redius - disatnce / 10; 94 | //重新设置小圆的宽高 95 | self.smallCircle.bounds = CGRectMake(0, 0, redius * 2, redius * 2); 96 | self.smallCircle.layer.cornerRadius = redius; 97 | 98 | if (self.smallCircle.hidden == NO) { 99 | 100 | //返回一个不规则的路径 101 | UIBezierPath *path = [self pathWithSmallCircle:self.smallCircle bigCircle:self]; 102 | //把路径转换成图形 103 | self.shap.path = path.CGPath; 104 | } 105 | 106 | if (disatnce > 60) { 107 | self.smallCircle.hidden = YES; 108 | [self.shap removeFromSuperlayer]; 109 | 110 | } 111 | 112 | if (pan.state == UIGestureRecognizerStateEnded) { 113 | 114 | if (disatnce < 60) { 115 | [self.shap removeFromSuperlayer]; 116 | self.center = self.smallCircle.center; 117 | self.smallCircle.hidden = NO; 118 | }else { 119 | 120 | //播放一个动画 121 | UIImageView *imageV = [[UIImageView alloc] initWithFrame:self.bounds]; 122 | 123 | NSMutableArray *imageArray = [NSMutableArray array]; 124 | 125 | for (int i = 0; i < 8; i++) { 126 | 127 | NSString *imageName = [NSString stringWithFormat:@"%d",i+1]; 128 | UIImage *image = [UIImage imageNamed:imageName]; 129 | [imageArray addObject:image]; 130 | 131 | } 132 | 133 | imageV.animationImages = imageArray; 134 | [imageV setAnimationDuration:1.0f]; 135 | [imageV startAnimating]; 136 | [self addSubview:imageV]; 137 | 138 | //消失 139 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 140 | 141 | [self removeFromSuperview]; 142 | }); 143 | } 144 | } 145 | } 146 | 147 | //计算两圆之间的距离 148 | - (CGFloat)distanceWithSmallCircle:(UIView *)smallCircle bigCircle:(UIView *)bigCircle { 149 | 150 | CGFloat offsetX = bigCircle.center.x - smallCircle.center.x; 151 | CGFloat offsetY = bigCircle.center.y - smallCircle.center.y; 152 | 153 | return sqrtf(offsetX * offsetX + offsetY * offsetY); 154 | } 155 | 156 | //根据两个圆描述一个不规则路径 157 | - (UIBezierPath *)pathWithSmallCircle:(UIView *)smallCircle bigCircle:(UIView *)bigCircle { 158 | 159 | CGFloat x1 = smallCircle.center.x; 160 | CGFloat x2 = bigCircle.center.x; 161 | 162 | CGFloat y1 = smallCircle.center.y; 163 | CGFloat y2 = bigCircle.center.y; 164 | 165 | CGFloat d = [self distanceWithSmallCircle:smallCircle bigCircle:bigCircle]; 166 | 167 | 168 | CGFloat cosΘ = (y2 - y1) / d; 169 | CGFloat sinΘ = (x2 - x1) / d; 170 | 171 | CGFloat r1 = smallCircle.bounds.size.width * 0.5; 172 | CGFloat r2 = bigCircle.bounds.size.width * 0.5; 173 | 174 | 175 | CGPoint pointA = CGPointMake(x1 - r1 * cosΘ, y1 + r1 * sinΘ); 176 | CGPoint pointB = CGPointMake(x1 + r1 * cosΘ, y1 - r1 * sinΘ); 177 | CGPoint pointC = CGPointMake(x2 + r2 * cosΘ, y2 - r2 * sinΘ); 178 | CGPoint pointD = CGPointMake(x2 - r2 * cosΘ, y2 + r2 * sinΘ); 179 | CGPoint pointO = CGPointMake(pointA.x + d * 0.5 * sinΘ, pointA.y + d * 0.5 * cosΘ); 180 | CGPoint pointP = CGPointMake(pointB.x + d * 0.5 * sinΘ, pointB.y + d * 0.5 * cosΘ); 181 | 182 | //描述路径 183 | UIBezierPath *path = [UIBezierPath bezierPath]; 184 | //AB 185 | [path moveToPoint:pointA]; 186 | [path addLineToPoint:pointB]; 187 | //BC(曲线) 188 | [path addQuadCurveToPoint:pointC controlPoint:pointP]; 189 | //CD 190 | [path addLineToPoint:pointD]; 191 | //DA(曲线) 192 | [path addQuadCurveToPoint:pointA controlPoint:pointO]; 193 | 194 | return path; 195 | } 196 | 197 | 198 | 199 | 200 | /* 201 | // Only override drawRect: if you perform custom drawing. 202 | // An empty implementation adversely affects performance during animation. 203 | - (void)drawRect:(CGRect)rect { 204 | // Drawing code 205 | } 206 | */ 207 | 208 | - (void)setHighlighted:(BOOL)highlighted { 209 | 210 | } 211 | 212 | @end 213 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Views/JGItemBtn.h: -------------------------------------------------------------------------------- 1 | // 2 | // JGItemBtn.h 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/12. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface JGItemBtn : UIButton 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Views/JGItemBtn.m: -------------------------------------------------------------------------------- 1 | // 2 | // JGItemBtn.m 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/12. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import "JGItemBtn.h" 10 | 11 | @implementation JGItemBtn 12 | 13 | - (void)awakeFromNib { 14 | [self setUp]; 15 | } 16 | 17 | - (instancetype)initWithFrame:(CGRect)frame { 18 | 19 | if (self = [super initWithFrame:frame]) { 20 | [self setUp]; 21 | } 22 | return self; 23 | } 24 | 25 | 26 | - (void)setUp { 27 | self.imageView.contentMode = UIViewContentModeCenter; 28 | self.titleLabel.textAlignment = NSTextAlignmentCenter; 29 | [self setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; 30 | } 31 | 32 | //-(CGRect)imageRectForContentRect:(CGRect)contentRect{ 33 | // 34 | //} 35 | 36 | //-(CGRect)titleRectForContentRect:(CGRect)contentRect{ 37 | //} 38 | 39 | //重新对子控件布局 40 | - (void)layoutSubviews { 41 | 42 | [super layoutSubviews]; 43 | 44 | CGFloat imageW = self.bounds.size.width; 45 | CGFloat imageH = self.bounds.size.height * 0.8; 46 | CGFloat imageX = 0; 47 | CGFloat imageY = 0; 48 | self.imageView.frame = CGRectMake(imageX, imageY, imageW, imageH); 49 | 50 | CGFloat labelX = imageX; 51 | CGFloat labelY = imageH; 52 | CGFloat labelW = imageW; 53 | CGFloat labelH = self.bounds.size.height - imageH; 54 | self.titleLabel.frame = CGRectMake(labelX, labelY, labelW, labelH); 55 | } 56 | 57 | 58 | - (void)setHighlighted:(BOOL)highlighted { 59 | 60 | } 61 | 62 | 63 | 64 | /* 65 | // Only override drawRect: if you perform custom drawing. 66 | // An empty implementation adversely affects performance during animation. 67 | - (void)drawRect:(CGRect)rect { 68 | // Drawing code 69 | } 70 | */ 71 | 72 | @end 73 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Views/JGMosaicView.h: -------------------------------------------------------------------------------- 1 | // 2 | // JGMosaicView.h 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/12. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface JGMosaicView : UIView 12 | 13 | /** 14 | 要刮的底图. 15 | */ 16 | @property (nonatomic, strong) UIImage *image; 17 | /** 18 | 涂层图片. 19 | */ 20 | @property (nonatomic, strong) UIImage *surfaceImage; 21 | 22 | /** 模糊区域大小 */ 23 | @property (nonatomic, assign) CGFloat mosaicValue; 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Views/JGMosaicView.m: -------------------------------------------------------------------------------- 1 | // 2 | // JGMosaicView.m 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/12. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import "JGMosaicView.h" 10 | 11 | @interface JGMosaicView () { 12 | CGFloat _record; 13 | } 14 | 15 | @property (nonatomic, strong) UIImageView *surfaceImageView; 16 | 17 | @property (nonatomic, strong) CALayer *imageLayer; 18 | 19 | @property (nonatomic, strong) CAShapeLayer *shapeLayer; 20 | 21 | @property (nonatomic, assign) CGMutablePathRef path; 22 | 23 | @end 24 | 25 | 26 | 27 | @implementation JGMosaicView 28 | 29 | 30 | - (void)awakeFromNib { 31 | [self setUp]; 32 | } 33 | 34 | - (instancetype)initWithFrame:(CGRect)frame { 35 | if (self = [super initWithFrame:frame]) { 36 | [self setUp]; 37 | } 38 | return self; 39 | } 40 | 41 | //模糊区域大小 42 | - (void)setMosaicValue:(CGFloat)mosaicValue { 43 | _mosaicValue = mosaicValue; 44 | 45 | if (_record == 0) { 46 | _record = mosaicValue; 47 | } 48 | 49 | if (_record != mosaicValue) return; 50 | //设置马赛克的模糊区域大小 51 | self.shapeLayer.lineWidth = (self.mosaicValue == 0) ? 10.f : self.mosaicValue; 52 | } 53 | 54 | 55 | - (void)setUp { 56 | 57 | 58 | //添加imageview(surfaceImageView)到self上 59 | self.surfaceImageView = [[UIImageView alloc] initWithFrame:self.bounds]; 60 | [self addSubview:self.surfaceImageView]; 61 | //添加layer(imageLayer)到self上 62 | self.imageLayer = [CALayer layer]; 63 | self.imageLayer.frame = self.bounds; 64 | [self.layer addSublayer:self.imageLayer]; 65 | 66 | self.shapeLayer = [CAShapeLayer layer]; 67 | self.shapeLayer.frame = self.bounds; 68 | self.shapeLayer.lineCap = kCALineCapRound; 69 | self.shapeLayer.lineJoin = kCALineJoinRound; 70 | 71 | // NSLog(@"%f -- %f ",self.mosaicValue, _mosaicValue); 72 | 73 | // self.shapeLayer.lineWidth = (self.mosaicValue == 0) ? 10.f : self.mosaicValue; 74 | self.shapeLayer.strokeColor = [UIColor blueColor].CGColor; 75 | self.shapeLayer.fillColor = nil; //此处设置颜色有异常效果,可以自己试试 76 | 77 | [self.layer addSublayer:self.shapeLayer]; 78 | self.imageLayer.mask = self.shapeLayer; 79 | 80 | self.path = CGPathCreateMutable(); 81 | } 82 | 83 | - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 84 | 85 | [super touchesBegan:touches withEvent:event]; 86 | 87 | UITouch *touch = [touches anyObject]; 88 | CGPoint point = [touch locationInView:self]; 89 | CGPathMoveToPoint(self.path, NULL, point.x, point.y); 90 | CGMutablePathRef path = CGPathCreateMutableCopy(self.path); 91 | self.shapeLayer.path = path; 92 | CGPathRelease(path); 93 | } 94 | 95 | - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 96 | [super touchesMoved:touches withEvent:event]; 97 | 98 | UITouch *touch = [touches anyObject]; 99 | CGPoint point = [touch locationInView:self]; 100 | CGPathAddLineToPoint(self.path, NULL, point.x, point.y); 101 | CGMutablePathRef path = CGPathCreateMutableCopy(self.path); 102 | self.shapeLayer.path = path; 103 | CGPathRelease(path); 104 | } 105 | 106 | - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 107 | 108 | [super touchesEnded:touches withEvent:event]; 109 | 110 | } 111 | 112 | - (void)setImage:(UIImage *)image { 113 | //底图 114 | _image = image; 115 | self.imageLayer.contents = (__bridge id _Nullable)(image.CGImage); 116 | } 117 | 118 | - (void)setSurfaceImage:(UIImage *)surfaceImage { 119 | //顶图 120 | _surfaceImage = surfaceImage; 121 | self.surfaceImageView.image = surfaceImage; 122 | 123 | } 124 | 125 | 126 | 127 | 128 | - (void)dealloc 129 | { 130 | if (self.path) { 131 | CGPathRelease(self.path); 132 | } 133 | } 134 | 135 | 136 | 137 | 138 | 139 | @end 140 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Views/JGParticleView.h: -------------------------------------------------------------------------------- 1 | // 2 | // JGParticleView.h 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/12. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface JGParticleView : UIView 12 | 13 | //开始 14 | - (void)start; 15 | 16 | //重绘 17 | - (void)reDraw; 18 | 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Views/JGParticleView.m: -------------------------------------------------------------------------------- 1 | // 2 | // JGParticleView.m 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/12. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import "JGParticleView.h" 10 | 11 | @interface JGParticleView () 12 | 13 | @property (nonatomic, strong) UIBezierPath *path; 14 | @property (nonatomic, weak) CALayer *dotLayer; 15 | 16 | @end 17 | 18 | 19 | @implementation JGParticleView 20 | 21 | 22 | + (Class)layerClass { 23 | return [CAReplicatorLayer class]; 24 | } 25 | 26 | - (void)awakeFromNib { 27 | 28 | //添加手势 29 | UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)]; 30 | [self addGestureRecognizer:pan]; 31 | 32 | //创建路径 33 | UIBezierPath *path = [UIBezierPath bezierPath]; 34 | self.path = path; 35 | 36 | //创建粒子 37 | CALayer *dotLayer = [CALayer layer]; 38 | dotLayer.frame = CGRectMake(-10, 0, 10, 10); 39 | dotLayer.backgroundColor = [UIColor redColor].CGColor; 40 | self.dotLayer = dotLayer; 41 | [self.layer addSublayer:dotLayer]; 42 | 43 | CAReplicatorLayer *repL = (CAReplicatorLayer *)self.layer; 44 | repL.instanceCount = 30; 45 | repL.instanceDelay = 0.25; 46 | } 47 | 48 | - (void)pan:(UIPanGestureRecognizer *)pan { 49 | 50 | //开始绘制 51 | CGPoint curP = [pan locationInView:self]; 52 | if (pan.state == UIGestureRecognizerStateBegan) { 53 | 54 | [self.path moveToPoint:curP]; 55 | 56 | }else if (pan.state == UIGestureRecognizerStateChanged) { 57 | 58 | [self.path addLineToPoint:curP]; 59 | //重绘 60 | [self setNeedsDisplay]; 61 | } 62 | 63 | 64 | 65 | 66 | } 67 | 68 | 69 | 70 | 71 | 72 | //开始 73 | - (void)start { 74 | 75 | //添加动画 76 | CAKeyframeAnimation *anim = [CAKeyframeAnimation animation]; 77 | anim.keyPath = @"position"; 78 | anim.path = self.path.CGPath; 79 | anim.repeatCount = MAXFLOAT; 80 | anim.duration = 4; 81 | [self.dotLayer addAnimation:anim forKey:nil]; 82 | } 83 | 84 | //重绘 85 | - (void)reDraw { 86 | 87 | //把路径清空 88 | [self.path removeAllPoints]; 89 | [self setNeedsDisplay]; 90 | 91 | //移除动画 92 | [self.dotLayer removeAllAnimations]; 93 | } 94 | 95 | 96 | 97 | // Only override drawRect: if you perform custom drawing. 98 | // An empty implementation adversely affects performance during animation. 99 | - (void)drawRect:(CGRect)rect { 100 | // Drawing code 101 | [self.path stroke]; 102 | } 103 | 104 | 105 | @end 106 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Views/JGReflectionView.h: -------------------------------------------------------------------------------- 1 | // 2 | // JGReflectionView.h 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/12. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface JGReflectionView : UIView 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Views/JGReflectionView.m: -------------------------------------------------------------------------------- 1 | // 2 | // JGReflectionView.m 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/12. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import "JGReflectionView.h" 10 | 11 | @implementation JGReflectionView 12 | 13 | //返回当前layer的类型 14 | + (Class)layerClass { 15 | return [CAReplicatorLayer class]; 16 | } 17 | 18 | 19 | /* 20 | // Only override drawRect: if you perform custom drawing. 21 | // An empty implementation adversely affects performance during animation. 22 | - (void)drawRect:(CGRect)rect { 23 | // Drawing code 24 | } 25 | */ 26 | 27 | @end 28 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Views/JGWheelView.h: -------------------------------------------------------------------------------- 1 | // 2 | // JGWheelView.h 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/11. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface JGWheelView : UIView 12 | 13 | //快速创建一个WheelView 14 | +(instancetype)wheelsView; 15 | 16 | 17 | //开始旋转 18 | -(void)start; 19 | //暂停旋转 20 | - (void)stop; 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Views/JGWheelView.m: -------------------------------------------------------------------------------- 1 | // 2 | // JGWheelView.m 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/11. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import "JGWheelView.h" 10 | #import "JGWheelsBtn.h" 11 | 12 | 13 | @interface JGWheelView () 14 | 15 | @property (weak, nonatomic) IBOutlet UIImageView *ContentV; 16 | 17 | @property(nonatomic,weak)JGWheelsBtn *preBtn; 18 | 19 | @property(nonatomic,strong) CADisplayLink *link; 20 | 21 | @end 22 | 23 | 24 | @implementation JGWheelView 25 | 26 | - (CADisplayLink *)link { 27 | 28 | if (!_link) { 29 | _link = [CADisplayLink displayLinkWithTarget:self selector:@selector(upDate)]; 30 | [_link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; 31 | } 32 | 33 | return _link; 34 | } 35 | 36 | - (void)upDate { 37 | 38 | //让转盘开始旋转 39 | self.ContentV.transform = CGAffineTransformRotate(self.ContentV.transform, M_PI / 200.0); 40 | } 41 | 42 | //开始旋转 43 | -(void)start { 44 | 45 | self.link.paused = NO; 46 | } 47 | //暂停旋转 48 | - (void)stop { 49 | 50 | self.link.paused = YES; 51 | } 52 | 53 | //开始选号 54 | - (IBAction)startChoose:(UIButton *)sender { 55 | 56 | CABasicAnimation *anim = [CABasicAnimation animation]; 57 | anim.keyPath = @"transform.rotation"; 58 | anim.toValue = @(M_PI * 3); 59 | anim.duration = 1; 60 | [self.ContentV.layer addAnimation:anim forKey:nil]; 61 | } 62 | 63 | 64 | //快速创建一个WheelView 65 | +(instancetype)wheelsView { 66 | return [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self) owner:nil options:nil] lastObject]; 67 | } 68 | 69 | - (void)awakeFromNib { 70 | 71 | [self setUp]; 72 | } 73 | 74 | - (instancetype)initWithFrame:(CGRect)frame { 75 | 76 | if (self = [super initWithFrame:frame]) { 77 | 78 | self = [[[NSBundle mainBundle] loadNibNamed:@"JGWheelView" owner:nil options:nil] lastObject]; 79 | //添加按钮 80 | [self setUp]; 81 | } 82 | return self; 83 | 84 | } 85 | 86 | 87 | - (void)setUp { 88 | 89 | self.ContentV.userInteractionEnabled = YES; 90 | 91 | //创建按钮 92 | CGFloat btnW = 68; 93 | CGFloat btnH = 143; 94 | CGFloat angle = 0; 95 | 96 | //加载原始图片 97 | UIImage *orgImg = [UIImage imageNamed:@"LuckyAstrology"]; 98 | UIImage *oriSelImg = [UIImage imageNamed:@"LuckyAstrologyPressed"]; 99 | 100 | //获取当前屏幕与像素坐标的比例 101 | CGFloat scale = [UIScreen mainScreen].scale * 1.0f; 102 | 103 | // NSLog(@"========== %f == %@",scale, NSStringFromCGSize(orgImg.size)); 104 | 105 | 106 | CGFloat clipW = orgImg.size.width / 12 * scale; 107 | CGFloat clipH = orgImg.size.height * scale; 108 | CGFloat clipX = 0; 109 | CGFloat clipY = 0; 110 | 111 | 112 | for (int i = 0; i < 12; i++) { 113 | 114 | JGWheelsBtn *btn = [JGWheelsBtn buttonWithType:UIButtonTypeCustom]; 115 | //设置按钮的尺寸 116 | btn.bounds = CGRectMake(0, 0, btnW, btnH); 117 | btn.layer.anchorPoint = CGPointMake(0.5, 1); 118 | btn.layer.position = CGPointMake(self.bounds.size.width * 0.5, self.bounds.size.height * 0.5); 119 | 120 | //裁剪图片当中的某一块区域 121 | clipX = i * clipW; 122 | CGRect rect = CGRectMake(clipX, clipY, clipW, clipH); 123 | 124 | // NSLog(@"8888888 %@",NSStringFromCGRect(rect)); 125 | 126 | //裁剪正常状态下的图片 127 | CGImageRef clipImage = CGImageCreateWithImageInRect(orgImg.CGImage, rect); 128 | //裁剪选中状态下的图片 129 | CGImageRef clipSelImage = CGImageCreateWithImageInRect(oriSelImg.CGImage, rect); 130 | 131 | // btn.backgroundColor = [UIColor greenColor]; 132 | 133 | //设置按钮的图片 134 | //把CGImageRef转成UIImage 135 | UIImage *clipNewImage = [UIImage imageWithCGImage:clipImage]; 136 | [btn setImage:clipNewImage forState:UIControlStateNormal]; 137 | 138 | //设置选中状态下的图片 139 | UIImage *clipSelNewImage = [UIImage imageWithCGImage:clipSelImage]; 140 | [btn setImage:clipSelNewImage forState:UIControlStateSelected]; 141 | 142 | //设置选中的图片 143 | [btn setBackgroundImage:[UIImage imageNamed:@"LuckyRototeSelected"] forState:UIControlStateSelected]; 144 | //监听按钮的点击 145 | [btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside]; 146 | //添加按钮 147 | [self.ContentV addSubview:btn]; 148 | 149 | //让每个按钮进行旋转 150 | btn.transform = CGAffineTransformMakeRotation(angle / 180.0 * M_PI); 151 | angle += 30; 152 | if (i == 0) { 153 | [self btnClick:btn]; 154 | } 155 | } 156 | } 157 | 158 | //当按钮点击的时候调用 159 | - (void)btnClick:(JGWheelsBtn *)btn { 160 | 161 | //让上一个选中按钮取消选中的状态 162 | self.preBtn.selected = NO; 163 | //让当前选中的按钮成为选中状态. 164 | btn.selected = YES; 165 | //把当前的按钮赋值给上一个按钮 166 | self.preBtn = btn; 167 | } 168 | 169 | 170 | @end 171 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Views/JGWheelView.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Views/JGWheelsBtn.h: -------------------------------------------------------------------------------- 1 | // 2 | // JGWheelsBtn.h 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/11. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface JGWheelsBtn : UIButton 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/Views/JGWheelsBtn.m: -------------------------------------------------------------------------------- 1 | // 2 | // JGWheelsBtn.m 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/11. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import "JGWheelsBtn.h" 10 | 11 | @implementation JGWheelsBtn 12 | 13 | //返回按钮当中的UIImageView的尺寸位置 14 | //contentRect:当前按钮的尺寸位置 15 | - (CGRect)imageRectForContentRect:(CGRect)contentRect { 16 | CGFloat w = 40; 17 | CGFloat h = 50; 18 | CGFloat x = (contentRect.size.width - w) * 0.5; 19 | CGFloat y = 20; 20 | return CGRectMake(x, y, w, h); 21 | } 22 | 23 | //取消按钮高亮状态下做的事情 24 | - (void)setHighlighted:(BOOL)highlighted { 25 | 26 | } 27 | 28 | 29 | @end 30 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayer/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // JGCALayer 4 | // 5 | // Created by stkcctv on 16/9/11. 6 | // Copyright © 2016年 stkcctv. 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 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayerTests/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 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayerTests/JGCALayerTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // JGCALayerTests.m 3 | // JGCALayerTests 4 | // 5 | // Created by stkcctv on 16/9/11. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface JGCALayerTests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation JGCALayerTests 16 | 17 | - (void)setUp { 18 | [super setUp]; 19 | // Put setup code here. This method is called before the invocation of each test method in the class. 20 | } 21 | 22 | - (void)tearDown { 23 | // Put teardown code here. This method is called after the invocation of each test method in the class. 24 | [super tearDown]; 25 | } 26 | 27 | - (void)testExample { 28 | // This is an example of a functional test case. 29 | // Use XCTAssert and related functions to verify your tests produce the correct results. 30 | } 31 | 32 | - (void)testPerformanceExample { 33 | // This is an example of a performance test case. 34 | [self measureBlock:^{ 35 | // Put the code you want to measure the time of here. 36 | }]; 37 | } 38 | 39 | @end 40 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayerUITests/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 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /JGCALayer/JGCALayerUITests/JGCALayerUITests.m: -------------------------------------------------------------------------------- 1 | // 2 | // JGCALayerUITests.m 3 | // JGCALayerUITests 4 | // 5 | // Created by stkcctv on 16/9/11. 6 | // Copyright © 2016年 stkcctv. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface JGCALayerUITests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation JGCALayerUITests 16 | 17 | - (void)setUp { 18 | [super setUp]; 19 | 20 | // Put setup code here. This method is called before the invocation of each test method in the class. 21 | 22 | // In UI tests it is usually best to stop immediately when a failure occurs. 23 | self.continueAfterFailure = NO; 24 | // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. 25 | [[[XCUIApplication alloc] init] launch]; 26 | 27 | // 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. 28 | } 29 | 30 | - (void)tearDown { 31 | // Put teardown code here. This method is called after the invocation of each test method in the class. 32 | [super tearDown]; 33 | } 34 | 35 | - (void)testExample { 36 | // Use recording to get started writing UI tests. 37 | // Use XCTAssert and related functions to verify your tests produce the correct results. 38 | } 39 | 40 | @end 41 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # JGCALayer 2 | ##核心动画基本使用 3 | ###效果图 4 | ![Mou icon](https://github.com/mengzhihun6/JGCALayer/blob/master/JGCALayer.gif) 5 | 6 | ##此Demo所包含的功能 7 | 8 | _dataArray = @[@"01 - CALayer的基本操作", 9 | @""02 - 时钟效果", 10 | @"03 - 心跳效果/转场动画", 11 | @"04 - 转盘", 12 | @"05 - 图片折叠", 13 | @"06 - 音乐震动条/复制层", 14 | @"07 - 倒影", 15 | @"08 - 粒子效果", 16 | @"09 - QQ粘性布局", 17 | @"10 - 微博动画", 18 | @"11 - 打马赛克"]; 19 | --------------------------------------------------------------------------------