├── .gitignore ├── LICENSE ├── LUNTutorialDemo ├── LUNTutorialDemo.xcodeproj │ ├── project.pbxproj │ └── project.xcworkspace │ │ └── contents.xcworkspacedata ├── LUNTutorialDemo.xcworkspace │ └── contents.xcworkspacedata ├── LUNTutorialDemo │ ├── AppDelegate.h │ ├── AppDelegate.m │ ├── Assets.xcassets │ │ ├── Animals │ │ │ ├── Contents.json │ │ │ ├── backgrounds │ │ │ │ ├── Contents.json │ │ │ │ ├── animalBackground1.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── animalBackground1@2x.png │ │ │ │ │ └── animalBackground1@3x.png │ │ │ │ ├── animalBackground2.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── animalBackground2@2x.png │ │ │ │ │ └── animalBackground2@3x.png │ │ │ │ └── animalBackground3.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── animalBackground2@2x.png │ │ │ │ │ └── animalBackground2@3x.png │ │ │ ├── icons │ │ │ │ ├── Contents.json │ │ │ │ ├── icon1.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── icon1@2x.png │ │ │ │ │ └── icon1@3x.png │ │ │ │ ├── icon2.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── icon2@2x.png │ │ │ │ │ └── icon2@3x.png │ │ │ │ └── icon3.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── icon3@2x.png │ │ │ │ │ └── icon3@3x.png │ │ │ └── wireframes │ │ │ │ ├── Contents.json │ │ │ │ ├── animalWireframe1.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── animalWireframe1@2x.png │ │ │ │ └── animalWireframe1@3x.png │ │ │ │ ├── animalWireframe2.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── animalWireframe2@2x.png │ │ │ │ └── animalWireframe2@3x.png │ │ │ │ └── animalWireframe3.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── animalWireframe3@2x.png │ │ │ │ └── animalWireframe3@3x.png │ │ ├── AppIcon.appiconset │ │ │ └── Contents.json │ │ ├── Contents.json │ │ ├── Galaxy │ │ │ ├── Contents.json │ │ │ ├── firstGalaxyBackground.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── firstBackground@2x.png │ │ │ │ └── firstBackground@3x.png │ │ │ ├── secondGalaxyBackground.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── secondBackground@2x.png │ │ │ │ └── secondBackground@3x.png │ │ │ └── thirdGalaxyBackground.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── thirdBackground@2x.png │ │ │ │ └── thirdBackground@3x.png │ │ ├── Nature │ │ │ ├── Contents.json │ │ │ ├── backgrounds │ │ │ │ ├── Contents.json │ │ │ │ ├── background1.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── background1@2x.png │ │ │ │ │ └── background1@3x.png │ │ │ │ ├── background2.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── background2@2x.png │ │ │ │ │ └── background2@3x.png │ │ │ │ └── background3.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── background3@2x.png │ │ │ │ │ └── background3@3x.png │ │ │ └── wireframes │ │ │ │ ├── Contents.json │ │ │ │ ├── wireframe1.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── wireframe1@2x.png │ │ │ │ └── wireframe1@3x.png │ │ │ │ ├── wireframe2.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── wireframe2@2x.png │ │ │ │ └── wireframe2@3x.png │ │ │ │ └── wireframe3.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── wireframe3@2x.png │ │ │ │ └── wireframe3@3x.png │ │ └── NewYear │ │ │ ├── Contents.json │ │ │ ├── firstPage │ │ │ ├── 1_1Image.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── firstPageFirstImage@2x.png │ │ │ │ └── firstPageFirstImage@3x.png │ │ │ ├── 1_2Image.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── firstPageSecondImage@2x.png │ │ │ │ └── firstPageSecondImage@3x.png │ │ │ ├── 1_3Image.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── firstPageThirdImage@2x.png │ │ │ │ └── firstPageThirdImage@3x.png │ │ │ ├── 1_4Image.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── firstPageFourthImage@2x.png │ │ │ │ └── firstPageFourthImage@3x.png │ │ │ ├── 1_5Image.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── firstPageFifthImage@2x.png │ │ │ │ └── firstPageFifthImage@3x.png │ │ │ ├── 1_6Image.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── firstPageSixthImage@2x.png │ │ │ │ └── firstPageSixthImage@3x.png │ │ │ ├── Contents.json │ │ │ └── firstSlidingImage.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── firstSlidingImage@2x.png │ │ │ │ └── firstSlidingImage@3x.png │ │ │ ├── gradient1.imageset │ │ │ ├── Contents.json │ │ │ ├── gradient1@2x.png │ │ │ └── gradient1@3x.png │ │ │ ├── gradient2.imageset │ │ │ ├── Contents.json │ │ │ ├── gradient2@2x.png │ │ │ └── gradient2@3x.png │ │ │ ├── gradient3.imageset │ │ │ ├── Contents.json │ │ │ ├── gradient3@2x.png │ │ │ └── gradient3@3x.png │ │ │ ├── newYearBackgroundPattern.imageset │ │ │ ├── Contents.json │ │ │ ├── backgroundPattern@2x.png │ │ │ └── backgroundPattern@3x.png │ │ │ ├── secondPage │ │ │ ├── 2_1Image.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── secondPageFirstImage@2x.png │ │ │ │ └── secondPageFirstImage@3x.png │ │ │ ├── 2_2Image.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── secondPageSecondImage@2x.png │ │ │ │ └── secondPageSecondImage@3x.png │ │ │ ├── 2_3Image.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── secondPageThirdImage@2x.png │ │ │ │ └── secondPageThirdImage@3x.png │ │ │ ├── 2_4Image.imageset │ │ │ │ ├── 2_4Image@2x.png │ │ │ │ ├── 2_4Image@3x.png │ │ │ │ └── Contents.json │ │ │ ├── 2_5Image.imageset │ │ │ │ ├── 2_5Image@2x.png │ │ │ │ ├── 2_5Image@3x.png │ │ │ │ └── Contents.json │ │ │ ├── 2_6Image.imageset │ │ │ │ ├── 2_6Image@2x.png │ │ │ │ ├── 2_6Image@3x.png │ │ │ │ └── Contents.json │ │ │ ├── Contents.json │ │ │ └── secondSlidingImage.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── secondSlidingImage@2x.png │ │ │ │ └── secondSlidingImage@3x.png │ │ │ └── thirdPage │ │ │ ├── 3_1Image.imageset │ │ │ ├── 3_1Image@2x.png │ │ │ ├── 3_1Image@3x.png │ │ │ └── Contents.json │ │ │ ├── 3_2Image.imageset │ │ │ ├── 3_2Image@2x.png │ │ │ ├── 3_2Image@3x.png │ │ │ └── Contents.json │ │ │ ├── 3_3Image.imageset │ │ │ ├── 3_3Image@2x.png │ │ │ ├── 3_3Image@3x.png │ │ │ └── Contents.json │ │ │ ├── 3_4Image.imageset │ │ │ ├── 3_4Image@2x.png │ │ │ ├── 3_4Image@3x.png │ │ │ └── Contents.json │ │ │ ├── 3_5Image.imageset │ │ │ ├── 3_5Image@2x.png │ │ │ ├── 3_5Image@3x.png │ │ │ └── Contents.json │ │ │ ├── 3_6Image.imageset │ │ │ ├── 3_6Image@2x.png │ │ │ ├── 3_6Image@3x.png │ │ │ └── Contents.json │ │ │ ├── Contents.json │ │ │ └── thirdSlidingImage.imageset │ │ │ ├── Contents.json │ │ │ ├── thirdSlidingImage@2x.png │ │ │ └── thirdSlidingImage@3x.png │ ├── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard │ ├── Examples │ │ ├── AnimalsOnboarding │ │ │ ├── LUNAnimalsViewController.h │ │ │ └── LUNAnimalsViewController.m │ │ ├── GalaxyOnboarding │ │ │ ├── GalaxyViews │ │ │ │ ├── LUNGalaxyLabelsView │ │ │ │ │ ├── LUNLabelsView.h │ │ │ │ │ ├── LUNLabelsView.m │ │ │ │ │ └── LUNLabelsView.xib │ │ │ │ └── LUNGalaxyStaticView │ │ │ │ │ ├── LUNStaticView.h │ │ │ │ │ ├── LUNStaticView.m │ │ │ │ │ └── LUNStaticView.xib │ │ │ ├── LUNGalaxyViewController.h │ │ │ └── LUNGalaxyViewController.m │ │ ├── NatureOnboarding │ │ │ ├── LUNNatureViewController.h │ │ │ ├── LUNNatureViewController.m │ │ │ └── LUNNatureWireframe │ │ │ │ ├── LUNNatureWireframeView.h │ │ │ │ ├── LUNNatureWireframeView.m │ │ │ │ └── LUNNatureWireframeView.xib │ │ └── NewYearOnboarding │ │ │ ├── BackgroundPatternedView │ │ │ ├── LUNBackgroundPatternedView.h │ │ │ ├── LUNBackgroundPatternedView.m │ │ │ └── LUNBackgroundPatternedView.xib │ │ │ ├── LUNNewYearViewController.h │ │ │ ├── LUNNewYearViewController.m │ │ │ └── SlidingImageView │ │ │ ├── LUNSlidingImageView.h │ │ │ ├── LUNSlidingImageView.m │ │ │ └── LUNSlidingImageView.xib │ ├── Info.plist │ ├── LUNTapPassingScrollView │ │ ├── LUNTapPassingScrollView │ │ │ ├── LUNTapPassingScrollView.h │ │ │ └── LUNTapPassingScrollView.m │ │ └── UIView+EnumerationForTest │ │ │ ├── UIView+EnumerationForTest.h │ │ │ └── UIView+EnumerationForTest.m │ ├── LUNTutorial │ │ ├── Classes │ │ │ └── LUNTutorialViewController │ │ │ │ ├── LUNTutorialViewController.h │ │ │ │ └── LUNTutorialViewController.m │ │ ├── Interfaces │ │ │ ├── LUNTutorialAnimator │ │ │ │ ├── LUNTutorialAnimator │ │ │ │ │ └── LUNTutorialAnimator.h │ │ │ │ ├── LUNTutorialBackgroundAnimator │ │ │ │ │ └── LUNTutorialBackgroundAnimator.h │ │ │ │ ├── LUNTutorialIconAnimator │ │ │ │ │ └── LUNTutorialIconAnimator.h │ │ │ │ ├── LUNTutorialInnerWireframesAnimator │ │ │ │ │ └── LUNTutorialInnerWirefamesAnimator.h │ │ │ │ ├── LUNTutorialLabelAnimator │ │ │ │ │ └── LUNTutorialLabelAnimator.h │ │ │ │ ├── LUNTutorialWireframesAnimator │ │ │ │ │ └── LUNTutorialWireframeAnimator.h │ │ │ │ └── LUNTutroialScrollAnimator │ │ │ │ │ └── LUNTutorialScrollAnimator.h │ │ │ ├── LUNTutorialDataSource │ │ │ │ ├── LUNTutorialBackgroundDataSource │ │ │ │ │ └── LUNTutorialBackgroundDataSource.h │ │ │ │ ├── LUNTutorialDataSource │ │ │ │ │ └── LUNTutorialDataSource.h │ │ │ │ ├── LUNTutorialIconDataSource │ │ │ │ │ └── LUNTutorialIconDataSource.h │ │ │ │ ├── LUNTutorialInnerWireframesDataSource │ │ │ │ │ └── LUNTutorialInnerWireframesDataSource.h │ │ │ │ ├── LUNTutorialLabelsDataSource │ │ │ │ │ └── LUNTutorialLabelsDataSource.h │ │ │ │ ├── LUNTutorialStaticContentViewDataSource │ │ │ │ │ └── LUNTutorialStaticContentViewDataSource.h │ │ │ │ └── LUNTutorialWireframesDataSource │ │ │ │ │ └── LUNTutorialWireframesDataSource.h │ │ │ └── LUNTutorialDelegate │ │ │ │ └── LUNTutorialDelegate.h │ │ └── Realizations │ │ │ └── RotatingWireframesAnimator │ │ │ ├── LUNRotatingWireframesAnimator.h │ │ │ └── LUNRotatingWireframesAnimator.m │ ├── LUNXibView │ │ ├── LUNXibView.h │ │ └── LUNXibView.m │ ├── NSArray+LUNObjectAtIndex │ │ ├── NSArray+LUNObjectAtIndex.h │ │ └── NSArray+LUNObjectAtIndex.m │ ├── Resource │ │ ├── Brandon_bld.otf │ │ ├── Brandon_blk.otf │ │ └── Brandon_reg.otf │ ├── ViewController.h │ ├── ViewController.m │ └── main.m ├── Podfile.lock ├── Pods │ ├── FXPageControl │ │ ├── FXPageControl │ │ │ ├── FXPageControl.h │ │ │ └── FXPageControl.m │ │ ├── LICENSE.md │ │ └── README.md │ ├── Headers │ │ └── Private │ │ │ └── FXPageControl │ │ │ └── FXPageControl.h │ ├── Manifest.lock │ ├── Pods.xcodeproj │ │ └── project.pbxproj │ └── Target Support Files │ │ ├── FXPageControl │ │ ├── FXPageControl-dummy.m │ │ ├── FXPageControl-prefix.pch │ │ ├── FXPageControl-umbrella.h │ │ ├── FXPageControl.modulemap │ │ ├── FXPageControl.xcconfig │ │ └── Info.plist │ │ └── Pods-LUNTutorialDemo │ │ ├── Info.plist │ │ ├── Pods-LUNTutorialDemo-acknowledgements.markdown │ │ ├── Pods-LUNTutorialDemo-acknowledgements.plist │ │ ├── Pods-LUNTutorialDemo-dummy.m │ │ ├── Pods-LUNTutorialDemo-frameworks.sh │ │ ├── Pods-LUNTutorialDemo-resources.sh │ │ ├── Pods-LUNTutorialDemo-umbrella.h │ │ ├── Pods-LUNTutorialDemo.debug.xcconfig │ │ ├── Pods-LUNTutorialDemo.modulemap │ │ └── Pods-LUNTutorialDemo.release.xcconfig └── podfile ├── LUNTutorialViewController.podspec ├── LUNTutorialViewController ├── LUNTapPassingScrollView │ ├── LUNTapPassingScrollView │ │ ├── LUNTapPassingScrollView.h │ │ └── LUNTapPassingScrollView.m │ └── UIView+EnumerationForTest │ │ ├── UIView+EnumerationForTest.h │ │ └── UIView+EnumerationForTest.m ├── LUNTutorial │ ├── Classes │ │ └── LUNTutorialViewController │ │ │ ├── LUNTutorialViewController.h │ │ │ └── LUNTutorialViewController.m │ ├── Interfaces │ │ ├── LUNTutorialAnimator │ │ │ ├── LUNTutorialAnimator │ │ │ │ └── LUNTutorialAnimator.h │ │ │ ├── LUNTutorialBackgroundAnimator │ │ │ │ └── LUNTutorialBackgroundAnimator.h │ │ │ ├── LUNTutorialIconAnimator │ │ │ │ └── LUNTutorialIconAnimator.h │ │ │ ├── LUNTutorialInnerWireframesAnimator │ │ │ │ └── LUNTutorialInnerWirefamesAnimator.h │ │ │ ├── LUNTutorialLabelAnimator │ │ │ │ └── LUNTutorialLabelAnimator.h │ │ │ ├── LUNTutorialWireframesAnimator │ │ │ │ └── LUNTutorialWireframeAnimator.h │ │ │ └── LUNTutroialScrollAnimator │ │ │ │ └── LUNTutorialScrollAnimator.h │ │ ├── LUNTutorialDataSource │ │ │ ├── LUNTutorialBackgroundDataSource │ │ │ │ └── LUNTutorialBackgroundDataSource.h │ │ │ ├── LUNTutorialDataSource │ │ │ │ └── LUNTutorialDataSource.h │ │ │ ├── LUNTutorialIconDataSource │ │ │ │ └── LUNTutorialIconDataSource.h │ │ │ ├── LUNTutorialInnerWireframesDataSource │ │ │ │ └── LUNTutorialInnerWireframesDataSource.h │ │ │ ├── LUNTutorialLabelsDataSource │ │ │ │ └── LUNTutorialLabelsDataSource.h │ │ │ ├── LUNTutorialStaticContentViewDataSource │ │ │ │ └── LUNTutorialStaticContentViewDataSource.h │ │ │ └── LUNTutorialWireframesDataSource │ │ │ │ └── LUNTutorialWireframesDataSource.h │ │ └── LUNTutorialDelegate │ │ │ └── LUNTutorialDelegate.h │ └── Realizations │ │ └── RotatingWireframesAnimator │ │ ├── LUNRotatingWireframesAnimator.h │ │ └── LUNRotatingWireframesAnimator.m └── NSArray+LUNObjectAtIndex │ ├── NSArray+LUNObjectAtIndex.h │ └── NSArray+LUNObjectAtIndex.m └── 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 | *.xccheckout 22 | *.moved-aside 23 | *.xcuserstate 24 | *.xcscmblueprint 25 | 26 | ## Obj-C/Swift specific 27 | *.hmap 28 | *.ipa 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/docs/Gitignore.md 51 | 52 | fastlane/report.xml 53 | fastlane/screenshots 54 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 LunApps 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/2/16. 6 | // Copyright © 2016 lunapps. 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 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/2/16. 6 | // Copyright © 2016 lunapps. 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 | return YES; 21 | } 22 | 23 | - (void)applicationWillResignActive:(UIApplication *)application { 24 | // 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. 25 | // 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. 26 | } 27 | 28 | - (void)applicationDidEnterBackground:(UIApplication *)application { 29 | // 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. 30 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 31 | } 32 | 33 | - (void)applicationWillEnterForeground:(UIApplication *)application { 34 | // 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. 35 | } 36 | 37 | - (void)applicationDidBecomeActive:(UIApplication *)application { 38 | // 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. 39 | } 40 | 41 | - (void)applicationWillTerminate:(UIApplication *)application { 42 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 43 | } 44 | 45 | @end 46 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/backgrounds/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/backgrounds/animalBackground1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "animalBackground1@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "animalBackground1@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/backgrounds/animalBackground1.imageset/animalBackground1@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/backgrounds/animalBackground1.imageset/animalBackground1@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/backgrounds/animalBackground1.imageset/animalBackground1@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/backgrounds/animalBackground1.imageset/animalBackground1@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/backgrounds/animalBackground2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "animalBackground2@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "animalBackground2@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/backgrounds/animalBackground2.imageset/animalBackground2@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/backgrounds/animalBackground2.imageset/animalBackground2@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/backgrounds/animalBackground2.imageset/animalBackground2@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/backgrounds/animalBackground2.imageset/animalBackground2@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/backgrounds/animalBackground3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "animalBackground2@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "animalBackground2@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/backgrounds/animalBackground3.imageset/animalBackground2@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/backgrounds/animalBackground3.imageset/animalBackground2@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/backgrounds/animalBackground3.imageset/animalBackground2@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/backgrounds/animalBackground3.imageset/animalBackground2@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/icons/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/icons/icon1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "icon1@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "icon1@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/icons/icon1.imageset/icon1@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/icons/icon1.imageset/icon1@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/icons/icon1.imageset/icon1@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/icons/icon1.imageset/icon1@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/icons/icon2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "icon2@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "icon2@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/icons/icon2.imageset/icon2@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/icons/icon2.imageset/icon2@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/icons/icon2.imageset/icon2@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/icons/icon2.imageset/icon2@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/icons/icon3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "icon3@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "icon3@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/icons/icon3.imageset/icon3@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/icons/icon3.imageset/icon3@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/icons/icon3.imageset/icon3@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/icons/icon3.imageset/icon3@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/wireframes/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/wireframes/animalWireframe1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "animalWireframe1@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "animalWireframe1@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/wireframes/animalWireframe1.imageset/animalWireframe1@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/wireframes/animalWireframe1.imageset/animalWireframe1@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/wireframes/animalWireframe1.imageset/animalWireframe1@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/wireframes/animalWireframe1.imageset/animalWireframe1@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/wireframes/animalWireframe2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "animalWireframe2@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "animalWireframe2@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/wireframes/animalWireframe2.imageset/animalWireframe2@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/wireframes/animalWireframe2.imageset/animalWireframe2@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/wireframes/animalWireframe2.imageset/animalWireframe2@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/wireframes/animalWireframe2.imageset/animalWireframe2@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/wireframes/animalWireframe3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "animalWireframe3@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "animalWireframe3@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/wireframes/animalWireframe3.imageset/animalWireframe3@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/wireframes/animalWireframe3.imageset/animalWireframe3@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/wireframes/animalWireframe3.imageset/animalWireframe3@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Animals/wireframes/animalWireframe3.imageset/animalWireframe3@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/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 | "info" : { 35 | "version" : 1, 36 | "author" : "xcode" 37 | } 38 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Galaxy/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Galaxy/firstGalaxyBackground.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "firstBackground@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "firstBackground@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Galaxy/firstGalaxyBackground.imageset/firstBackground@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Galaxy/firstGalaxyBackground.imageset/firstBackground@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Galaxy/firstGalaxyBackground.imageset/firstBackground@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Galaxy/firstGalaxyBackground.imageset/firstBackground@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Galaxy/secondGalaxyBackground.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "secondBackground@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "secondBackground@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Galaxy/secondGalaxyBackground.imageset/secondBackground@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Galaxy/secondGalaxyBackground.imageset/secondBackground@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Galaxy/secondGalaxyBackground.imageset/secondBackground@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Galaxy/secondGalaxyBackground.imageset/secondBackground@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Galaxy/thirdGalaxyBackground.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "thirdBackground@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "thirdBackground@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Galaxy/thirdGalaxyBackground.imageset/thirdBackground@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Galaxy/thirdGalaxyBackground.imageset/thirdBackground@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Galaxy/thirdGalaxyBackground.imageset/thirdBackground@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Galaxy/thirdGalaxyBackground.imageset/thirdBackground@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Nature/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Nature/backgrounds/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Nature/backgrounds/background1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "background1@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "background1@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Nature/backgrounds/background1.imageset/background1@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Nature/backgrounds/background1.imageset/background1@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Nature/backgrounds/background1.imageset/background1@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Nature/backgrounds/background1.imageset/background1@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Nature/backgrounds/background2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "background2@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "background2@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Nature/backgrounds/background2.imageset/background2@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Nature/backgrounds/background2.imageset/background2@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Nature/backgrounds/background2.imageset/background2@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Nature/backgrounds/background2.imageset/background2@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Nature/backgrounds/background3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "background3@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "background3@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Nature/backgrounds/background3.imageset/background3@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Nature/backgrounds/background3.imageset/background3@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Nature/backgrounds/background3.imageset/background3@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Nature/backgrounds/background3.imageset/background3@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Nature/wireframes/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Nature/wireframes/wireframe1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "wireframe1@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "wireframe1@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Nature/wireframes/wireframe1.imageset/wireframe1@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Nature/wireframes/wireframe1.imageset/wireframe1@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Nature/wireframes/wireframe1.imageset/wireframe1@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Nature/wireframes/wireframe1.imageset/wireframe1@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Nature/wireframes/wireframe2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "wireframe2@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "wireframe2@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Nature/wireframes/wireframe2.imageset/wireframe2@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Nature/wireframes/wireframe2.imageset/wireframe2@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Nature/wireframes/wireframe2.imageset/wireframe2@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Nature/wireframes/wireframe2.imageset/wireframe2@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Nature/wireframes/wireframe3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "wireframe3@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "wireframe3@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Nature/wireframes/wireframe3.imageset/wireframe3@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Nature/wireframes/wireframe3.imageset/wireframe3@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Nature/wireframes/wireframe3.imageset/wireframe3@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/Nature/wireframes/wireframe3.imageset/wireframe3@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/firstPage/1_1Image.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "firstPageFirstImage@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "firstPageFirstImage@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/firstPage/1_1Image.imageset/firstPageFirstImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/firstPage/1_1Image.imageset/firstPageFirstImage@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/firstPage/1_1Image.imageset/firstPageFirstImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/firstPage/1_1Image.imageset/firstPageFirstImage@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/firstPage/1_2Image.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "firstPageSecondImage@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "firstPageSecondImage@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/firstPage/1_2Image.imageset/firstPageSecondImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/firstPage/1_2Image.imageset/firstPageSecondImage@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/firstPage/1_2Image.imageset/firstPageSecondImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/firstPage/1_2Image.imageset/firstPageSecondImage@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/firstPage/1_3Image.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "firstPageThirdImage@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "firstPageThirdImage@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/firstPage/1_3Image.imageset/firstPageThirdImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/firstPage/1_3Image.imageset/firstPageThirdImage@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/firstPage/1_3Image.imageset/firstPageThirdImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/firstPage/1_3Image.imageset/firstPageThirdImage@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/firstPage/1_4Image.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "firstPageFourthImage@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "firstPageFourthImage@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/firstPage/1_4Image.imageset/firstPageFourthImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/firstPage/1_4Image.imageset/firstPageFourthImage@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/firstPage/1_4Image.imageset/firstPageFourthImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/firstPage/1_4Image.imageset/firstPageFourthImage@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/firstPage/1_5Image.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "firstPageFifthImage@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "firstPageFifthImage@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/firstPage/1_5Image.imageset/firstPageFifthImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/firstPage/1_5Image.imageset/firstPageFifthImage@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/firstPage/1_5Image.imageset/firstPageFifthImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/firstPage/1_5Image.imageset/firstPageFifthImage@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/firstPage/1_6Image.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "firstPageSixthImage@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "firstPageSixthImage@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/firstPage/1_6Image.imageset/firstPageSixthImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/firstPage/1_6Image.imageset/firstPageSixthImage@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/firstPage/1_6Image.imageset/firstPageSixthImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/firstPage/1_6Image.imageset/firstPageSixthImage@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/firstPage/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/firstPage/firstSlidingImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "firstSlidingImage@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "firstSlidingImage@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/firstPage/firstSlidingImage.imageset/firstSlidingImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/firstPage/firstSlidingImage.imageset/firstSlidingImage@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/firstPage/firstSlidingImage.imageset/firstSlidingImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/firstPage/firstSlidingImage.imageset/firstSlidingImage@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/gradient1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "gradient1@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "gradient1@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/gradient1.imageset/gradient1@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/gradient1.imageset/gradient1@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/gradient1.imageset/gradient1@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/gradient1.imageset/gradient1@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/gradient2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "gradient2@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "gradient2@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/gradient2.imageset/gradient2@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/gradient2.imageset/gradient2@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/gradient2.imageset/gradient2@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/gradient2.imageset/gradient2@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/gradient3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "gradient3@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "gradient3@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/gradient3.imageset/gradient3@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/gradient3.imageset/gradient3@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/gradient3.imageset/gradient3@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/gradient3.imageset/gradient3@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/newYearBackgroundPattern.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "backgroundPattern@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "backgroundPattern@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/newYearBackgroundPattern.imageset/backgroundPattern@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/newYearBackgroundPattern.imageset/backgroundPattern@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/newYearBackgroundPattern.imageset/backgroundPattern@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/newYearBackgroundPattern.imageset/backgroundPattern@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/secondPage/2_1Image.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "secondPageFirstImage@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "secondPageFirstImage@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/secondPage/2_1Image.imageset/secondPageFirstImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/secondPage/2_1Image.imageset/secondPageFirstImage@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/secondPage/2_1Image.imageset/secondPageFirstImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/secondPage/2_1Image.imageset/secondPageFirstImage@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/secondPage/2_2Image.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "secondPageSecondImage@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "secondPageSecondImage@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/secondPage/2_2Image.imageset/secondPageSecondImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/secondPage/2_2Image.imageset/secondPageSecondImage@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/secondPage/2_2Image.imageset/secondPageSecondImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/secondPage/2_2Image.imageset/secondPageSecondImage@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/secondPage/2_3Image.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "secondPageThirdImage@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "secondPageThirdImage@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/secondPage/2_3Image.imageset/secondPageThirdImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/secondPage/2_3Image.imageset/secondPageThirdImage@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/secondPage/2_3Image.imageset/secondPageThirdImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/secondPage/2_3Image.imageset/secondPageThirdImage@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/secondPage/2_4Image.imageset/2_4Image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/secondPage/2_4Image.imageset/2_4Image@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/secondPage/2_4Image.imageset/2_4Image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/secondPage/2_4Image.imageset/2_4Image@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/secondPage/2_4Image.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "2_4Image@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "2_4Image@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/secondPage/2_5Image.imageset/2_5Image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/secondPage/2_5Image.imageset/2_5Image@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/secondPage/2_5Image.imageset/2_5Image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/secondPage/2_5Image.imageset/2_5Image@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/secondPage/2_5Image.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "2_5Image@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "2_5Image@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/secondPage/2_6Image.imageset/2_6Image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/secondPage/2_6Image.imageset/2_6Image@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/secondPage/2_6Image.imageset/2_6Image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/secondPage/2_6Image.imageset/2_6Image@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/secondPage/2_6Image.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "2_6Image@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "2_6Image@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/secondPage/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/secondPage/secondSlidingImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "secondSlidingImage@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "secondSlidingImage@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/secondPage/secondSlidingImage.imageset/secondSlidingImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/secondPage/secondSlidingImage.imageset/secondSlidingImage@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/secondPage/secondSlidingImage.imageset/secondSlidingImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/secondPage/secondSlidingImage.imageset/secondSlidingImage@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/thirdPage/3_1Image.imageset/3_1Image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/thirdPage/3_1Image.imageset/3_1Image@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/thirdPage/3_1Image.imageset/3_1Image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/thirdPage/3_1Image.imageset/3_1Image@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/thirdPage/3_1Image.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "3_1Image@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "3_1Image@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/thirdPage/3_2Image.imageset/3_2Image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/thirdPage/3_2Image.imageset/3_2Image@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/thirdPage/3_2Image.imageset/3_2Image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/thirdPage/3_2Image.imageset/3_2Image@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/thirdPage/3_2Image.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "3_2Image@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "3_2Image@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/thirdPage/3_3Image.imageset/3_3Image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/thirdPage/3_3Image.imageset/3_3Image@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/thirdPage/3_3Image.imageset/3_3Image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/thirdPage/3_3Image.imageset/3_3Image@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/thirdPage/3_3Image.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "3_3Image@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "3_3Image@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/thirdPage/3_4Image.imageset/3_4Image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/thirdPage/3_4Image.imageset/3_4Image@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/thirdPage/3_4Image.imageset/3_4Image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/thirdPage/3_4Image.imageset/3_4Image@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/thirdPage/3_4Image.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "3_4Image@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "3_4Image@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/thirdPage/3_5Image.imageset/3_5Image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/thirdPage/3_5Image.imageset/3_5Image@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/thirdPage/3_5Image.imageset/3_5Image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/thirdPage/3_5Image.imageset/3_5Image@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/thirdPage/3_5Image.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "3_5Image@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "3_5Image@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/thirdPage/3_6Image.imageset/3_6Image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/thirdPage/3_6Image.imageset/3_6Image@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/thirdPage/3_6Image.imageset/3_6Image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/thirdPage/3_6Image.imageset/3_6Image@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/thirdPage/3_6Image.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "3_6Image@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "3_6Image@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/thirdPage/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/thirdPage/thirdSlidingImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "thirdSlidingImage@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "thirdSlidingImage@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/thirdPage/thirdSlidingImage.imageset/thirdSlidingImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/thirdPage/thirdSlidingImage.imageset/thirdSlidingImage@2x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/thirdPage/thirdSlidingImage.imageset/thirdSlidingImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Assets.xcassets/NewYear/thirdPage/thirdSlidingImage.imageset/thirdSlidingImage@3x.png -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/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 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 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 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Examples/AnimalsOnboarding/LUNAnimalsViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNAnimalsViewController.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 4/11/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import "LUNTutorialViewController.h" 10 | 11 | @interface LUNAnimalsViewController : LUNTutorialViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Examples/GalaxyOnboarding/GalaxyViews/LUNGalaxyLabelsView/LUNLabelsView.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNLabelsView.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 4/1/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface LUNLabelsView : UIView 12 | 13 | - (void)setupTitle:(NSString *)titleText supportingText:(NSString *)supportingText titleColor:(UIColor *)titleColor textColor:(UIColor *)textColor; 14 | 15 | @property (nonatomic, weak) IBOutlet UILabel *titleLabel; 16 | 17 | @property (nonatomic, weak) IBOutlet UILabel *textLabel; 18 | 19 | - (void)setupLabelsMargin:(CGFloat)spacingValue; 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Examples/GalaxyOnboarding/GalaxyViews/LUNGalaxyLabelsView/LUNLabelsView.m: -------------------------------------------------------------------------------- 1 | // 2 | // LUNLabelsView.m 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 4/1/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import "LUNLabelsView.h" 10 | 11 | @interface LUNLabelsView () 12 | @property (nonatomic, strong) IBOutlet NSLayoutConstraint *textLabelToTitleLabelVerticalSpacingConstraint; 13 | 14 | @end 15 | 16 | @implementation LUNLabelsView 17 | 18 | #pragma mark - Initialization 19 | 20 | - (instancetype)initWithFrame:(CGRect)frame { 21 | if (self = [super initWithFrame:frame]) { 22 | [self loadViewFromXib]; 23 | [self commonSetup]; 24 | } 25 | return self; 26 | } 27 | 28 | - (instancetype)initWithCoder:(NSCoder *)coder { 29 | if (self = [super initWithCoder:coder]) { 30 | [self loadViewFromXib]; 31 | [self commonSetup]; 32 | } 33 | return self; 34 | } 35 | 36 | - (void)awakeFromNib { 37 | [super awakeFromNib]; 38 | [self commonSetup]; 39 | } 40 | 41 | #pragma mark - Private 42 | 43 | - (void)commonSetup { 44 | 45 | } 46 | 47 | - (void)loadViewFromXib { 48 | UIView *view = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil] firstObject]; 49 | view.translatesAutoresizingMaskIntoConstraints = NO; 50 | [self addSubview:view]; 51 | 52 | [self addConstraint:[NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeTop multiplier:1.0f constant:0.0f]]; 53 | [self addConstraint:[NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeBottom multiplier:1.0f constant:0.0f]]; 54 | [self addConstraint:[NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeLeading multiplier:1.0f constant:0.0f]]; 55 | [self addConstraint:[NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeTrailing multiplier:1.0f constant:0.0f]]; 56 | } 57 | 58 | #pragma mark - public 59 | 60 | - (void)setupTitle:(NSString *)titleText supportingText:(NSString *)supportingText titleColor:(UIColor *)titleColor textColor:(UIColor *)textColor { 61 | self.titleLabel.text = titleText; 62 | self.textLabel.text = supportingText; 63 | self.textLabel.textColor = textColor; 64 | self.titleLabel.textColor = titleColor; 65 | } 66 | 67 | - (void)setupLabelsMargin:(CGFloat)spacingValue { 68 | self.textLabelToTitleLabelVerticalSpacingConstraint.constant = spacingValue; 69 | [self layoutIfNeeded]; 70 | } 71 | 72 | @end 73 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Examples/GalaxyOnboarding/GalaxyViews/LUNGalaxyLabelsView/LUNLabelsView.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | BrandonGrotesque-Bold 10 | 11 | 12 | BrandonGrotesque-Regular 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 45 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Examples/GalaxyOnboarding/GalaxyViews/LUNGalaxyStaticView/LUNStaticView.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNStaticView.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 4/1/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface LUNStaticView : UIView 12 | 13 | @property (nonatomic, copy) void (^startButtonTapBlock)(); 14 | 15 | @property (nonatomic, weak) IBOutlet UIButton *letsStartButton; 16 | 17 | - (void)selectPageIndex:(NSInteger)index; 18 | 19 | - (void)setupButtonText:(NSString *)text; 20 | 21 | - (void)setupPageControlsSelectedDotColors:(NSArray *)colors; 22 | 23 | - (void)setupPageControlsDotColor:(UIColor *)color; 24 | 25 | - (void)setupButtonBackgroundColor:(UIColor *)color; 26 | 27 | - (void)setupButtonTextColor:(UIColor *)color; 28 | 29 | - (void)setupButtonCornerRadius:(CGFloat)cornerRadius; 30 | 31 | - (void)setupButtonTextFont:(UIFont *)font; 32 | 33 | - (void)setupButtonBorderWidth:(CGFloat)borderWidth; 34 | 35 | - (void)setupButtonWidth:(CGFloat)buttonWidth; 36 | 37 | - (void)setupButtonHeight:(CGFloat)buttonHeight; 38 | 39 | - (void)needShadow:(BOOL)needShadow; 40 | 41 | - (void)setOffset:(CGFloat)offset betweenIndexes:(NSInteger)startIndex endIndex:(NSInteger)endIndex; 42 | 43 | @end 44 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Examples/GalaxyOnboarding/LUNGalaxyViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNGalaxyViewController.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 4/1/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import "LUNTutorialViewController.h" 10 | 11 | @interface LUNGalaxyViewController : LUNTutorialViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Examples/NatureOnboarding/LUNNatureViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNNatureViewController.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 4/6/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "LUNTutorialViewController.h" 11 | 12 | @interface LUNNatureViewController : LUNTutorialViewController 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Examples/NatureOnboarding/LUNNatureViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // LUNNatureViewController.m 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 4/6/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import "LUNNatureViewController.h" 10 | #import "LUNRotatingWireframesAnimator.h" 11 | #import "LUNStaticView.h" 12 | #import "LUNGalaxyViewController.h" 13 | #import "LUNNatureWireframeView.h" 14 | #import "LUNLabelsView.h" 15 | #import "NSArray+LUNObjectAtIndex.h" 16 | #import "LUNAnimalsViewController.h" 17 | 18 | @interface LUNNatureViewController () 19 | 20 | @property (nonatomic, strong) LUNRotatingWireframesAnimator *rotatingAnimator; 21 | @property (nonatomic, strong) NSArray *titles; 22 | @property (nonatomic, strong) NSArray *texts; 23 | @property (nonatomic, strong) NSArray *wireframes; 24 | 25 | @end 26 | 27 | @implementation LUNNatureViewController 28 | 29 | static const CGFloat kLUNNatureHeightMultiplier = 440.0f/1136.0f; 30 | 31 | #pragma mark - Life Cycle 32 | 33 | - (void)viewDidLoad { 34 | [super viewDidLoad]; 35 | [self commonSetup]; 36 | [self contentSetup]; 37 | } 38 | 39 | - (void)viewWillAppear:(BOOL)animated { 40 | [super viewWillAppear:animated]; 41 | [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault; 42 | [self reloadData]; 43 | [self.view layoutIfNeeded]; 44 | } 45 | 46 | #pragma mark - Setup 47 | 48 | - (void)commonSetup { 49 | self.rotatingAnimator = [[LUNRotatingWireframesAnimator alloc] init]; 50 | self.animator = self.rotatingAnimator; 51 | self.delegate = self; 52 | self.dataSource = self; 53 | self.numberOfRealPages = 3; 54 | self.roundnessHeight = 10; 55 | } 56 | 57 | - (void)contentSetup { 58 | self.titles = @[@"ANIMALS", 59 | @"FLOWERS", 60 | @"NATURE"]; 61 | self.texts = @[@"Our quality prints are the perfect way to\nenjoy your best memories!", 62 | @"Our quality prints are the perfect way to\nenjoy your best memories!", 63 | @"Our quality prints are the perfect way to\nenjoy your best memories!"]; 64 | self.wireframes = @[@"wireframe1", 65 | @"wireframe2", 66 | @"wireframe3"]; 67 | } 68 | 69 | - (void)reloadData { 70 | [super reloadData]; 71 | [self.view layoutIfNeeded]; 72 | for (NSInteger index = backgroundPages.count - 1; index >= 0; index--) { 73 | [backgroundsScrollView bringSubviewToFront:[backgroundPages LUN_objectAtIndex:index]]; 74 | } 75 | } 76 | 77 | #pragma mark - LUNTutorialStaticContentDataSource 78 | 79 | - (CGFloat)staticContentHeight { 80 | return CGRectGetHeight(self.view.frame) * kLUNNatureHeightMultiplier; 81 | } 82 | 83 | - (__kindof UIView *)staticContentView { 84 | LUNStaticView *staticView = [[LUNStaticView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; 85 | staticView.startButtonTapBlock = ^void() { 86 | LUNAnimalsViewController *animalsController = [self.storyboard instantiateViewControllerWithIdentifier:NSStringFromClass([LUNAnimalsViewController class])]; 87 | [self presentViewController:animalsController animated:YES completion:nil]; 88 | }; 89 | [staticView setupButtonText:@"LET'S START"]; 90 | [staticView setupPageControlsDotColor:[UIColor colorWithRed:122.0f / 255.0f green:122.0f / 255.0f blue:122.0f / 255.0f alpha:0.24f]]; 91 | [staticView setupPageControlsSelectedDotColors:@[[UIColor blackColor], [UIColor blackColor], [UIColor blackColor]]]; 92 | [staticView needShadow:NO]; 93 | [staticView setupButtonBackgroundColor:[UIColor clearColor]]; 94 | [staticView setupButtonCornerRadius:0.0f]; 95 | [staticView setupButtonTextColor:[UIColor blackColor]]; 96 | [staticView setupButtonTextFont:[UIFont fontWithName:@"BrandonGrotesque-Bold" size:14]]; 97 | [staticView setupButtonWidth: 428.0f/640.0f * CGRectGetWidth(self.view.frame)]; 98 | [staticView setupButtonHeight: 80.0f/1136.0f * CGRectGetHeight(self.view.frame)]; 99 | [staticView setupButtonBorderWidth:2.0f]; 100 | staticView.backgroundColor = [UIColor whiteColor]; 101 | return staticView; 102 | } 103 | 104 | #pragma mark - LUNTUtorialBackgroundDataSource 105 | 106 | - (__kindof UIView *)dynamicBackgroundViewAtIndex:(NSInteger)index { 107 | UIImageView *imageViewForIndex = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"background%ld", (long)index+1]]]; 108 | imageViewForIndex.contentMode = UIViewContentModeScaleAspectFill; 109 | if (index != 0) { 110 | imageViewForIndex.alpha = 0.0f; 111 | } 112 | return imageViewForIndex; 113 | } 114 | 115 | #pragma mark - LUNTutorialWireframesDataSource 116 | 117 | - (__kindof UIView *)wireframeViewForIndex:(NSInteger)index { 118 | UIImageView *imageViewForIndex = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"wireframe%ld", (long)index+1]]]; 119 | CGRect rect = CGRectMake(0, 0, 611.0f / 1134.0f * self.view.frame.size.height, 1076.0f / 1134.0f * self.view.frame.size.height); 120 | imageViewForIndex.frame = rect; 121 | imageViewForIndex.contentMode = UIViewContentModeScaleToFill; 122 | UIImage *scaledImage = imageViewForIndex.image; 123 | 124 | 125 | UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0.0); 126 | [scaledImage drawInRect:CGRectMake(0, 0, rect.size.width, rect.size.height)]; 127 | UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 128 | UIGraphicsEndImageContext(); 129 | 130 | 131 | LUNNatureWireframeView *wireframeForIndex = [[LUNNatureWireframeView alloc] init]; 132 | [wireframeForIndex setupWireframeImage:newImage]; 133 | return wireframeForIndex; 134 | } 135 | 136 | #pragma mark - LUNTutorialDelegate 137 | 138 | - (void)LUNTutorialViewController:(LUNTutorialViewController *)tutorialController reachedPage:(NSInteger)index { 139 | [(LUNStaticView *)staticContentView selectPageIndex:index]; 140 | } 141 | 142 | #pragma mark - LUNTutorialLabelsDataSource 143 | 144 | - (CGFloat)labelsTopMargin { 145 | return CGRectGetHeight(self.view.frame) - self.staticContentHeight + self.roundnessHeight; 146 | } 147 | 148 | - (__kindof UIView *)labelViewAtIndex:(NSInteger)index { 149 | LUNLabelsView *labelsView = [[LUNLabelsView alloc] initWithFrame:CGRectZero]; 150 | [labelsView setupTitle:self.titles[index] supportingText:self.texts[index] titleColor:[UIColor blackColor] textColor:[UIColor colorWithRed:52.0f / 255.0f green:52.0f / 255.0f blue:52.0f / 255.0f alpha:0.54f]]; 151 | labelsView.titleLabel.font = [UIFont fontWithName:@"BrandonGrotesque-Bold" size:20]; 152 | labelsView.textLabel.font = [UIFont fontWithName:@"BrandonGrotesque-Regular" size:15]; 153 | return labelsView; 154 | } 155 | 156 | @end 157 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Examples/NatureOnboarding/LUNNatureWireframe/LUNNatureWireframeView.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNNatureWireframeView.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 4/8/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "LUNXibView.h" 11 | 12 | @interface LUNNatureWireframeView : LUNXibView 13 | 14 | - (void)setupWireframeImage:(UIImage *)image; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Examples/NatureOnboarding/LUNNatureWireframe/LUNNatureWireframeView.m: -------------------------------------------------------------------------------- 1 | // 2 | // LUNNatureWireframeView.m 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 4/8/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import "LUNNatureWireframeView.h" 10 | 11 | @interface LUNNatureWireframeView () 12 | 13 | @property (nonatomic, strong) IBOutlet UIImageView *wireframeImageView; 14 | 15 | @end 16 | 17 | @implementation LUNNatureWireframeView 18 | 19 | - (void)setupWireframeImage:(UIImage *)image { 20 | self.wireframeImageView.image = image; 21 | } 22 | 23 | @end 24 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Examples/NatureOnboarding/LUNNatureWireframe/LUNNatureWireframeView.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 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 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Examples/NewYearOnboarding/BackgroundPatternedView/LUNBackgroundPatternedView.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNBackgroundPatternedView.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 4/5/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface LUNBackgroundPatternedView : UIView 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Examples/NewYearOnboarding/BackgroundPatternedView/LUNBackgroundPatternedView.m: -------------------------------------------------------------------------------- 1 | // 2 | // LUNBackgroundPatternedView.m 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 4/5/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import "LUNBackgroundPatternedView.h" 10 | 11 | @implementation LUNBackgroundPatternedView 12 | 13 | #pragma mark - initialization 14 | 15 | - (instancetype)initWithFrame:(CGRect)frame { 16 | if (self = [super initWithFrame:frame]) { 17 | [self loadViewFromXib]; 18 | } 19 | return self; 20 | } 21 | 22 | - (instancetype)initWithCoder:(NSCoder *)coder { 23 | if (self = [super initWithCoder:coder]) { 24 | [self loadViewFromXib]; 25 | } 26 | return self; 27 | } 28 | 29 | - (void)awakeFromNib { 30 | [super awakeFromNib]; 31 | } 32 | 33 | - (void)loadViewFromXib { 34 | UIView *view = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil] firstObject]; 35 | view.translatesAutoresizingMaskIntoConstraints = NO; 36 | [self addSubview:view]; 37 | 38 | [self addConstraint:[NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeTop multiplier:1.0f constant:0.0f]]; 39 | [self addConstraint:[NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeBottom multiplier:1.0f constant:0.0f]]; 40 | [self addConstraint:[NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeLeading multiplier:1.0f constant:0.0f]]; 41 | [self addConstraint:[NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeTrailing multiplier:1.0f constant:0.0f]]; 42 | } 43 | 44 | #pragma mark - private 45 | 46 | - (void)setBackgroundColor:(UIColor *)backgroundColor { 47 | self.subviews[0].backgroundColor = backgroundColor; 48 | } 49 | 50 | @end 51 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Examples/NewYearOnboarding/BackgroundPatternedView/LUNBackgroundPatternedView.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Examples/NewYearOnboarding/LUNNewYearViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNNewYearViewController.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 4/4/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "LUNTutorialViewController.h" 11 | 12 | @interface LUNNewYearViewController : LUNTutorialViewController 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Examples/NewYearOnboarding/SlidingImageView/LUNSlidingImageView.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNSlidingImageView.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 4/5/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface LUNSlidingImageView : UIView 12 | 13 | - (void)setupMainImage:(UIImage *)image; 14 | 15 | - (void)setupShapesImages:(NSArray *)shapesImages; 16 | 17 | - (void)animateShapesHide; 18 | 19 | - (void)animateShapesShow:(NSArray *)translations; 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Examples/NewYearOnboarding/SlidingImageView/LUNSlidingImageView.m: -------------------------------------------------------------------------------- 1 | // 2 | // LUNSlidingImageView.m 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 4/5/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import "LUNSlidingImageView.h" 10 | 11 | @interface LUNSlidingImageView() 12 | 13 | @property (strong, nonatomic) IBOutletCollection(UIImageView) NSArray *shapeImageViews; 14 | @property (nonatomic, weak) IBOutlet UIView *shapesView; 15 | @property (nonatomic, weak) IBOutlet UIImageView *slidingImage; 16 | 17 | @end 18 | 19 | @implementation LUNSlidingImageView 20 | 21 | static const CGFloat kLUNFirstItemRotationAngle = 50.0f; 22 | static const CGFloat kLUNSecondItemRotationAngle = 75.0f; 23 | 24 | #pragma mark - initialization 25 | 26 | - (instancetype)initWithFrame:(CGRect)frame { 27 | if (self = [super initWithFrame:frame]) { 28 | [self loadViewFromXib]; 29 | [self commonSetup]; 30 | } 31 | return self; 32 | } 33 | 34 | - (instancetype)initWithCoder:(NSCoder *)coder { 35 | if (self = [super initWithCoder:coder]) { 36 | [self loadViewFromXib]; 37 | [self commonSetup]; 38 | } 39 | return self; 40 | } 41 | 42 | - (void)awakeFromNib { 43 | [super awakeFromNib]; 44 | [self commonSetup]; 45 | } 46 | 47 | - (void)loadViewFromXib { 48 | UIView *view = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil] firstObject]; 49 | view.translatesAutoresizingMaskIntoConstraints = NO; 50 | [self addSubview:view]; 51 | 52 | [self addConstraint:[NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeTop multiplier:1.0f constant:0.0f]]; 53 | [self addConstraint:[NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeBottom multiplier:1.0f constant:0.0f]]; 54 | [self addConstraint:[NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeLeading multiplier:1.0f constant:0.0f]]; 55 | [self addConstraint:[NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeTrailing multiplier:1.0f constant:0.0f]]; 56 | } 57 | 58 | #pragma mark - setup 59 | 60 | - (void)commonSetup { 61 | self.shapeImageViews = [self.shapeImageViews sortedArrayUsingComparator:^NSComparisonResult(UIView * _Nonnull obj1, UIView * _Nonnull obj2) { 62 | if (obj1.tag < obj2.tag) { 63 | return NSOrderedAscending; 64 | } else { 65 | return NSOrderedDescending; 66 | } 67 | }]; 68 | } 69 | 70 | #pragma mark - public 71 | 72 | - (void)setupMainImage:(UIImage *)image { 73 | self.slidingImage.image = image; 74 | } 75 | 76 | - (void)setupShapesImages:(NSArray *)shapesImages { 77 | for (NSInteger index = 0; index < shapesImages.count; index++) { 78 | ((UIImageView *)self.shapeImageViews[index]).image = shapesImages[index]; 79 | } 80 | } 81 | 82 | #pragma mark - animations 83 | 84 | - (void)animateShapesHide { 85 | [UIView animateWithDuration:0.5f animations:^{ 86 | self.shapesView.transform = CGAffineTransformMakeScale(0.01f, 0.01f); 87 | for (NSInteger index = 0; index < self.shapeImageViews.count; ++index) { 88 | ((UIView *)self.shapeImageViews[index]).transform = CGAffineTransformIdentity; 89 | } 90 | } completion:^(BOOL finished) { 91 | ((UIView *)self.shapeImageViews[0]).transform = CGAffineTransformMakeRotation(kLUNFirstItemRotationAngle * M_PI / 180.0f); 92 | ((UIView *)self.shapeImageViews[1]).transform = CGAffineTransformMakeRotation(kLUNSecondItemRotationAngle * M_PI / 180.0f); 93 | }]; 94 | } 95 | 96 | - (void)animateShapesShow:(NSArray *)translations { 97 | [UIView animateWithDuration:0.5f animations:^{ 98 | self.shapesView.transform = CGAffineTransformIdentity; 99 | for (NSInteger index = 0; index < self.shapeImageViews.count; ++index) { 100 | if (index == 0) { 101 | ((UIView *)self.shapeImageViews[index]).transform =CGAffineTransformMakeTranslation([translations[index] CGPointValue].x, [translations[index] CGPointValue].y); 102 | } else { 103 | if (index == 1) { 104 | ((UIView *)self.shapeImageViews[index]).transform = CGAffineTransformMakeTranslation([translations[index] CGPointValue].x, [translations[index] CGPointValue].y); 105 | } else { 106 | ((UIView *)self.shapeImageViews[index]).transform = CGAffineTransformMakeTranslation([translations[index] CGPointValue].x, [translations[index] CGPointValue].y); 107 | } 108 | } 109 | } 110 | }]; 111 | } 112 | 113 | @end 114 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UIAppFonts 6 | 7 | Brandon_reg.otf 8 | Brandon_blk.otf 9 | Brandon_bld.otf 10 | 11 | CFBundleDevelopmentRegion 12 | en 13 | CFBundleExecutable 14 | $(EXECUTABLE_NAME) 15 | CFBundleIdentifier 16 | $(PRODUCT_BUNDLE_IDENTIFIER) 17 | CFBundleInfoDictionaryVersion 18 | 6.0 19 | CFBundleName 20 | $(PRODUCT_NAME) 21 | CFBundlePackageType 22 | APPL 23 | CFBundleShortVersionString 24 | 1.0 25 | CFBundleSignature 26 | ???? 27 | CFBundleVersion 28 | 1 29 | LSRequiresIPhoneOS 30 | 31 | UILaunchStoryboardName 32 | LaunchScreen 33 | UIMainStoryboardFile 34 | Main 35 | UIRequiredDeviceCapabilities 36 | 37 | armv7 38 | 39 | UIStatusBarStyle 40 | UIStatusBarStyleLightContent 41 | UISupportedInterfaceOrientations 42 | 43 | UIInterfaceOrientationPortrait 44 | 45 | UIViewControllerBasedStatusBarAppearance 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/LUNTapPassingScrollView/LUNTapPassingScrollView/LUNTapPassingScrollView.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNTapPassingScrollView.h 3 | // 4 | // Created by Vladimir Sharavara on 3/11/16. 5 | // Copyright © 2016 LunApps. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | @interface LUNTapPassingScrollView : UIScrollView 11 | 12 | 13 | @property (nonatomic, strong) NSSet *forwardsTouchesToClasses; 14 | 15 | @property (nonatomic, strong) NSArray<__kindof UIView *> *underlyingViews; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/LUNTapPassingScrollView/LUNTapPassingScrollView/LUNTapPassingScrollView.m: -------------------------------------------------------------------------------- 1 | // 2 | // LUNTapPassingScrollView.m 3 | // 4 | // Created by Vladimir Sharavara on 3/11/16. 5 | // Copyright © 2016 LunApps. All rights reserved. 6 | // 7 | 8 | #import "LUNTapPassingScrollView.h" 9 | #import "UIView+EnumerationForTest.h" 10 | 11 | @implementation LUNTapPassingScrollView 12 | 13 | - (instancetype)init { 14 | self = [super init]; 15 | if (self) { 16 | [self initialSetup]; 17 | } 18 | return self; 19 | } 20 | 21 | - (instancetype)initWithCoder:(NSCoder *)aDecoder { 22 | self = [super initWithCoder:aDecoder]; 23 | if (self) { 24 | [self initialSetup]; 25 | } 26 | return self; 27 | } 28 | 29 | - (instancetype)initWithFrame:(CGRect)frame { 30 | self = [super initWithFrame:frame]; 31 | if (self) { 32 | [self initialSetup]; 33 | } 34 | return self; 35 | } 36 | 37 | - (void)initialSetup { 38 | _forwardsTouchesToClasses = [NSSet setWithArray:@[[UIControl class]]]; 39 | } 40 | 41 | - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { 42 | BOOL pointInside = [self mustCapturePoint:point withEvent:event]; 43 | if (!pointInside) { 44 | return NO; 45 | } 46 | return [super pointInside:point withEvent:event]; 47 | } 48 | 49 | #pragma mark - Private Methods 50 | 51 | - (BOOL)mustCapturePoint:(CGPoint)point withEvent:(UIEvent *)event { 52 | if (![self mustCapturePoint:point withEvent:event view:self.superview]) { 53 | return NO; 54 | } 55 | 56 | __block BOOL mustCapturePoint = YES; 57 | [_underlyingViews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { 58 | if (![self mustCapturePoint:point withEvent:event view:obj]) { 59 | mustCapturePoint = NO; 60 | *stop = YES; 61 | } 62 | }]; 63 | return mustCapturePoint; 64 | } 65 | 66 | - (BOOL)mustCapturePoint:(CGPoint)point withEvent:(UIEvent *)event view:(UIView *)view { 67 | CGPoint tapPoint = [self convertPoint:point toView:view]; 68 | __block BOOL mustCapturePoint = YES; 69 | __block UIView *weakView = view; 70 | [view add_enumerateSubviewsPassingTest:^BOOL(UIView * _Nonnull testView) { 71 | BOOL forwardTouches = [self forwardTouchesToClass:testView.class]; 72 | return forwardTouches; 73 | } objects:^(UIView * _Nonnull testView, BOOL * _Nullable stop) { 74 | CGRect imageFrameInSuperview = [testView.superview convertRect:testView.frame toView:weakView]; 75 | if (CGRectContainsPoint(imageFrameInSuperview, tapPoint)) { 76 | mustCapturePoint = NO; 77 | *stop = YES; 78 | } 79 | }]; 80 | return mustCapturePoint; 81 | } 82 | 83 | - (BOOL)forwardTouchesToClass:(Class)class { 84 | while ([class isSubclassOfClass:[NSObject class]]) { 85 | if ([_forwardsTouchesToClasses containsObject:class]) { 86 | return YES; 87 | } 88 | class = [class superclass]; 89 | } 90 | return NO; 91 | } 92 | 93 | @end 94 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/LUNTapPassingScrollView/UIView+EnumerationForTest/UIView+EnumerationForTest.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+Addition.h 3 | // 4 | // Created by Vladimir Sharavara on 3/11/16. 5 | // Copyright © 2016 LunApps. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | @interface UIView (EnumerationForTest) 11 | 12 | - (void)add_enumerateSubviewsPassingTest:(BOOL (^)(UIView * view))testBlock 13 | objects:(void (^)(id obj, BOOL *stop))block; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/LUNTapPassingScrollView/UIView+EnumerationForTest/UIView+EnumerationForTest.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+Addition.m 3 | // 4 | // Created by Vladimir Sharavara on 3/11/16. 5 | // Copyright © 2016 LunApps. All rights reserved. 6 | // 7 | 8 | #import "UIView+EnumerationForTest.h" 9 | 10 | @implementation UIView (EnumerationForTest) 11 | 12 | - (void)add_enumerateSubviewsPassingTest:(BOOL (^_Nonnull)(UIView * _Nonnull view))testBlock 13 | objects:(void (^)(id _Nonnull obj, BOOL * _Nullable stop))block { 14 | if (!block) 15 | return; 16 | 17 | NSMutableArray *array = [NSMutableArray array]; 18 | [array addObject:self]; 19 | 20 | while (array.count > 0) 21 | { 22 | UIView *view = [array firstObject]; 23 | [array removeObjectAtIndex:0]; 24 | 25 | if (view != self && testBlock(view)) 26 | { 27 | BOOL stop = NO; 28 | block(view, &stop); 29 | if (stop) 30 | return; 31 | } 32 | 33 | [array addObjectsFromArray:view.subviews]; 34 | } 35 | } 36 | 37 | @end 38 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/LUNTutorial/Classes/LUNTutorialViewController/LUNTutorialViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNTutorialViewController.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/7/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "LUNTutorialDataSource.h" 11 | #import "LUNTutorialAnimator.h" 12 | #import "LUNTutorialDelegate.h" 13 | #import "LUNTapPassingScrollView.h" 14 | 15 | @interface LUNTutorialViewController : UIViewController { 16 | 17 | @protected 18 | /** 19 | * @brief view of static background, defined by dataSource 20 | */ 21 | __kindof UIView *staticBackgroundView; 22 | 23 | /** 24 | * @brief scrollView that contains dynamic backgrounds views 25 | */ 26 | LUNTapPassingScrollView *backgroundsScrollView; 27 | 28 | /** 29 | * @brief scrollView that contains "text part" views 30 | */ 31 | LUNTapPassingScrollView *labelsScrollView; 32 | 33 | /** 34 | * @brief scrollView that contains icons' views 35 | */ 36 | LUNTapPassingScrollView *iconsScrollView; 37 | 38 | 39 | /** 40 | * @brief dynamic background views' containers 41 | */ 42 | NSArray<__kindof UIView *> *backgroundPages; 43 | 44 | /** 45 | * @brief views of dynamic background, defined by dataSource 46 | */ 47 | NSArray<__kindof UIView *> *dynamicBackgroundViews; 48 | 49 | /** 50 | * @brief wireframes, defined by dataSource 51 | */ 52 | NSArray<__kindof UIView *> *wireframesViews; 53 | 54 | /** 55 | * @brief innerWireframes, defined by dataSource 56 | */ 57 | NSArray<__kindof UIView *> *innerWireframesViews; 58 | 59 | /** 60 | * @brief views that contain "text" information, defined by dataSource 61 | */ 62 | NSArray<__kindof UIView *> *labelsViews; 63 | 64 | /** 65 | * @brief icons, defined by dataSource 66 | */ 67 | NSArray<__kindof UIView *> *iconsViews; 68 | 69 | /** 70 | * @brief static content view, defined by dataSource 71 | */ 72 | __kindof UIView *staticContentView; 73 | 74 | /** 75 | * @brief main scrolling item, it should always be at the top of your hierarchy 76 | */ 77 | LUNTapPassingScrollView *mainScrollView; 78 | 79 | } 80 | 81 | #pragma mark - IBOutlets 82 | 83 | /** 84 | * @brief LUNTutorialViewController will automatically change currentPage of this pageControl 85 | */ 86 | @property (weak, nonatomic) IBOutlet UIPageControl *pageContol; 87 | 88 | @property (weak, nonatomic) IBOutlet id dataSource; 89 | 90 | @property (weak, nonatomic) IBOutlet id animator; 91 | 92 | @property (weak, nonatomic) IBOutlet id delegate; 93 | 94 | #pragma mark - IBInspectables 95 | 96 | /** 97 | * @brief defines number of pages that will be shown on onboarding 98 | */ 99 | 100 | @property (assign, nonatomic) IBInspectable NSInteger numberOfRealPages; 101 | 102 | /** 103 | * @brief defines number of special states of onboarding, special state means, that background and wireframe of current page of onboarding will not be scrolled. Only icons, and labels will change. You can use this, if you want animations or changes in wireframes or background 104 | */ 105 | @property (assign, nonatomic) IBInspectable NSArray *specialStatesIndexes; 106 | 107 | /** 108 | * @brief defines height of staticContentView 109 | */ 110 | @property (assign, nonatomic) IBInspectable CGFloat staticContentHeight; 111 | 112 | /** 113 | * @brief defines height of roundness at the top of staticContentView 114 | */ 115 | @property (assign, nonatomic) IBInspectable CGFloat roundnessHeight; 116 | 117 | #pragma mark - Methods 118 | 119 | /** 120 | * @brief reloads all views, using defined dataSource 121 | */ 122 | - (void)reloadData; 123 | 124 | /** 125 | * @brief shift of item, referred to roundnessHeight of staticContentView 126 | * 127 | * @param relativeX current percentage of passed onboarding width, passed by center of view 128 | * 129 | * @return float value 130 | */ 131 | 132 | - (CGFloat)topOffsetForRelativeX:(CGFloat)relativeX; 133 | 134 | /** 135 | * @brief rotation of item, referred to roundnessHeight of staticContentView 136 | * 137 | * @param relativeX current percentage of passed onboarding width, passed by center of view 138 | * 139 | * @return float value 140 | */ 141 | - (CGFloat)angleForRelativeX:(CGFloat)relativeX; 142 | 143 | 144 | @end 145 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/LUNTutorial/Interfaces/LUNTutorialAnimator/LUNTutorialAnimator/LUNTutorialAnimator.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNTutorialAnimator.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/7/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | 10 | #import "LUNTutorialBackgroundAnimator.h" 11 | #import "LUNTutorialLabelAnimator.h" 12 | #import "LUNTutorialScrollAnimator.h" 13 | #import "LUNTutorialWireframeAnimator.h" 14 | #import "LUNTutorialIconAnimator.h" 15 | #import "LUNTutorialInnerWirefamesAnimator.h" 16 | 17 | @protocol LUNTutorialAnimator 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/LUNTutorial/Interfaces/LUNTutorialAnimator/LUNTutorialBackgroundAnimator/LUNTutorialBackgroundAnimator.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNTutorialBackgroundAnimator.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/7/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @protocol LUNTutorialBackgroundAnimator 13 | 14 | @optional 15 | 16 | - (void (^)(void))backgroundAnimationFromIndex:(NSInteger)startIndex toIndex:(NSInteger)endIndex offset:(CGFloat)offset leftBackground:(__kindof UIView *)leftBackground rightBackground:(__kindof UIView *)rightBackground; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/LUNTutorial/Interfaces/LUNTutorialAnimator/LUNTutorialIconAnimator/LUNTutorialIconAnimator.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNTutorialIconAnimator.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/7/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @protocol LUNTutorialIconAnimator 13 | 14 | @optional 15 | 16 | - (void (^)(void))iconAnimationFromIndex:(NSInteger)startIndex toIndex:(NSInteger)endIndex offset:(CGFloat)offset leftIcon:(__kindof UIView *)leftIcon rightIcon:(__kindof UIView *)rightIcon; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/LUNTutorial/Interfaces/LUNTutorialAnimator/LUNTutorialInnerWireframesAnimator/LUNTutorialInnerWirefamesAnimator.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNTutorialInnerWirefamesAnimator.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 4/13/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @protocol LUNTutorialInnerWirefamesAnimator 12 | 13 | @optional 14 | 15 | - (void (^)(void))innerWireframesAnimationFromIndex:(NSInteger)startIndex toIndex:(NSInteger)endIndex offset:(CGFloat)offset leftItem:(__kindof UIView *)leftItem rightItem:(__kindof UIView *)rightItem; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/LUNTutorial/Interfaces/LUNTutorialAnimator/LUNTutorialLabelAnimator/LUNTutorialLabelAnimator.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNTutorialLabelAnimator.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/7/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @protocol LUNTutorialLabelAnimator 13 | 14 | @optional 15 | 16 | - (void (^)(void))labelsAnimationFromIndex:(NSInteger)startIndex toIndex:(NSInteger)endIndex offset:(CGFloat)offset leftLabel:(__kindof UIView *)leftLabelView rightLabel:(__kindof UIView *)rightLabelView; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/LUNTutorial/Interfaces/LUNTutorialAnimator/LUNTutorialWireframesAnimator/LUNTutorialWireframeAnimator.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNTutorialItemAnimator.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/7/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @protocol LUNTutorialWireframeAnimator 13 | 14 | @optional 15 | 16 | - (void (^)(void))wireframesAnimationFromIndex:(NSInteger)startIndex toIndex:(NSInteger)endIndex offset:(CGFloat)offset leftItem:(__kindof UIView *)leftItem rightItem:(__kindof UIView *)rightItem; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/LUNTutorial/Interfaces/LUNTutorialAnimator/LUNTutroialScrollAnimator/LUNTutorialScrollAnimator.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNTutorialScrollAnimator.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/7/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @protocol LUNTutorialScrollAnimator 12 | 13 | @optional 14 | 15 | - (void (^)(void))scrollStopAnimationAtIndex:(NSInteger)index; 16 | 17 | - (void (^)(void))scrollAlongSideAnimationFromIndex:(NSInteger)startIndex toIndex:(NSInteger)endIndex offset:(CGFloat)offset; 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/LUNTutorial/Interfaces/LUNTutorialDataSource/LUNTutorialBackgroundDataSource/LUNTutorialBackgroundDataSource.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNTutorialBackgroundDataSource.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/7/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @protocol LUNTutorialBackgroundDataSource 13 | 14 | @optional 15 | 16 | - (__kindof UIView *)dynamicBackgroundViewAtIndex:(NSInteger)index; 17 | 18 | - (__kindof UIView *)staticBackgroundView; 19 | 20 | - (UIColor *)scrollViewBackgroundColor; 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/LUNTutorial/Interfaces/LUNTutorialDataSource/LUNTutorialDataSource/LUNTutorialDataSource.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNTutorialDataSource.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/7/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "LUNTutorialBackgroundDataSource.h" 11 | #import "LUNTutorialWireframesDataSource.h" 12 | #import "LUNTutorialInnerWireframesDataSource.h" 13 | #import "LUNTutorialStaticContentViewDataSource.h" 14 | #import "LUNTutorialIconDataSource.h" 15 | #import "LUNTutorialLabelsDataSource.h" 16 | 17 | @protocol LUNTutorialDataSource 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/LUNTutorial/Interfaces/LUNTutorialDataSource/LUNTutorialIconDataSource/LUNTutorialIconDataSource.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNTutorialIconDataSource.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/7/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @protocol LUNTutorialIconDataSource 13 | 14 | @optional 15 | 16 | - (__kindof UIView *)iconAtIndex:(NSInteger)index; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/LUNTutorial/Interfaces/LUNTutorialDataSource/LUNTutorialInnerWireframesDataSource/LUNTutorialInnerWireframesDataSource.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNTutorialInnerWireframesDataSource.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/7/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @protocol LUNTutorialInnerWireframesDataSource 12 | 13 | @optional 14 | 15 | - (__kindof UIView *)innerWireframeViewForIndex:(NSInteger)index; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/LUNTutorial/Interfaces/LUNTutorialDataSource/LUNTutorialLabelsDataSource/LUNTutorialLabelsDataSource.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNTutorialLabelsDataSource.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/7/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @protocol LUNTutorialLabelsDataSource 12 | 13 | @optional 14 | 15 | - (__kindof UIView *)labelViewAtIndex:(NSInteger)index; 16 | 17 | - (CGFloat)labelsTopMargin; 18 | 19 | - (CGFloat)labelsBottomMargin; 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/LUNTutorial/Interfaces/LUNTutorialDataSource/LUNTutorialStaticContentViewDataSource/LUNTutorialStaticContentViewDataSource.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNTutorialStaticContentViewDataSource.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/7/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @protocol LUNTutorialStaticContentViewDataSource 13 | 14 | @optional 15 | 16 | - (__kindof UIView *)staticContentView; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/LUNTutorial/Interfaces/LUNTutorialDataSource/LUNTutorialWireframesDataSource/LUNTutorialWireframesDataSource.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNTutorialWireframesDataSource.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/7/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @protocol LUNTutorialWireframesDataSource 13 | 14 | @optional 15 | 16 | - (__kindof UIView *)wireframeViewForIndex:(NSInteger)index; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/LUNTutorial/Interfaces/LUNTutorialDelegate/LUNTutorialDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNTutorialDelegate.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/31/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | @class LUNTutorialViewController; 11 | 12 | @protocol LUNTutorialDelegate 13 | 14 | @optional 15 | 16 | - (void)LUNTutorialViewController:(LUNTutorialViewController *)tutorialController startedScrollingFromIndex:(NSInteger)index; 17 | 18 | - (void)LUNTutorialViewController:(LUNTutorialViewController *)tutorialController reachedPage:(NSInteger)index; 19 | 20 | - (void)LUNTutorialViewController:(LUNTutorialViewController *)tutorialController reachedScrollPercentage:(CGFloat)percentage leftIndex:(NSInteger)leftIndex rightIndex:(NSInteger)rightIndex; 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/LUNTutorial/Realizations/RotatingWireframesAnimator/LUNRotatingWireframesAnimator.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNRotatingWireframesAnimator.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/15/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "LUNTutorialAnimator.h" 11 | 12 | @interface LUNRotatingWireframesAnimator : NSObject 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/LUNTutorial/Realizations/RotatingWireframesAnimator/LUNRotatingWireframesAnimator.m: -------------------------------------------------------------------------------- 1 | // 2 | // LUNRotatingWireframesAnimator.m 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/15/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import "LUNRotatingWireframesAnimator.h" 10 | 11 | @implementation LUNRotatingWireframesAnimator 12 | 13 | static const CGFloat LUNDefaultWireframeYTranslation = 80.0f; 14 | static const CGFloat LUNDefaultWireframeRotationAngle = 15.0f; 15 | 16 | #pragma mark - LUNTutorialBackgroundAnimator 17 | 18 | - (void (^)(void))backgroundAnimationFromIndex:(NSInteger)startIndex toIndex:(NSInteger)endIndex offset:(CGFloat)offset leftBackground:(__kindof UIView *)leftBackground rightBackground:(__kindof UIView *)rightBackground { 19 | return ^void (void) { 20 | leftBackground.alpha = 1 - offset * offset; 21 | leftBackground.transform = CGAffineTransformMakeTranslation(offset * 175, 0); 22 | 23 | rightBackground.alpha = offset * offset; 24 | rightBackground.transform = CGAffineTransformMakeTranslation((offset - 1) * 175, 0); 25 | }; 26 | } 27 | 28 | #pragma mark - LUNTutorialItemAnimator 29 | 30 | - (void (^)(void))wireframesAnimationFromIndex:(NSInteger)startIndex toIndex:(NSInteger)endIndex offset:(CGFloat)offset leftItem:(__kindof UIView *)leftItem rightItem:(__kindof UIView *)rightItem { 31 | return ^void (void) { 32 | leftItem.alpha = 1 - offset; 33 | leftItem.transform = CGAffineTransformConcat(CGAffineTransformMakeTranslation(0, offset * LUNDefaultWireframeYTranslation), CGAffineTransformMakeRotation(offset * ( - LUNDefaultWireframeRotationAngle) * M_PI / 180.0f)); 34 | 35 | rightItem.alpha = offset; 36 | rightItem.transform = CGAffineTransformConcat(CGAffineTransformMakeTranslation(0, (1 - offset) *LUNDefaultWireframeYTranslation), CGAffineTransformMakeRotation((1 - offset) * LUNDefaultWireframeRotationAngle * M_PI / 180.0f)); 37 | }; 38 | ; 39 | } 40 | 41 | #pragma mark - LUNTutorialLabelAnimator 42 | 43 | - (void (^)(void))labelsAnimationFromIndex:(NSInteger)startIndex toIndex:(NSInteger)endIndex offset:(CGFloat)offset leftLabel:(__kindof UIView *)leftLabelView rightLabel:(__kindof UIView *)rightLabelView { 44 | return ^void (void) { 45 | leftLabelView.alpha = 1 - offset; 46 | 47 | rightLabelView.alpha = offset; 48 | }; 49 | } 50 | 51 | 52 | @end 53 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/LUNXibView/LUNXibView.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Victor Sharavara on 3/24/16. 3 | // Copyright (c) 2016 LunApps. All rights reserved. 4 | // 5 | 6 | #import 7 | #import 8 | 9 | @interface LUNXibView : UIView 10 | 11 | @end -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/LUNXibView/LUNXibView.m: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Victor Sharavara on 3/24/16. 3 | // Copyright (c) 2016 LunApps. All rights reserved. 4 | // 5 | 6 | #import "LUNXibView.h" 7 | 8 | @implementation LUNXibView 9 | 10 | - (instancetype)initWithFrame:(CGRect)frame { 11 | if (self = [super initWithFrame:frame]) { 12 | [self loadViewFromXib]; 13 | } 14 | return self; 15 | } 16 | 17 | - (instancetype)initWithCoder:(NSCoder *)coder { 18 | if (self = [super initWithCoder:coder]) { 19 | [self loadViewFromXib]; 20 | } 21 | return self; 22 | } 23 | 24 | #pragma mark - Private 25 | 26 | - (void)loadViewFromXib { 27 | UIView *view = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil] firstObject]; 28 | view.translatesAutoresizingMaskIntoConstraints = NO; 29 | [self addSubview:view]; 30 | 31 | [self addConstraint:[NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeTop multiplier:1.0f constant:0.0f]]; 32 | [self addConstraint:[NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeBottom multiplier:1.0f constant:0.0f]]; 33 | [self addConstraint:[NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeLeading multiplier:1.0f constant:0.0f]]; 34 | [self addConstraint:[NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeTrailing multiplier:1.0f constant:0.0f]]; 35 | } 36 | 37 | @end -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/NSArray+LUNObjectAtIndex/NSArray+LUNObjectAtIndex.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSArray+LUNObjectAtIndex.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/29/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface NSArray<__covariant ObjectType> (LUNObjectAtIndex) 12 | 13 | - (ObjectType)LUN_objectAtIndex:(NSUInteger)index; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/NSArray+LUNObjectAtIndex/NSArray+LUNObjectAtIndex.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSArray+LUNObjectAtIndex.m 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/29/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import "NSArray+LUNObjectAtIndex.h" 10 | 11 | @implementation NSArray (LUNObjectAtIndex) 12 | 13 | - (id)LUN_objectAtIndex:(NSUInteger)index { 14 | if (index > self.count - 1) { 15 | return nil; 16 | } else { 17 | return self[index]; 18 | } 19 | } 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Resource/Brandon_bld.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Resource/Brandon_bld.otf -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Resource/Brandon_blk.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Resource/Brandon_blk.otf -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/Resource/Brandon_reg.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunAppsMobile/LUNTutorialViewController/65f83518f1f788d25bf1a1920270fa2535a5465b/LUNTutorialDemo/LUNTutorialDemo/Resource/Brandon_reg.otf -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/2/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "LUNTutorialViewController.h" 11 | 12 | @interface ViewController : UIViewController 13 | 14 | @end 15 | 16 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/ViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.m 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/2/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import "ViewController.h" 10 | #import "LUNRotatingWireframesAnimator.h" 11 | 12 | @interface ViewController () 13 | 14 | 15 | @end 16 | 17 | @implementation ViewController 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /LUNTutorialDemo/LUNTutorialDemo/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/2/16. 6 | // Copyright © 2016 lunapps. 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 | -------------------------------------------------------------------------------- /LUNTutorialDemo/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - FXPageControl (1.4) 3 | 4 | DEPENDENCIES: 5 | - FXPageControl 6 | 7 | SPEC CHECKSUMS: 8 | FXPageControl: 5057bf21537579b40ff30e119cd425d16d8ef90a 9 | 10 | COCOAPODS: 0.39.0 11 | -------------------------------------------------------------------------------- /LUNTutorialDemo/Pods/FXPageControl/FXPageControl/FXPageControl.h: -------------------------------------------------------------------------------- 1 | // 2 | // FXPageControl.h 3 | // 4 | // Version 1.4 5 | // 6 | // Created by Nick Lockwood on 07/01/2010. 7 | // Copyright 2010 Charcoal Design 8 | // 9 | // Distributed under the permissive zlib License 10 | // Get the latest version of FXPageControl from here: 11 | // 12 | // https://github.com/nicklockwood/FXPageControl 13 | // 14 | // This software is provided 'as-is', without any express or implied 15 | // warranty. In no event will the authors be held liable for any damages 16 | // arising from the use of this software. 17 | // 18 | // Permission is granted to anyone to use this software for any purpose, 19 | // including commercial applications, and to alter it and redistribute it 20 | // freely, subject to the following restrictions: 21 | // 22 | // 1. The origin of this software must not be misrepresented; you must not 23 | // claim that you wrote the original software. If you use this software 24 | // in a product, an acknowledgment in the product documentation would be 25 | // appreciated but is not required. 26 | // 27 | // 2. Altered source versions must be plainly marked as such, and must not be 28 | // misrepresented as being the original software. 29 | // 30 | // 3. This notice may not be removed or altered from any source distribution. 31 | // 32 | 33 | 34 | #pragma GCC diagnostic push 35 | #pragma GCC diagnostic ignored "-Wobjc-missing-property-synthesis" 36 | #import 37 | 38 | 39 | #import 40 | #undef weak_delegate 41 | #if __has_feature(objc_arc_weak) 42 | #define weak_delegate weak 43 | #else 44 | #define weak_delegate unsafe_unretained 45 | #endif 46 | 47 | 48 | extern const CGPathRef FXPageControlDotShapeCircle; 49 | extern const CGPathRef FXPageControlDotShapeSquare; 50 | extern const CGPathRef FXPageControlDotShapeTriangle; 51 | 52 | 53 | @protocol FXPageControlDelegate; 54 | 55 | 56 | IB_DESIGNABLE @interface FXPageControl : UIControl 57 | 58 | - (void)setUp; 59 | - (CGSize)sizeForNumberOfPages:(NSInteger)pageCount; 60 | - (void)updateCurrentPageDisplay; 61 | 62 | @property (nonatomic, weak_delegate) IBOutlet id delegate; 63 | 64 | @property (nonatomic, assign) IBInspectable NSInteger currentPage; 65 | @property (nonatomic, assign) IBInspectable NSInteger numberOfPages; 66 | @property (nonatomic, assign) IBInspectable BOOL defersCurrentPageDisplay; 67 | @property (nonatomic, assign) IBInspectable BOOL hidesForSinglePage; 68 | @property (nonatomic, assign, getter = isWrapEnabled) IBInspectable BOOL wrapEnabled; 69 | @property (nonatomic, assign, getter = isVertical) IBInspectable BOOL vertical; 70 | 71 | @property (nonatomic, strong) IBInspectable UIImage *dotImage; 72 | @property (nonatomic, assign) IBInspectable CGPathRef dotShape; 73 | @property (nonatomic, assign) IBInspectable CGFloat dotSize; 74 | @property (nonatomic, strong) IBInspectable UIColor *dotColor; 75 | @property (nonatomic, strong) IBInspectable UIColor *dotShadowColor; 76 | @property (nonatomic, assign) IBInspectable CGFloat dotShadowBlur; 77 | @property (nonatomic, assign) IBInspectable CGSize dotShadowOffset; 78 | 79 | @property (nonatomic, strong) IBInspectable UIImage *selectedDotImage; 80 | @property (nonatomic, assign) IBInspectable CGPathRef selectedDotShape; 81 | @property (nonatomic, assign) IBInspectable CGFloat selectedDotSize; 82 | @property (nonatomic, strong) IBInspectable UIColor *selectedDotColor; 83 | @property (nonatomic, strong) IBInspectable UIColor *selectedDotShadowColor; 84 | @property (nonatomic, assign) IBInspectable CGFloat selectedDotShadowBlur; 85 | @property (nonatomic, assign) IBInspectable CGSize selectedDotShadowOffset; 86 | 87 | @property (nonatomic, assign) IBInspectable CGFloat dotSpacing; 88 | 89 | @end 90 | 91 | 92 | @protocol FXPageControlDelegate 93 | @optional 94 | 95 | - (UIImage *)pageControl:(FXPageControl *)pageControl imageForDotAtIndex:(NSInteger)index; 96 | - (CGPathRef)pageControl:(FXPageControl *)pageControl shapeForDotAtIndex:(NSInteger)index; 97 | - (UIColor *)pageControl:(FXPageControl *)pageControl colorForDotAtIndex:(NSInteger)index; 98 | 99 | - (UIImage *)pageControl:(FXPageControl *)pageControl selectedImageForDotAtIndex:(NSInteger)index; 100 | - (CGPathRef)pageControl:(FXPageControl *)pageControl selectedShapeForDotAtIndex:(NSInteger)index; 101 | - (UIColor *)pageControl:(FXPageControl *)pageControl selectedColorForDotAtIndex:(NSInteger)index; 102 | 103 | @end 104 | 105 | 106 | #pragma GCC diagnostic pop 107 | -------------------------------------------------------------------------------- /LUNTutorialDemo/Pods/FXPageControl/LICENSE.md: -------------------------------------------------------------------------------- 1 | FXPageControl 2 | 3 | version 1.4, November 17th, 2014 4 | 5 | Copyright (C) 2010 Charcoal Design 6 | 7 | This software is provided 'as-is', without any express or implied 8 | warranty. In no event will the authors be held liable for any damages 9 | arising from the use of this software. 10 | 11 | Permission is granted to anyone to use this software for any purpose, 12 | including commercial applications, and to alter it and redistribute it 13 | freely, subject to the following restrictions: 14 | 15 | 1. The origin of this software must not be misrepresented; you must not 16 | claim that you wrote the original software. If you use this software 17 | in a product, an acknowledgment in the product documentation would be 18 | appreciated but is not required. 19 | 2. Altered source versions must be plainly marked as such, and must not be 20 | misrepresented as being the original software. 21 | 3. This notice may not be removed or altered from any source distribution. -------------------------------------------------------------------------------- /LUNTutorialDemo/Pods/FXPageControl/README.md: -------------------------------------------------------------------------------- 1 | Purpose 2 | -------------- 3 | 4 | FXPageControl is a drop-in replacement for Apple's UIPageControl that replicates all the functionality of the standard control, but adds the ability to edit the dot colour, size and spacing. 5 | 6 | 7 | Supported iOS & SDK Versions 8 | ----------------------------- 9 | 10 | * Supported build target - iOS 8.1 (Xcode 6.1, Apple LLVM compiler 6.0) 11 | * Earliest supported deployment target - iOS 5.0 12 | * Earliest compatible deployment target - iOS 4.3 13 | 14 | NOTE: 'Supported' means that the library has been tested with this version. 'Compatible' means that the library should work on this iOS version (i.e. it doesn't rely on any unavailable SDK features) but is no longer being tested for compatibility and may require tweaking or bug fixes to run correctly. 15 | 16 | 17 | ARC Compatibility 18 | ------------------ 19 | 20 | As of version 1.2, FXPageControl requires ARC. If you wish to use FXPageControl in a non-ARC project, just add the -fobjc-arc compiler flag to the FXPageControl.m class. To do this, go to the Build Phases tab in your target settings, open the Compile Sources group, double-click FXPageControl.m in the list and type -fobjc-arc into the popover. 21 | 22 | If you wish to convert your whole project to ARC, comment out the #error line in FXPageControl.m, then run the Edit > Refactor > Convert to Objective-C ARC... tool in Xcode and make sure all files that you wish to use ARC for (including FXPageControl.m) are checked. 23 | 24 | 25 | Installation 26 | -------------- 27 | 28 | Just drag the FXPageControl.m and .h files into your project. In Interface Builder add a new view to your window. Set the size to approximately 320 x 36 points and set the class to FXPageControl (you can also create the control programmatically by using: 29 | 30 | [[FXPageControl alloc] initWithFrame:CGRectMake(0, 0, 320, 36)]) 31 | 32 | You can now wire up the FXPageControl in exactly the same way as a standard UIPageControl, as described in Apple's documentation. 33 | 34 | 35 | Configuration 36 | --------------- 37 | 38 | FXPageControl supports all of the methods of UIPageControl (with the exception of the tint options introduced in iOS 6). To change the dot appearance, shape, size and spacing, use the following properties of the control: 39 | 40 | @property (nonatomic, strong) UIImage *dotImage; 41 | @property (nonatomic, assign) CGPathRef dotShape; 42 | @property (nonatomic, assign) CGFloat dotSize; 43 | @property (nonatomic, strong) UIColor *dotColor; 44 | @property (nonatomic, strong) UIColor *dotShadowColor; 45 | @property (nonatomic, assign) CGFloat dotShadowBlur; 46 | @property (nonatomic, assign) CGSize dotShadowOffset; 47 | 48 | @property (nonatomic, strong) UIImage *selectedDotImage; 49 | @property (nonatomic, assign) CGPathRef selectedDotShape; 50 | @property (nonatomic, assign) CGFloat selectedDotSize; 51 | @property (nonatomic, strong) UIColor *selectedDotColor; 52 | @property (nonatomic, strong) UIColor *selectedDotShadowColor; 53 | @property (nonatomic, assign) CGFloat selectedDotShadowBlur; 54 | @property (nonatomic, assign) CGSize selectedDotShadowOffset; 55 | 56 | @property (nonatomic, assign) CGFloat dotSpacing; 57 | 58 | The `dotColor`/`selectedDotColor` properties are nil by default and will be drawn as black unless otherwise specified. If you only specify the `selectedDotColor`, the `dotColor` will be automatically set to the same color, but with 25% opacity. 59 | 60 | The `dotShape`/`selectedDotShape` is `NULL` by default, and will be treated as `FXPageControlDotShapeCircle`. You can either use one of the supplied shape constants, or supply your own CGPath to be drawn for each dot. Note that the path will be retained. 61 | 62 | The `selectedDotSize` is 0 by default and will default to the same size as the `dotSize` (for backwards compatibility). 63 | 64 | The `dotShadowColor`/`selectedDotShadowColor` is `nil` by default, and will be treated as transparent. 65 | 66 | The `dotImage`/`selectedDotImage` is `nil` by default and will override the shape and color options if set. 67 | 68 | The `dotSpacing` specifies the spacing (in points) between the regular (unselected) dots. There is no equivalent "selectedDotSpacing" property. 69 | 70 | Most of these properties can either be set programmatically, or in Interface Builder by using the User Defined Runtime Attributes feature. Alternatively, you could create a subclass of FXPageControl that overrides the default values for these fields, set in the `-setUp` method. 71 | 72 | Unlike the standard UIPageControl, you can also make the FXPageControl wrap around by setting the following property to YES: 73 | 74 | @property (nonatomic, assign, getter = isWrapEnabled) BOOL wrapEnabled; 75 | 76 | You can align the FXPageControl vertically by setting the following property to YES: 77 | 78 | @property (nonatomic, assign, getter = isVertical) BOOL vertical; 79 | 80 | **Note:** with the exception of the CGPathRef values, all of these properties can be set directly in Interface Builder. 81 | 82 | 83 | Delegate 84 | ------------ 85 | 86 | To set the dot image or color individually, implement the FXPageControl delegate. This will allow you to specify different images or colors for different dot indexes. 87 | 88 | The FXPageControlDelegate provides the following methods, all optional: 89 | 90 | - (UIImage *)pageControl:(FXPageControl *)pageControl imageForDotAtIndex:(NSInteger)index; 91 | - (CGPathRef)pageControl:(FXPageControl *)pageControl shapeForDotAtIndex:(NSInteger)index; 92 | - (UIColor *)pageControl:(FXPageControl *)pageControl colorForDotAtIndex:(NSInteger)index; 93 | 94 | - (UIImage *)pageControl:(FXPageControl *)pageControl selectedImageForDotAtIndex:(NSInteger)index; 95 | - (CGPathRef)pageControl:(FXPageControl *)pageControl selectedShapeForDotAtIndex:(NSInteger)index; 96 | - (UIColor *)pageControl:(FXPageControl *)pageControl selectedColorForDotAtIndex:(NSInteger)index; 97 | 98 | If you need to change the color shape or image for a specific dot at runtime, call `-setNeedsDisplay` on the FXPageControl to force it to redraw. 99 | 100 | Note that CGPathRefs that are created and returned from the `-pageControl:shapeForDotAtIndex:` method should be autoreleased to prevent memory leaks. The simplest way to do this is to use a UIBezierPath to create the CGPath. 101 | 102 | 103 | Release Notes 104 | -------------- 105 | 106 | Version 1.4 107 | 108 | - Added `vertical` property for implementing vertical page controls 109 | - Added `IBInspectable` attributes for simpler configuration within Interface Builder 110 | - Now handles taps on touch-up instead of touch-down, like the standard UIPageControl 111 | 112 | Version 1.3.2 113 | 114 | - Added `intrinsicContentSize` method to support AutoLayout 115 | 116 | Version 1.3.1 117 | 118 | - Custom dot images are now correctly centered 119 | - Fixed some additional warnings when targeting iOS 5+ 120 | - Fixed some layout issues in the example project 121 | 122 | Version 1.3 123 | 124 | - Added support for custom dot shapes 125 | - Added support for dot shadows 126 | - Can now specify a different size for selected dot 127 | - Now complies with -Weverything warning level 128 | 129 | Version 1.2.1 130 | 131 | - Fixed bug in custom dot image delegate method 132 | - Now sets dotColor automatically if you specify selectedDotColor 133 | - Added Podspec 134 | 135 | Version 1.2 136 | 137 | - Renamed to FXPageControl 138 | - FXPageControl now requires ARC. See README for details 139 | - Added support for custom dot images 140 | - Renamed wrap property to wrapEnabled 141 | 142 | Version 1.1.1 143 | 144 | - View now redraws itself automatically if bounds are changed 145 | 146 | Version 1.1 147 | 148 | - Added wrap property 149 | - Changed default color to black 150 | - Added missing methods and properties from standard UIPageControl 151 | - Fixed flicker in example code when tapping the page control 152 | 153 | Version 1.0 154 | 155 | - Initial release -------------------------------------------------------------------------------- /LUNTutorialDemo/Pods/Headers/Private/FXPageControl/FXPageControl.h: -------------------------------------------------------------------------------- 1 | ../../../FXPageControl/FXPageControl/FXPageControl.h -------------------------------------------------------------------------------- /LUNTutorialDemo/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - FXPageControl (1.4) 3 | 4 | DEPENDENCIES: 5 | - FXPageControl 6 | 7 | SPEC CHECKSUMS: 8 | FXPageControl: 5057bf21537579b40ff30e119cd425d16d8ef90a 9 | 10 | COCOAPODS: 0.39.0 11 | -------------------------------------------------------------------------------- /LUNTutorialDemo/Pods/Target Support Files/FXPageControl/FXPageControl-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_FXPageControl : NSObject 3 | @end 4 | @implementation PodsDummy_FXPageControl 5 | @end 6 | -------------------------------------------------------------------------------- /LUNTutorialDemo/Pods/Target Support Files/FXPageControl/FXPageControl-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | -------------------------------------------------------------------------------- /LUNTutorialDemo/Pods/Target Support Files/FXPageControl/FXPageControl-umbrella.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "FXPageControl.h" 4 | 5 | FOUNDATION_EXPORT double FXPageControlVersionNumber; 6 | FOUNDATION_EXPORT const unsigned char FXPageControlVersionString[]; 7 | 8 | -------------------------------------------------------------------------------- /LUNTutorialDemo/Pods/Target Support Files/FXPageControl/FXPageControl.modulemap: -------------------------------------------------------------------------------- 1 | framework module FXPageControl { 2 | umbrella header "FXPageControl-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /LUNTutorialDemo/Pods/Target Support Files/FXPageControl/FXPageControl.xcconfig: -------------------------------------------------------------------------------- 1 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 2 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/FXPageControl" "${PODS_ROOT}/Headers/Public" 3 | PODS_ROOT = ${SRCROOT} 4 | SKIP_INSTALL = YES -------------------------------------------------------------------------------- /LUNTutorialDemo/Pods/Target Support Files/FXPageControl/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.4 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /LUNTutorialDemo/Pods/Target Support Files/Pods-LUNTutorialDemo/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /LUNTutorialDemo/Pods/Target Support Files/Pods-LUNTutorialDemo/Pods-LUNTutorialDemo-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## FXPageControl 5 | 6 | FXPageControl 7 | 8 | version 1.4, November 17th, 2014 9 | 10 | Copyright (C) 2010 Charcoal Design 11 | 12 | This software is provided 'as-is', without any express or implied 13 | warranty. In no event will the authors be held liable for any damages 14 | arising from the use of this software. 15 | 16 | Permission is granted to anyone to use this software for any purpose, 17 | including commercial applications, and to alter it and redistribute it 18 | freely, subject to the following restrictions: 19 | 20 | 1. The origin of this software must not be misrepresented; you must not 21 | claim that you wrote the original software. If you use this software 22 | in a product, an acknowledgment in the product documentation would be 23 | appreciated but is not required. 24 | 2. Altered source versions must be plainly marked as such, and must not be 25 | misrepresented as being the original software. 26 | 3. This notice may not be removed or altered from any source distribution. 27 | Generated by CocoaPods - http://cocoapods.org 28 | -------------------------------------------------------------------------------- /LUNTutorialDemo/Pods/Target Support Files/Pods-LUNTutorialDemo/Pods-LUNTutorialDemo-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | FXPageControl 18 | 19 | version 1.4, November 17th, 2014 20 | 21 | Copyright (C) 2010 Charcoal Design 22 | 23 | This software is provided 'as-is', without any express or implied 24 | warranty. In no event will the authors be held liable for any damages 25 | arising from the use of this software. 26 | 27 | Permission is granted to anyone to use this software for any purpose, 28 | including commercial applications, and to alter it and redistribute it 29 | freely, subject to the following restrictions: 30 | 31 | 1. The origin of this software must not be misrepresented; you must not 32 | claim that you wrote the original software. If you use this software 33 | in a product, an acknowledgment in the product documentation would be 34 | appreciated but is not required. 35 | 2. Altered source versions must be plainly marked as such, and must not be 36 | misrepresented as being the original software. 37 | 3. This notice may not be removed or altered from any source distribution. 38 | Title 39 | FXPageControl 40 | Type 41 | PSGroupSpecifier 42 | 43 | 44 | FooterText 45 | Generated by CocoaPods - http://cocoapods.org 46 | Title 47 | 48 | Type 49 | PSGroupSpecifier 50 | 51 | 52 | StringsTable 53 | Acknowledgements 54 | Title 55 | Acknowledgements 56 | 57 | 58 | -------------------------------------------------------------------------------- /LUNTutorialDemo/Pods/Target Support Files/Pods-LUNTutorialDemo/Pods-LUNTutorialDemo-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_LUNTutorialDemo : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_LUNTutorialDemo 5 | @end 6 | -------------------------------------------------------------------------------- /LUNTutorialDemo/Pods/Target Support Files/Pods-LUNTutorialDemo/Pods-LUNTutorialDemo-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 5 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 6 | 7 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 8 | 9 | install_framework() 10 | { 11 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 12 | local source="${BUILT_PRODUCTS_DIR}/$1" 13 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 14 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 15 | elif [ -r "$1" ]; then 16 | local source="$1" 17 | fi 18 | 19 | local destination="${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 20 | 21 | if [ -L "${source}" ]; then 22 | echo "Symlinked..." 23 | source="$(readlink "${source}")" 24 | fi 25 | 26 | # use filter instead of exclude so missing patterns dont' throw errors 27 | echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 28 | rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 29 | 30 | local basename 31 | basename="$(basename -s .framework "$1")" 32 | binary="${destination}/${basename}.framework/${basename}" 33 | if ! [ -r "$binary" ]; then 34 | binary="${destination}/${basename}" 35 | fi 36 | 37 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 38 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 39 | strip_invalid_archs "$binary" 40 | fi 41 | 42 | # Resign the code if required by the build settings to avoid unstable apps 43 | code_sign_if_enabled "${destination}/$(basename "$1")" 44 | 45 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 46 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 47 | local swift_runtime_libs 48 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) 49 | for lib in $swift_runtime_libs; do 50 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 51 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 52 | code_sign_if_enabled "${destination}/${lib}" 53 | done 54 | fi 55 | } 56 | 57 | # Signs a framework with the provided identity 58 | code_sign_if_enabled() { 59 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 60 | # Use the current code_sign_identitiy 61 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 62 | echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements \"$1\"" 63 | /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements "$1" 64 | fi 65 | } 66 | 67 | # Strip invalid architectures 68 | strip_invalid_archs() { 69 | binary="$1" 70 | # Get architectures for current file 71 | archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" 72 | stripped="" 73 | for arch in $archs; do 74 | if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then 75 | # Strip non-valid architectures in-place 76 | lipo -remove "$arch" -output "$binary" "$binary" || exit 1 77 | stripped="$stripped $arch" 78 | fi 79 | done 80 | if [[ "$stripped" ]]; then 81 | echo "Stripped $binary of architectures:$stripped" 82 | fi 83 | } 84 | 85 | 86 | if [[ "$CONFIGURATION" == "Debug" ]]; then 87 | install_framework "Pods-LUNTutorialDemo/FXPageControl.framework" 88 | fi 89 | if [[ "$CONFIGURATION" == "Release" ]]; then 90 | install_framework "Pods-LUNTutorialDemo/FXPageControl.framework" 91 | fi 92 | -------------------------------------------------------------------------------- /LUNTutorialDemo/Pods/Target Support Files/Pods-LUNTutorialDemo/Pods-LUNTutorialDemo-resources.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 5 | 6 | RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt 7 | > "$RESOURCES_TO_COPY" 8 | 9 | XCASSET_FILES=() 10 | 11 | realpath() { 12 | DIRECTORY="$(cd "${1%/*}" && pwd)" 13 | FILENAME="${1##*/}" 14 | echo "$DIRECTORY/$FILENAME" 15 | } 16 | 17 | install_resource() 18 | { 19 | case $1 in 20 | *.storyboard) 21 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc ${PODS_ROOT}/$1 --sdk ${SDKROOT}" 22 | ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" 23 | ;; 24 | *.xib) 25 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib ${PODS_ROOT}/$1 --sdk ${SDKROOT}" 26 | ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" 27 | ;; 28 | *.framework) 29 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 30 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 31 | echo "rsync -av ${PODS_ROOT}/$1 ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 32 | rsync -av "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 33 | ;; 34 | *.xcdatamodel) 35 | echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1"`.mom\"" 36 | xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodel`.mom" 37 | ;; 38 | *.xcdatamodeld) 39 | echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd\"" 40 | xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd" 41 | ;; 42 | *.xcmappingmodel) 43 | echo "xcrun mapc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm\"" 44 | xcrun mapc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm" 45 | ;; 46 | *.xcassets) 47 | ABSOLUTE_XCASSET_FILE=$(realpath "${PODS_ROOT}/$1") 48 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") 49 | ;; 50 | /*) 51 | echo "$1" 52 | echo "$1" >> "$RESOURCES_TO_COPY" 53 | ;; 54 | *) 55 | echo "${PODS_ROOT}/$1" 56 | echo "${PODS_ROOT}/$1" >> "$RESOURCES_TO_COPY" 57 | ;; 58 | esac 59 | } 60 | 61 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 62 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 63 | if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then 64 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 65 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 66 | fi 67 | rm -f "$RESOURCES_TO_COPY" 68 | 69 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] 70 | then 71 | case "${TARGETED_DEVICE_FAMILY}" in 72 | 1,2) 73 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" 74 | ;; 75 | 1) 76 | TARGET_DEVICE_ARGS="--target-device iphone" 77 | ;; 78 | 2) 79 | TARGET_DEVICE_ARGS="--target-device ipad" 80 | ;; 81 | *) 82 | TARGET_DEVICE_ARGS="--target-device mac" 83 | ;; 84 | esac 85 | 86 | # Find all other xcassets (this unfortunately includes those of path pods and other targets). 87 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) 88 | while read line; do 89 | if [[ $line != "`realpath $PODS_ROOT`*" ]]; then 90 | XCASSET_FILES+=("$line") 91 | fi 92 | done <<<"$OTHER_XCASSETS" 93 | 94 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${IPHONEOS_DEPLOYMENT_TARGET}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 95 | fi 96 | -------------------------------------------------------------------------------- /LUNTutorialDemo/Pods/Target Support Files/Pods-LUNTutorialDemo/Pods-LUNTutorialDemo-umbrella.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | 4 | FOUNDATION_EXPORT double Pods_LUNTutorialDemoVersionNumber; 5 | FOUNDATION_EXPORT const unsigned char Pods_LUNTutorialDemoVersionString[]; 6 | 7 | -------------------------------------------------------------------------------- /LUNTutorialDemo/Pods/Target Support Files/Pods-LUNTutorialDemo/Pods-LUNTutorialDemo.debug.xcconfig: -------------------------------------------------------------------------------- 1 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 2 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 3 | OTHER_CFLAGS = $(inherited) -iquote "$CONFIGURATION_BUILD_DIR/FXPageControl.framework/Headers" 4 | OTHER_LDFLAGS = $(inherited) -framework "FXPageControl" 5 | PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods-LUNTutorialDemo 6 | PODS_ROOT = ${SRCROOT}/Pods -------------------------------------------------------------------------------- /LUNTutorialDemo/Pods/Target Support Files/Pods-LUNTutorialDemo/Pods-LUNTutorialDemo.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_LUNTutorialDemo { 2 | umbrella header "Pods-LUNTutorialDemo-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /LUNTutorialDemo/Pods/Target Support Files/Pods-LUNTutorialDemo/Pods-LUNTutorialDemo.release.xcconfig: -------------------------------------------------------------------------------- 1 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 2 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 3 | OTHER_CFLAGS = $(inherited) -iquote "$CONFIGURATION_BUILD_DIR/FXPageControl.framework/Headers" 4 | OTHER_LDFLAGS = $(inherited) -framework "FXPageControl" 5 | PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods-LUNTutorialDemo 6 | PODS_ROOT = ${SRCROOT}/Pods -------------------------------------------------------------------------------- /LUNTutorialDemo/podfile: -------------------------------------------------------------------------------- 1 | use_frameworks! 2 | target ‘LUNTutorialDemo’ do 3 | pod 'FXPageControl' 4 | end -------------------------------------------------------------------------------- /LUNTutorialViewController.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = 'LUNTutorialViewController' 3 | s.version = '1.0.0' 4 | s.summary = 'UIViewController designed to simplify creation of tutorial/onboarding of your iOS application' 5 | s.description = 'UIViewController designed to simplify creation of tutorial/onboarding of your iOS application.' 6 | s.screenshots = 'https://i1.wp.com/lunapps.com/blog/wp-content/uploads/2016/04/5_scaled-1.gif?zoom=2&resize=500%2C334&ssl=1' 7 | s.homepage = 'https://github.com/LunApps/LUNTutorialViewController' 8 | s.license = { :type => 'MIT', :file => 'LICENSE' } 9 | s.author = { 'Vladimir Sharavara' => 'vovasharavara@gmail.com' } 10 | s.platform = :ios, '8.0' 11 | s.source = { :git => 'https://github.com/LunApps/LUNTutorialViewController.git', :tag => '1.0.0' } 12 | s.source_files = 'LUNTutorialViewController/**/*.{h,m}' 13 | s.requires_arc = true 14 | end -------------------------------------------------------------------------------- /LUNTutorialViewController/LUNTapPassingScrollView/LUNTapPassingScrollView/LUNTapPassingScrollView.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNTapPassingScrollView.h 3 | // 4 | // Created by Vladimir Sharavara on 3/11/16. 5 | // Copyright © 2016 LunApps. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | @interface LUNTapPassingScrollView : UIScrollView 11 | 12 | 13 | @property (nonatomic, strong) NSSet *forwardsTouchesToClasses; 14 | 15 | @property (nonatomic, strong) NSArray<__kindof UIView *> *underlyingViews; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /LUNTutorialViewController/LUNTapPassingScrollView/LUNTapPassingScrollView/LUNTapPassingScrollView.m: -------------------------------------------------------------------------------- 1 | // 2 | // LUNTapPassingScrollView.m 3 | // 4 | // Created by Vladimir Sharavara on 3/11/16. 5 | // Copyright © 2016 LunApps. All rights reserved. 6 | // 7 | 8 | #import "LUNTapPassingScrollView.h" 9 | #import "UIView+EnumerationForTest.h" 10 | 11 | @implementation LUNTapPassingScrollView 12 | 13 | - (instancetype)init { 14 | self = [super init]; 15 | if (self) { 16 | [self initialSetup]; 17 | } 18 | return self; 19 | } 20 | 21 | - (instancetype)initWithCoder:(NSCoder *)aDecoder { 22 | self = [super initWithCoder:aDecoder]; 23 | if (self) { 24 | [self initialSetup]; 25 | } 26 | return self; 27 | } 28 | 29 | - (instancetype)initWithFrame:(CGRect)frame { 30 | self = [super initWithFrame:frame]; 31 | if (self) { 32 | [self initialSetup]; 33 | } 34 | return self; 35 | } 36 | 37 | - (void)initialSetup { 38 | _forwardsTouchesToClasses = [NSSet setWithArray:@[[UIControl class]]]; 39 | } 40 | 41 | - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { 42 | BOOL pointInside = [self mustCapturePoint:point withEvent:event]; 43 | if (!pointInside) { 44 | return NO; 45 | } 46 | return [super pointInside:point withEvent:event]; 47 | } 48 | 49 | #pragma mark - Private Methods 50 | 51 | - (BOOL)mustCapturePoint:(CGPoint)point withEvent:(UIEvent *)event { 52 | if (![self mustCapturePoint:point withEvent:event view:self.superview]) { 53 | return NO; 54 | } 55 | 56 | __block BOOL mustCapturePoint = YES; 57 | [_underlyingViews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { 58 | if (![self mustCapturePoint:point withEvent:event view:obj]) { 59 | mustCapturePoint = NO; 60 | *stop = YES; 61 | } 62 | }]; 63 | return mustCapturePoint; 64 | } 65 | 66 | - (BOOL)mustCapturePoint:(CGPoint)point withEvent:(UIEvent *)event view:(UIView *)view { 67 | CGPoint tapPoint = [self convertPoint:point toView:view]; 68 | __block BOOL mustCapturePoint = YES; 69 | __block UIView *weakView = view; 70 | [view add_enumerateSubviewsPassingTest:^BOOL(UIView * _Nonnull testView) { 71 | BOOL forwardTouches = [self forwardTouchesToClass:testView.class]; 72 | return forwardTouches; 73 | } objects:^(UIView * _Nonnull testView, BOOL * _Nullable stop) { 74 | CGRect imageFrameInSuperview = [testView.superview convertRect:testView.frame toView:weakView]; 75 | if (CGRectContainsPoint(imageFrameInSuperview, tapPoint)) { 76 | mustCapturePoint = NO; 77 | *stop = YES; 78 | } 79 | }]; 80 | return mustCapturePoint; 81 | } 82 | 83 | - (BOOL)forwardTouchesToClass:(Class)class { 84 | while ([class isSubclassOfClass:[NSObject class]]) { 85 | if ([_forwardsTouchesToClasses containsObject:class]) { 86 | return YES; 87 | } 88 | class = [class superclass]; 89 | } 90 | return NO; 91 | } 92 | 93 | @end 94 | -------------------------------------------------------------------------------- /LUNTutorialViewController/LUNTapPassingScrollView/UIView+EnumerationForTest/UIView+EnumerationForTest.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+Addition.h 3 | // 4 | // Created by Vladimir Sharavara on 3/11/16. 5 | // Copyright © 2016 LunApps. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | @interface UIView (EnumerationForTest) 11 | 12 | - (void)add_enumerateSubviewsPassingTest:(BOOL (^)(UIView * view))testBlock 13 | objects:(void (^)(id obj, BOOL *stop))block; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /LUNTutorialViewController/LUNTapPassingScrollView/UIView+EnumerationForTest/UIView+EnumerationForTest.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+Addition.m 3 | // 4 | // Created by Vladimir Sharavara on 3/11/16. 5 | // Copyright © 2016 LunApps. All rights reserved. 6 | // 7 | 8 | #import "UIView+EnumerationForTest.h" 9 | 10 | @implementation UIView (EnumerationForTest) 11 | 12 | - (void)add_enumerateSubviewsPassingTest:(BOOL (^_Nonnull)(UIView * _Nonnull view))testBlock 13 | objects:(void (^)(id _Nonnull obj, BOOL * _Nullable stop))block { 14 | if (!block) 15 | return; 16 | 17 | NSMutableArray *array = [NSMutableArray array]; 18 | [array addObject:self]; 19 | 20 | while (array.count > 0) 21 | { 22 | UIView *view = [array firstObject]; 23 | [array removeObjectAtIndex:0]; 24 | 25 | if (view != self && testBlock(view)) 26 | { 27 | BOOL stop = NO; 28 | block(view, &stop); 29 | if (stop) 30 | return; 31 | } 32 | 33 | [array addObjectsFromArray:view.subviews]; 34 | } 35 | } 36 | 37 | @end 38 | -------------------------------------------------------------------------------- /LUNTutorialViewController/LUNTutorial/Classes/LUNTutorialViewController/LUNTutorialViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNTutorialViewController.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/7/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "LUNTutorialDataSource.h" 11 | #import "LUNTutorialAnimator.h" 12 | #import "LUNTutorialDelegate.h" 13 | #import "LUNTapPassingScrollView.h" 14 | 15 | @interface LUNTutorialViewController : UIViewController { 16 | 17 | @protected 18 | /** 19 | * @brief view of static background, defined by dataSource 20 | */ 21 | __kindof UIView *staticBackgroundView; 22 | 23 | /** 24 | * @brief scrollView that contains dynamic backgrounds views 25 | */ 26 | LUNTapPassingScrollView *backgroundsScrollView; 27 | 28 | /** 29 | * @brief scrollView that contains "text part" views 30 | */ 31 | LUNTapPassingScrollView *labelsScrollView; 32 | 33 | /** 34 | * @brief scrollView that contains icons' views 35 | */ 36 | LUNTapPassingScrollView *iconsScrollView; 37 | 38 | 39 | /** 40 | * @brief dynamic background views' containers 41 | */ 42 | NSArray<__kindof UIView *> *backgroundPages; 43 | 44 | /** 45 | * @brief views of dynamic background, defined by dataSource 46 | */ 47 | NSArray<__kindof UIView *> *dynamicBackgroundViews; 48 | 49 | /** 50 | * @brief wireframes, defined by dataSource 51 | */ 52 | NSArray<__kindof UIView *> *wireframesViews; 53 | 54 | /** 55 | * @brief innerWireframes, defined by dataSource 56 | */ 57 | NSArray<__kindof UIView *> *innerWireframesViews; 58 | 59 | /** 60 | * @brief views that contain "text" information, defined by dataSource 61 | */ 62 | NSArray<__kindof UIView *> *labelsViews; 63 | 64 | /** 65 | * @brief icons, defined by dataSource 66 | */ 67 | NSArray<__kindof UIView *> *iconsViews; 68 | 69 | /** 70 | * @brief static content view, defined by dataSource 71 | */ 72 | __kindof UIView *staticContentView; 73 | 74 | /** 75 | * @brief main scrolling item, it should always be at the top of your hierarchy 76 | */ 77 | LUNTapPassingScrollView *mainScrollView; 78 | 79 | } 80 | 81 | #pragma mark - IBOutlets 82 | 83 | /** 84 | * @brief LUNTutorialViewController will automatically change currentPage of this pageControl 85 | */ 86 | @property (weak, nonatomic) IBOutlet UIPageControl *pageContol; 87 | 88 | @property (weak, nonatomic) IBOutlet id dataSource; 89 | 90 | @property (weak, nonatomic) IBOutlet id animator; 91 | 92 | @property (weak, nonatomic) IBOutlet id delegate; 93 | 94 | #pragma mark - IBInspectables 95 | 96 | /** 97 | * @brief defines number of pages that will be shown on onboarding 98 | */ 99 | 100 | @property (assign, nonatomic) IBInspectable NSInteger numberOfRealPages; 101 | 102 | /** 103 | * @brief defines number of special states of onboarding, special state means, that background and wireframe of current page of onboarding will not be scrolled. Only icons, and labels will change. You can use this, if you want animations or changes in wireframes or background 104 | */ 105 | @property (assign, nonatomic) IBInspectable NSArray *specialStatesIndexes; 106 | 107 | /** 108 | * @brief defines height of staticContentView 109 | */ 110 | @property (assign, nonatomic) IBInspectable CGFloat staticContentHeight; 111 | 112 | /** 113 | * @brief defines height of roundness at the top of staticContentView 114 | */ 115 | @property (assign, nonatomic) IBInspectable CGFloat roundnessHeight; 116 | 117 | #pragma mark - Methods 118 | 119 | /** 120 | * @brief reloads all views, using defined dataSource 121 | */ 122 | - (void)reloadData; 123 | 124 | /** 125 | * @brief shift of item, referred to roundnessHeight of staticContentView 126 | * 127 | * @param relativeX current percentage of passed onboarding width, passed by center of view 128 | * 129 | * @return float value 130 | */ 131 | 132 | - (CGFloat)topOffsetForRelativeX:(CGFloat)relativeX; 133 | 134 | /** 135 | * @brief rotation of item, referred to roundnessHeight of staticContentView 136 | * 137 | * @param relativeX current percentage of passed onboarding width, passed by center of view 138 | * 139 | * @return float value 140 | */ 141 | - (CGFloat)angleForRelativeX:(CGFloat)relativeX; 142 | 143 | 144 | @end 145 | -------------------------------------------------------------------------------- /LUNTutorialViewController/LUNTutorial/Interfaces/LUNTutorialAnimator/LUNTutorialAnimator/LUNTutorialAnimator.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNTutorialAnimator.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/7/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | 10 | #import "LUNTutorialBackgroundAnimator.h" 11 | #import "LUNTutorialLabelAnimator.h" 12 | #import "LUNTutorialScrollAnimator.h" 13 | #import "LUNTutorialWireframeAnimator.h" 14 | #import "LUNTutorialIconAnimator.h" 15 | #import "LUNTutorialInnerWirefamesAnimator.h" 16 | 17 | @protocol LUNTutorialAnimator 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /LUNTutorialViewController/LUNTutorial/Interfaces/LUNTutorialAnimator/LUNTutorialBackgroundAnimator/LUNTutorialBackgroundAnimator.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNTutorialBackgroundAnimator.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/7/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @protocol LUNTutorialBackgroundAnimator 13 | 14 | @optional 15 | 16 | - (void (^)(void))backgroundAnimationFromIndex:(NSInteger)startIndex toIndex:(NSInteger)endIndex offset:(CGFloat)offset leftBackground:(__kindof UIView *)leftBackground rightBackground:(__kindof UIView *)rightBackground; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /LUNTutorialViewController/LUNTutorial/Interfaces/LUNTutorialAnimator/LUNTutorialIconAnimator/LUNTutorialIconAnimator.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNTutorialIconAnimator.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/7/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @protocol LUNTutorialIconAnimator 13 | 14 | @optional 15 | 16 | - (void (^)(void))iconAnimationFromIndex:(NSInteger)startIndex toIndex:(NSInteger)endIndex offset:(CGFloat)offset leftIcon:(__kindof UIView *)leftIcon rightIcon:(__kindof UIView *)rightIcon; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /LUNTutorialViewController/LUNTutorial/Interfaces/LUNTutorialAnimator/LUNTutorialInnerWireframesAnimator/LUNTutorialInnerWirefamesAnimator.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNTutorialInnerWirefamesAnimator.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 4/13/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @protocol LUNTutorialInnerWirefamesAnimator 12 | 13 | @optional 14 | 15 | - (void (^)(void))innerWireframesAnimationFromIndex:(NSInteger)startIndex toIndex:(NSInteger)endIndex offset:(CGFloat)offset leftItem:(__kindof UIView *)leftItem rightItem:(__kindof UIView *)rightItem; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /LUNTutorialViewController/LUNTutorial/Interfaces/LUNTutorialAnimator/LUNTutorialLabelAnimator/LUNTutorialLabelAnimator.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNTutorialLabelAnimator.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/7/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @protocol LUNTutorialLabelAnimator 13 | 14 | @optional 15 | 16 | - (void (^)(void))labelsAnimationFromIndex:(NSInteger)startIndex toIndex:(NSInteger)endIndex offset:(CGFloat)offset leftLabel:(__kindof UIView *)leftLabelView rightLabel:(__kindof UIView *)rightLabelView; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /LUNTutorialViewController/LUNTutorial/Interfaces/LUNTutorialAnimator/LUNTutorialWireframesAnimator/LUNTutorialWireframeAnimator.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNTutorialItemAnimator.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/7/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @protocol LUNTutorialWireframeAnimator 13 | 14 | @optional 15 | 16 | - (void (^)(void))wireframesAnimationFromIndex:(NSInteger)startIndex toIndex:(NSInteger)endIndex offset:(CGFloat)offset leftItem:(__kindof UIView *)leftItem rightItem:(__kindof UIView *)rightItem; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /LUNTutorialViewController/LUNTutorial/Interfaces/LUNTutorialAnimator/LUNTutroialScrollAnimator/LUNTutorialScrollAnimator.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNTutorialScrollAnimator.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/7/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @protocol LUNTutorialScrollAnimator 12 | 13 | @optional 14 | 15 | - (void (^)(void))scrollStopAnimationAtIndex:(NSInteger)index; 16 | 17 | - (void (^)(void))scrollAlongSideAnimationFromIndex:(NSInteger)startIndex toIndex:(NSInteger)endIndex offset:(CGFloat)offset; 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /LUNTutorialViewController/LUNTutorial/Interfaces/LUNTutorialDataSource/LUNTutorialBackgroundDataSource/LUNTutorialBackgroundDataSource.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNTutorialBackgroundDataSource.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/7/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @protocol LUNTutorialBackgroundDataSource 13 | 14 | @optional 15 | 16 | - (__kindof UIView *)dynamicBackgroundViewAtIndex:(NSInteger)index; 17 | 18 | - (__kindof UIView *)staticBackgroundView; 19 | 20 | - (UIColor *)scrollViewBackgroundColor; 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /LUNTutorialViewController/LUNTutorial/Interfaces/LUNTutorialDataSource/LUNTutorialDataSource/LUNTutorialDataSource.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNTutorialDataSource.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/7/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "LUNTutorialBackgroundDataSource.h" 11 | #import "LUNTutorialWireframesDataSource.h" 12 | #import "LUNTutorialInnerWireframesDataSource.h" 13 | #import "LUNTutorialStaticContentViewDataSource.h" 14 | #import "LUNTutorialIconDataSource.h" 15 | #import "LUNTutorialLabelsDataSource.h" 16 | 17 | @protocol LUNTutorialDataSource 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /LUNTutorialViewController/LUNTutorial/Interfaces/LUNTutorialDataSource/LUNTutorialIconDataSource/LUNTutorialIconDataSource.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNTutorialIconDataSource.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/7/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @protocol LUNTutorialIconDataSource 13 | 14 | @optional 15 | 16 | - (__kindof UIView *)iconAtIndex:(NSInteger)index; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /LUNTutorialViewController/LUNTutorial/Interfaces/LUNTutorialDataSource/LUNTutorialInnerWireframesDataSource/LUNTutorialInnerWireframesDataSource.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNTutorialInnerWireframesDataSource.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/7/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @protocol LUNTutorialInnerWireframesDataSource 12 | 13 | @optional 14 | 15 | - (__kindof UIView *)innerWireframeViewForIndex:(NSInteger)index; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /LUNTutorialViewController/LUNTutorial/Interfaces/LUNTutorialDataSource/LUNTutorialLabelsDataSource/LUNTutorialLabelsDataSource.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNTutorialLabelsDataSource.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/7/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @protocol LUNTutorialLabelsDataSource 12 | 13 | @optional 14 | 15 | - (__kindof UIView *)labelViewAtIndex:(NSInteger)index; 16 | 17 | - (CGFloat)labelsTopMargin; 18 | 19 | - (CGFloat)labelsBottomMargin; 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /LUNTutorialViewController/LUNTutorial/Interfaces/LUNTutorialDataSource/LUNTutorialStaticContentViewDataSource/LUNTutorialStaticContentViewDataSource.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNTutorialStaticContentViewDataSource.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/7/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @protocol LUNTutorialStaticContentViewDataSource 13 | 14 | @optional 15 | 16 | - (__kindof UIView *)staticContentView; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /LUNTutorialViewController/LUNTutorial/Interfaces/LUNTutorialDataSource/LUNTutorialWireframesDataSource/LUNTutorialWireframesDataSource.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNTutorialWireframesDataSource.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/7/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @protocol LUNTutorialWireframesDataSource 13 | 14 | @optional 15 | 16 | - (__kindof UIView *)wireframeViewForIndex:(NSInteger)index; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /LUNTutorialViewController/LUNTutorial/Interfaces/LUNTutorialDelegate/LUNTutorialDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNTutorialDelegate.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/31/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | @class LUNTutorialViewController; 11 | 12 | @protocol LUNTutorialDelegate 13 | 14 | @optional 15 | 16 | - (void)LUNTutorialViewController:(LUNTutorialViewController *)tutorialController startedScrollingFromIndex:(NSInteger)index; 17 | 18 | - (void)LUNTutorialViewController:(LUNTutorialViewController *)tutorialController reachedPage:(NSInteger)index; 19 | 20 | - (void)LUNTutorialViewController:(LUNTutorialViewController *)tutorialController reachedScrollPercentage:(CGFloat)percentage leftIndex:(NSInteger)leftIndex rightIndex:(NSInteger)rightIndex; 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /LUNTutorialViewController/LUNTutorial/Realizations/RotatingWireframesAnimator/LUNRotatingWireframesAnimator.h: -------------------------------------------------------------------------------- 1 | // 2 | // LUNRotatingWireframesAnimator.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/15/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "LUNTutorialAnimator.h" 11 | 12 | @interface LUNRotatingWireframesAnimator : NSObject 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /LUNTutorialViewController/LUNTutorial/Realizations/RotatingWireframesAnimator/LUNRotatingWireframesAnimator.m: -------------------------------------------------------------------------------- 1 | // 2 | // LUNRotatingWireframesAnimator.m 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/15/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import "LUNRotatingWireframesAnimator.h" 10 | 11 | @implementation LUNRotatingWireframesAnimator 12 | 13 | static const CGFloat LUNDefaultWireframeYTranslation = 80.0f; 14 | static const CGFloat LUNDefaultWireframeRotationAngle = 15.0f; 15 | 16 | #pragma mark - LUNTutorialBackgroundAnimator 17 | 18 | - (void (^)(void))backgroundAnimationFromIndex:(NSInteger)startIndex toIndex:(NSInteger)endIndex offset:(CGFloat)offset leftBackground:(__kindof UIView *)leftBackground rightBackground:(__kindof UIView *)rightBackground { 19 | return ^void (void) { 20 | leftBackground.alpha = 1 - offset * offset; 21 | leftBackground.transform = CGAffineTransformMakeTranslation(offset * 175, 0); 22 | 23 | rightBackground.alpha = offset * offset; 24 | rightBackground.transform = CGAffineTransformMakeTranslation((offset - 1) * 175, 0); 25 | }; 26 | } 27 | 28 | #pragma mark - LUNTutorialItemAnimator 29 | 30 | - (void (^)(void))wireframesAnimationFromIndex:(NSInteger)startIndex toIndex:(NSInteger)endIndex offset:(CGFloat)offset leftItem:(__kindof UIView *)leftItem rightItem:(__kindof UIView *)rightItem { 31 | return ^void (void) { 32 | leftItem.alpha = 1 - offset; 33 | leftItem.transform = CGAffineTransformConcat(CGAffineTransformMakeTranslation(0, offset * LUNDefaultWireframeYTranslation), CGAffineTransformMakeRotation(offset * ( - LUNDefaultWireframeRotationAngle) * M_PI / 180.0f)); 34 | 35 | rightItem.alpha = offset; 36 | rightItem.transform = CGAffineTransformConcat(CGAffineTransformMakeTranslation(0, (1 - offset) *LUNDefaultWireframeYTranslation), CGAffineTransformMakeRotation((1 - offset) * LUNDefaultWireframeRotationAngle * M_PI / 180.0f)); 37 | }; 38 | ; 39 | } 40 | 41 | #pragma mark - LUNTutorialLabelAnimator 42 | 43 | - (void (^)(void))labelsAnimationFromIndex:(NSInteger)startIndex toIndex:(NSInteger)endIndex offset:(CGFloat)offset leftLabel:(__kindof UIView *)leftLabelView rightLabel:(__kindof UIView *)rightLabelView { 44 | return ^void (void) { 45 | leftLabelView.alpha = 1 - offset; 46 | 47 | rightLabelView.alpha = offset; 48 | }; 49 | } 50 | 51 | 52 | @end 53 | -------------------------------------------------------------------------------- /LUNTutorialViewController/NSArray+LUNObjectAtIndex/NSArray+LUNObjectAtIndex.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSArray+LUNObjectAtIndex.h 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/29/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface NSArray<__covariant ObjectType> (LUNObjectAtIndex) 12 | 13 | - (ObjectType)LUN_objectAtIndex:(NSUInteger)index; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /LUNTutorialViewController/NSArray+LUNObjectAtIndex/NSArray+LUNObjectAtIndex.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSArray+LUNObjectAtIndex.m 3 | // LUNTutorialDemo 4 | // 5 | // Created by Vladimir Sharavara on 3/29/16. 6 | // Copyright © 2016 lunapps. All rights reserved. 7 | // 8 | 9 | #import "NSArray+LUNObjectAtIndex.h" 10 | 11 | @implementation NSArray (LUNObjectAtIndex) 12 | 13 | - (id)LUN_objectAtIndex:(NSUInteger)index { 14 | if (index > self.count - 1) { 15 | return nil; 16 | } else { 17 | return self[index]; 18 | } 19 | } 20 | 21 | @end 22 | --------------------------------------------------------------------------------