├── .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 |
--------------------------------------------------------------------------------