├── .gitignore
├── LICENSE
├── OverlayTutorial.xcodeproj
├── project.pbxproj
└── project.xcworkspace
│ └── contents.xcworkspacedata
├── OverlayTutorial.xcworkspace
└── contents.xcworkspacedata
├── OverlayTutorial
├── AppDelegate.swift
├── Assets.xcassets
│ └── AppIcon.appiconset
│ │ └── Contents.json
├── Base.lproj
│ ├── LaunchScreen.storyboard
│ └── Main.storyboard
├── ClassExt.swift
├── Info.plist
├── KJOverlayTutorialViewController.swift
├── KJTutorial.swift
├── Tutorial1ViewController.swift
├── Tutorial2ViewController.swift
├── Tutorial3ViewController.swift
└── TutorialsViewController.swift
├── Podfile
├── Podfile.lock
├── Pods
├── Manifest.lock
├── Pods.xcodeproj
│ └── project.pbxproj
├── SwiftIconFont
│ ├── LICENSE
│ ├── README.md
│ └── SwiftIconFont
│ │ ├── Classes
│ │ ├── Extensions
│ │ │ ├── SwiftIconFont+NSRange.swift
│ │ │ ├── SwiftIconFont+String.swift
│ │ │ ├── SwiftIconFont+UIBarButtonItem.swift
│ │ │ ├── SwiftIconFont+UIButton.swift
│ │ │ ├── SwiftIconFont+UIImage.swift
│ │ │ ├── SwiftIconFont+UIImageView.swift
│ │ │ ├── SwiftIconFont+UILabel.swift
│ │ │ ├── SwiftIconFont+UITabBarItem.swift
│ │ │ ├── SwiftIconFont+UITextField.swift
│ │ │ └── SwiftIconFont+UITextView.swift
│ │ ├── FontLoader.swift
│ │ ├── Fonts
│ │ │ ├── FontAwesome.swift
│ │ │ ├── Iconic.swift
│ │ │ ├── IonIcons.swift
│ │ │ ├── MapIcon.swift
│ │ │ ├── MaterialIcon.swift
│ │ │ ├── Octicon.swift
│ │ │ └── ThemifyIcon.swift
│ │ ├── SwiftIconFont.swift
│ │ └── UI
│ │ │ ├── SwiftIconBarButtonItem.swift
│ │ │ ├── SwiftIconButton.swift
│ │ │ ├── SwiftIconFontView.swift
│ │ │ ├── SwiftIconLabel.swift
│ │ │ ├── SwiftIconStepper.swift
│ │ │ ├── SwiftIconTabBarItem.swift
│ │ │ ├── SwiftIconTextField.swift
│ │ │ └── SwiftIconTextView.swift
│ │ └── Resources
│ │ ├── FontAwesome.ttf
│ │ ├── Ionicons.ttf
│ │ ├── MaterialIcons-Regular.ttf
│ │ ├── map-icons.ttf
│ │ ├── octicons.ttf
│ │ ├── open-iconic.ttf
│ │ └── themify.ttf
├── Target Support Files
│ ├── Pods-OverlayTutorial
│ │ ├── Info.plist
│ │ ├── Pods-OverlayTutorial-acknowledgements.markdown
│ │ ├── Pods-OverlayTutorial-acknowledgements.plist
│ │ ├── Pods-OverlayTutorial-dummy.m
│ │ ├── Pods-OverlayTutorial-frameworks.sh
│ │ ├── Pods-OverlayTutorial-resources.sh
│ │ ├── Pods-OverlayTutorial-umbrella.h
│ │ ├── Pods-OverlayTutorial.debug.xcconfig
│ │ ├── Pods-OverlayTutorial.modulemap
│ │ └── Pods-OverlayTutorial.release.xcconfig
│ ├── SwiftIconFont
│ │ ├── Info.plist
│ │ ├── SwiftIconFont-dummy.m
│ │ ├── SwiftIconFont-prefix.pch
│ │ ├── SwiftIconFont-umbrella.h
│ │ ├── SwiftIconFont.modulemap
│ │ └── SwiftIconFont.xcconfig
│ └── pop
│ │ ├── Info.plist
│ │ ├── pop-dummy.m
│ │ ├── pop-prefix.pch
│ │ ├── pop-umbrella.h
│ │ ├── pop.modulemap
│ │ └── pop.xcconfig
└── pop
│ ├── LICENSE
│ ├── README.md
│ └── pop
│ ├── POP.h
│ ├── POPAction.h
│ ├── POPAnimatableProperty.h
│ ├── POPAnimatableProperty.mm
│ ├── POPAnimatablePropertyTypes.h
│ ├── POPAnimation.h
│ ├── POPAnimation.mm
│ ├── POPAnimationEvent.h
│ ├── POPAnimationEvent.mm
│ ├── POPAnimationEventInternal.h
│ ├── POPAnimationExtras.h
│ ├── POPAnimationExtras.mm
│ ├── POPAnimationInternal.h
│ ├── POPAnimationPrivate.h
│ ├── POPAnimationRuntime.h
│ ├── POPAnimationRuntime.mm
│ ├── POPAnimationTracer.h
│ ├── POPAnimationTracer.mm
│ ├── POPAnimationTracerInternal.h
│ ├── POPAnimator.h
│ ├── POPAnimator.mm
│ ├── POPAnimatorPrivate.h
│ ├── POPBasicAnimation.h
│ ├── POPBasicAnimation.mm
│ ├── POPBasicAnimationInternal.h
│ ├── POPCGUtils.h
│ ├── POPCGUtils.mm
│ ├── POPCustomAnimation.h
│ ├── POPCustomAnimation.mm
│ ├── POPDecayAnimation.h
│ ├── POPDecayAnimation.mm
│ ├── POPDecayAnimationInternal.h
│ ├── POPDefines.h
│ ├── POPGeometry.h
│ ├── POPGeometry.mm
│ ├── POPLayerExtras.h
│ ├── POPLayerExtras.mm
│ ├── POPMath.h
│ ├── POPMath.mm
│ ├── POPPropertyAnimation.h
│ ├── POPPropertyAnimation.mm
│ ├── POPPropertyAnimationInternal.h
│ ├── POPSpringAnimation.h
│ ├── POPSpringAnimation.mm
│ ├── POPSpringAnimationInternal.h
│ ├── POPSpringSolver.h
│ ├── POPVector.h
│ ├── POPVector.mm
│ └── WebCore
│ ├── FloatConversion.h
│ ├── TransformationMatrix.cpp
│ ├── TransformationMatrix.h
│ └── UnitBezier.h
├── README.md
├── Resource
├── ico_hand1@2x.png
├── ico_hand2@2x.png
├── ico_hand@2x.png
└── ico_qr@2x.png
└── Screenshots
├── demo.gif
├── screen1.png
├── screen2.png
└── screen3.png
/.gitignore:
--------------------------------------------------------------------------------
1 | # Xcode
2 | #
3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
4 |
5 | ## Build generated
6 | .DS_Store
7 | build/
8 | DerivedData/
9 |
10 | ## Various settings
11 | *.pbxuser
12 | !default.pbxuser
13 | *.mode1v3
14 | !default.mode1v3
15 | *.mode2v3
16 | !default.mode2v3
17 | *.perspectivev3
18 | !default.perspectivev3
19 | xcuserdata/
20 |
21 | ## Other
22 | *.moved-aside
23 | *.xcuserstate
24 |
25 | ## Obj-C/Swift specific
26 | *.hmap
27 | *.ipa
28 | *.dSYM.zip
29 | *.dSYM
30 |
31 | ## Playgrounds
32 | timeline.xctimeline
33 | playground.xcworkspace
34 |
35 | # Swift Package Manager
36 | #
37 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
38 | # Packages/
39 | .build/
40 |
41 | # CocoaPods
42 | #
43 | # We recommend against adding the Pods directory to your .gitignore. However
44 | # you should judge for yourself, the pros and cons are mentioned at:
45 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
46 | #
47 | # Pods/
48 |
49 | # Carthage
50 | #
51 | # Add this line if you want to avoid checking in source code from Carthage dependencies.
52 | # Carthage/Checkouts
53 | #
54 | # Carthage/Build
55 |
56 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2017 Tran Quan
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 |
--------------------------------------------------------------------------------
/OverlayTutorial.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/OverlayTutorial.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/OverlayTutorial/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // OverlayTutorial
4 | //
5 | // Created by Kenji on 12/5/17.
6 | // Copyright © 2017 DevLander. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @UIApplicationMain
12 | class AppDelegate: UIResponder, UIApplicationDelegate {
13 |
14 | var window: UIWindow?
15 |
16 |
17 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
18 | // Override point for customization after application launch.
19 | return true
20 | }
21 |
22 | func applicationWillResignActive(_ application: UIApplication) {
23 | // 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.
24 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
25 | }
26 |
27 | func applicationDidEnterBackground(_ application: UIApplication) {
28 | // 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.
29 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
30 | }
31 |
32 | func applicationWillEnterForeground(_ application: UIApplication) {
33 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
34 | }
35 |
36 | func applicationDidBecomeActive(_ application: UIApplication) {
37 | // 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.
38 | }
39 |
40 | func applicationWillTerminate(_ application: UIApplication) {
41 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
42 | }
43 |
44 |
45 | }
46 |
47 |
--------------------------------------------------------------------------------
/OverlayTutorial/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "20x20",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "20x20",
11 | "scale" : "3x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "29x29",
16 | "scale" : "2x"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "size" : "29x29",
21 | "scale" : "3x"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "size" : "40x40",
26 | "scale" : "2x"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "size" : "40x40",
31 | "scale" : "3x"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "size" : "60x60",
36 | "scale" : "2x"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "size" : "60x60",
41 | "scale" : "3x"
42 | }
43 | ],
44 | "info" : {
45 | "version" : 1,
46 | "author" : "xcode"
47 | }
48 | }
--------------------------------------------------------------------------------
/OverlayTutorial/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 |
--------------------------------------------------------------------------------
/OverlayTutorial/ClassExt.swift:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright © SaigonMD, Inc - All Rights Reserved
3 | * Licensed under the MIT license.
4 | * Written by Tran Quan , Feb 2018
5 | */
6 |
7 | import UIKit
8 |
9 | extension CGRect {
10 |
11 | var centerPoint: CGPoint {
12 | return CGPoint(x: self.origin.x + self.size.width/2, y: self.origin.y + self.size.height/2)
13 | }
14 |
15 | var topCenterPoint: CGPoint {
16 | return CGPoint(x: self.origin.x + self.size.width/2, y: self.origin.y)
17 | }
18 |
19 | var bottomCenterPoint: CGPoint {
20 | return CGPoint(x: self.origin.x + self.size.width/2, y: self.origin.y + self.size.height)
21 | }
22 |
23 | var leftCenterPoint: CGPoint {
24 | return CGPoint(x: self.origin.x, y: self.origin.y + self.size.height/2)
25 | }
26 |
27 | var rightCenterPoint: CGPoint {
28 | return CGPoint(x: self.origin.x + self.size.width, y: self.origin.y + self.size.height/2)
29 | }
30 |
31 | }
32 |
33 | extension CGPoint {
34 |
35 | func moveX(_ d: CGFloat) -> CGPoint {
36 | return CGPoint(x: self.x + d, y: self.y)
37 | }
38 |
39 | func moveY(_ d: CGFloat) -> CGPoint {
40 | return CGPoint(x: self.x, y: self.y + d)
41 | }
42 |
43 | static func distanceOf(p1: CGPoint, p2: CGPoint) -> Double {
44 | let length = sqrt(Double((p1.x - p2.x)*(p1.x - p2.x) + (p1.y - p2.y)*(p1.y - p2.y)))
45 | return length
46 | }
47 |
48 | static func createVector(from: CGPoint, to: CGPoint, isUnit: Bool = false) -> CGPoint {
49 | let vector = CGPoint(x: to.x - from.x, y: to.y - from.y)
50 | return isUnit ? CGPoint.createUnitVectorWith(vector: vector) : vector
51 | }
52 |
53 | static func createUnitVectorWith(vector: CGPoint) -> CGPoint {
54 | var division = max(fabs(vector.x), fabs(vector.y))
55 | if division == 0 { division = 1 }
56 | division = CGFloat(fabs(division))
57 | return CGPoint(x: vector.x/division, y: vector.y/division)
58 | }
59 |
60 | static func createReverseVectorWith(vector: CGPoint) -> CGPoint {
61 | return CGPoint(x: -vector.x, y: -vector.y)
62 | }
63 |
64 | static func createPerpendicularVectorWith(vector: CGPoint) -> CGPoint {
65 | return CGPoint(x: -vector.y, y: vector.x)
66 | }
67 | }
68 |
69 | extension UIFont {
70 |
71 | func sizeOf(string: String, constrainedToWidth width: CGFloat) -> CGSize {
72 | return NSString(string: string).boundingRect(with: CGSize(width: width, height: 9999_9999), options: .usesLineFragmentOrigin, attributes: [NSAttributedStringKey.font : self], context: nil).size
73 | }
74 |
75 | }
76 |
--------------------------------------------------------------------------------
/OverlayTutorial/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | APPL
17 | CFBundleShortVersionString
18 | 2.0.0
19 | CFBundleVersion
20 | 1
21 | LSRequiresIPhoneOS
22 |
23 | UILaunchStoryboardName
24 | LaunchScreen
25 | UIMainStoryboardFile
26 | Main
27 | UIRequiredDeviceCapabilities
28 |
29 | armv7
30 |
31 | UISupportedInterfaceOrientations
32 |
33 | UIInterfaceOrientationPortrait
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/OverlayTutorial/KJTutorial.swift:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright © SaigonMD, Inc - All Rights Reserved
3 | * Licensed under the MIT license.
4 | * Written by Tran Quan , Feb 2018
5 | */
6 |
7 |
8 | import UIKit
9 |
10 | struct KJTutorial {
11 |
12 | enum KJTutorialPosition {
13 | case top
14 | case bottom
15 | }
16 |
17 | // MARK: - Configs
18 |
19 | static var leftPadding: CGFloat = 20
20 | static var rightPadding: CGFloat = 20
21 | static var topPadding: CGFloat = 64
22 | static var bottomPadding: CGFloat = 64
23 |
24 | // MARK: - Props
25 |
26 | var focusRectangle: CGRect
27 | var focusRectangleCornerRadius: CGFloat
28 | var message: NSAttributedString
29 | var messagePosition: CGPoint
30 | var icon: UIImage? = nil
31 | var iconFrame: CGRect = CGRect.zero
32 | var isArrowHidden: Bool = false
33 |
34 | // MARK: - Helpers
35 |
36 | static func getMessageFrameAt(position: KJTutorialPosition, message: String, font: UIFont) -> CGRect {
37 |
38 | let screenBounds = UIScreen.main.bounds
39 |
40 | let size = font.sizeOf(string: message, constrainedToWidth: screenBounds.size.width - leftPadding - rightPadding)
41 |
42 | let x = CGFloat(max(leftPadding, (screenBounds.size.width-size.width)/2.0))
43 |
44 | var y = screenBounds.size.width/2.0
45 | switch position {
46 | case .top:
47 | y = topPadding
48 | case .bottom:
49 | y = screenBounds.size.height - size.height - bottomPadding
50 | }
51 |
52 | return CGRect(x: x, y: y, width: size.width, height: size.height)
53 | }
54 |
55 | static func textTutorial(focusRectangle: CGRect, text: String, textPosition: CGPoint) -> KJTutorial {
56 | let attrs = [NSAttributedStringKey.font : UIFont.systemFont(ofSize: 18),
57 | NSAttributedStringKey.foregroundColor : UIColor.white]
58 | let message = NSAttributedString(string: text, attributes: attrs)
59 | let tutorial = KJTutorial(focusRectangle: focusRectangle, focusRectangleCornerRadius: 4.0, message: message, messagePosition: textPosition, icon: nil, iconFrame: .zero, isArrowHidden: false)
60 | return tutorial
61 | }
62 |
63 | static func textWithIconTutorial(focusRectangle: CGRect, text: String, textPosition: CGPoint, icon: UIImage, iconFrame: CGRect) -> KJTutorial {
64 | let attrs = [NSAttributedStringKey.font : UIFont.systemFont(ofSize: 18),
65 | NSAttributedStringKey.foregroundColor : UIColor.white]
66 | let message = NSAttributedString(string: text, attributes: attrs)
67 | let tutorial = KJTutorial(focusRectangle: focusRectangle, focusRectangleCornerRadius: 4.0, message: message, messagePosition: textPosition, icon: icon, iconFrame: iconFrame, isArrowHidden: true)
68 | return tutorial
69 | }
70 |
71 | }
72 |
--------------------------------------------------------------------------------
/OverlayTutorial/Tutorial1ViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Tutorial1ViewController.swift
3 | // OverlayTutorial
4 | //
5 | // Created by Kenji on 6/6/17.
6 | // Copyright © 2017 DevLander. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import SwiftIconFont
11 |
12 |
13 | class Tutorial1ViewController: UIViewController {
14 |
15 | @IBOutlet weak var tvTut: UITextView!
16 |
17 | lazy var tutorialVC: KJOverlayTutorialViewController = {
18 | return KJOverlayTutorialViewController()
19 | }()
20 |
21 | override func viewDidLoad() {
22 | super.viewDidLoad()
23 | }
24 |
25 | override func viewDidAppear(_ animated: Bool) {
26 | super.viewDidAppear(animated)
27 |
28 | DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
29 | self.showTutorial()
30 | }
31 | }
32 |
33 | override func didReceiveMemoryWarning() {
34 | super.didReceiveMemoryWarning()
35 | }
36 |
37 | func showTutorial() {
38 |
39 | // tut1
40 | let focusRect1 = self.tvTut.frame
41 | let icon1 = UIImage(from: .FontAwesome, code: "handoup", textColor: .white, backgroundColor: .clear, size: CGSize(width: 72, height: 72))
42 | let icon1Frame = CGRect(x: self.view.bounds.width/2-72/2, y: focusRect1.maxY + 12, width: 72, height: 72)
43 | let message1 = "Hello, this is tutorial 1"
44 | let message1Center = CGPoint(x: self.view.bounds.width/2, y: icon1Frame.maxY + 24)
45 | let tut1 = KJTutorial.textWithIconTutorial(focusRectangle: focusRect1, text: message1, textPosition: message1Center, icon: icon1, iconFrame: icon1Frame)
46 |
47 | // tuts
48 | let tutorials = [tut1]
49 | self.tutorialVC.tutorials = tutorials
50 | self.tutorialVC.showInViewController(self)
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/OverlayTutorial/Tutorial2ViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Tutorial2ViewController.swift
3 | // OverlayTutorial
4 | //
5 | // Created by Kenji on 6/6/17.
6 | // Copyright © 2017 DevLander. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import SwiftIconFont
11 |
12 |
13 | class Tutorial2ViewController: UIViewController {
14 |
15 | @IBOutlet weak var imvTut: UIImageView!
16 |
17 | lazy var tutorialVC: KJOverlayTutorialViewController = {
18 | return KJOverlayTutorialViewController()
19 | }()
20 |
21 | override func viewDidLoad() {
22 | super.viewDidLoad()
23 |
24 | // Do any additional setup after loading the view.
25 | }
26 |
27 | override func viewDidAppear(_ animated: Bool) {
28 | super.viewDidAppear(animated)
29 |
30 | DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
31 | self.showTutorial()
32 | }
33 | }
34 |
35 | override func didReceiveMemoryWarning() {
36 | super.didReceiveMemoryWarning()
37 | // Dispose of any resources that can be recreated.
38 | }
39 |
40 | func showTutorial() {
41 |
42 | // tut1
43 | let focusRect1 = self.imvTut.frame
44 | let icon1Frame = CGRect(x: self.view.bounds.width/2-72/2, y: focusRect1.maxY + 12, width: 72, height: 72)
45 | let message1 = "This is your QRCode. Please show this to the waiter to get discount"
46 | let message1Center = CGPoint(x: self.view.bounds.width/2, y: icon1Frame.maxY + 24)
47 | var tut1 = KJTutorial.textTutorial(focusRectangle: focusRect1, text: message1, textPosition: message1Center)
48 | tut1.isArrowHidden = false
49 |
50 | // tuts
51 | let tutorials = [tut1]
52 | self.tutorialVC.tutorials = tutorials
53 | self.tutorialVC.showInViewController(self)
54 | }
55 |
56 | }
57 |
--------------------------------------------------------------------------------
/OverlayTutorial/Tutorial3ViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Tutorial3ViewController.swift
3 | // OverlayTutorial
4 | //
5 | // Created by Kenji on 6/6/17.
6 | // Copyright © 2017 DevLander. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import SwiftIconFont
11 |
12 |
13 | class Tutorial3ViewController: UIViewController {
14 |
15 | @IBOutlet weak var imvTut: UIImageView!
16 | @IBOutlet weak var btnTut1: UIButton!
17 | @IBOutlet weak var btnTut2: UIButton!
18 | @IBOutlet weak var btnTut3: UIButton!
19 |
20 | lazy var tutorialVC: KJOverlayTutorialViewController = {
21 | return KJOverlayTutorialViewController()
22 | }()
23 |
24 | override func viewDidLoad() {
25 | super.viewDidLoad()
26 |
27 | // Do any additional setup after loading the view.
28 | }
29 |
30 | override func viewDidAppear(_ animated: Bool) {
31 | super.viewDidAppear(animated)
32 |
33 | DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
34 | self.showTutorial()
35 | }
36 | }
37 |
38 | override func didReceiveMemoryWarning() {
39 | super.didReceiveMemoryWarning()
40 | // Dispose of any resources that can be recreated.
41 | }
42 |
43 | func showTutorial() {
44 |
45 | // tut1
46 | let focusRect1 = self.imvTut.frame
47 | let message1 = "Hello, this is your avatar"
48 | let message1Center = CGPoint(x: self.view.bounds.width/2, y: focusRect1.maxY + 24)
49 | var tut1 = KJTutorial.textTutorial(focusRectangle: focusRect1, text: message1, textPosition: message1Center)
50 | tut1.isArrowHidden = true
51 |
52 | // tut2
53 | let focusRect2 = self.btnTut1.frame
54 | let icon2 = UIImage(from: .FontAwesome, code: "handoup", textColor: .white, backgroundColor: .clear, size: CGSize(width: 72, height: 72))
55 | let icon2Frame = CGRect(x: self.view.bounds.width/2-72/2, y: focusRect2.maxY + 12, width: 72, height: 72)
56 | let message2 = "Tap to update your profile"
57 | let message2Center = CGPoint(x: self.view.bounds.width/2, y: icon2Frame.maxY + 24)
58 | let tut2 = KJTutorial.textWithIconTutorial(focusRectangle: focusRect2, text: message2, textPosition: message2Center, icon: icon2, iconFrame: icon2Frame)
59 |
60 | // tut3
61 | let focusRect3 = self.btnTut2.frame
62 | let icon3 = UIImage(from: .FontAwesome, code: "handoup", textColor: .white, backgroundColor: .clear, size: CGSize(width: 72, height: 72))
63 | let icon3Frame = CGRect(x: self.view.bounds.width/2-72/2, y: focusRect3.maxY + 12, width: 72, height: 72)
64 | let message3 = "Tap to update your payments"
65 | let message3Center = CGPoint(x: self.view.bounds.width/2, y: icon3Frame.maxY + 24)
66 | let tut3 = KJTutorial.textWithIconTutorial(focusRectangle: focusRect3, text: message3, textPosition: message3Center, icon: icon3, iconFrame: icon3Frame)
67 |
68 | // tut4
69 | let focusRect4 = self.btnTut3.frame
70 | let icon4 = UIImage(from: .FontAwesome, code: "handoup", textColor: .white, backgroundColor: .clear, size: CGSize(width: 72, height: 72))
71 | let icon4Frame = CGRect(x: self.view.bounds.width/2-72/2, y: focusRect4.maxY + 12, width: 72, height: 72)
72 | let message4 = "Tap to edit your settings"
73 | let message4Center = CGPoint(x: self.view.bounds.width/2, y: icon4Frame.maxY + 24)
74 | let tut4 = KJTutorial.textWithIconTutorial(focusRectangle: focusRect4, text: message4, textPosition: message4Center, icon: icon4, iconFrame: icon4Frame)
75 |
76 | // tuts
77 | let tutorials = [tut1, tut2, tut3, tut4]
78 | self.tutorialVC.tutorials = tutorials
79 | self.tutorialVC.showInViewController(self)
80 | }
81 | }
82 |
--------------------------------------------------------------------------------
/OverlayTutorial/TutorialsViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TutorialExample.swift
3 | // OverlayTutorial
4 | //
5 | // Created by Kenji on 6/6/17.
6 | // Copyright © 2017 DevLander. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | class TutorialsViewController: UIViewController {
12 |
13 | @IBOutlet weak var tableView: UITableView!
14 |
15 | override func viewDidLoad() {
16 | super.viewDidLoad()
17 | }
18 |
19 | override func didReceiveMemoryWarning() {
20 | super.didReceiveMemoryWarning()
21 | }
22 |
23 | }
24 |
25 | // MARK: - UITableView DataSource
26 |
27 | extension TutorialsViewController: UITableViewDataSource {
28 |
29 | func numberOfSections(in tableView: UITableView) -> Int {
30 | return 1
31 | }
32 |
33 | func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
34 | return 3
35 | }
36 |
37 | func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
38 | let cell = tableView.dequeueReusableCell(withIdentifier: "TutorialCell", for: indexPath)
39 |
40 | if let titleLabel = cell.viewWithTag(1) as? UILabel {
41 | switch indexPath.row {
42 | case 0:
43 | titleLabel.text = "Text + Arrow Tutorial"
44 | case 1:
45 | titleLabel.text = "Text + Icon Tutorial"
46 | case 2:
47 | titleLabel.text = "Multiple Tutorial"
48 | default:
49 | break
50 | }
51 | }
52 |
53 | return cell
54 | }
55 |
56 | }
57 |
58 | // MARK: - UITableView Delegate
59 |
60 | extension TutorialsViewController: UITableViewDelegate {
61 |
62 | func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
63 | return 44
64 | }
65 |
66 | func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
67 | tableView.deselectRow(at: indexPath, animated: true)
68 |
69 | switch indexPath.row {
70 | case 0:
71 | self.performSegue(withIdentifier: "showTut1", sender: nil)
72 | case 1:
73 | self.performSegue(withIdentifier: "showTut2", sender: nil)
74 | case 2:
75 | self.performSegue(withIdentifier: "showTut3", sender: nil)
76 | default:
77 | break
78 | }
79 | }
80 | }
81 |
--------------------------------------------------------------------------------
/Podfile:
--------------------------------------------------------------------------------
1 | # Uncomment the next line to define a global platform for your project
2 | platform :ios, '9.0'
3 |
4 | target 'OverlayTutorial' do
5 | # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
6 | use_frameworks!
7 |
8 | # Pods for OverlayTutorial
9 | pod 'pop', '~> 1.0'
10 | pod 'SwiftIconFont', '~> 2.7.3'
11 |
12 | end
13 |
--------------------------------------------------------------------------------
/Podfile.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - pop (1.0.10)
3 | - SwiftIconFont (2.7.3)
4 |
5 | DEPENDENCIES:
6 | - pop (~> 1.0)
7 | - SwiftIconFont (~> 2.7.3)
8 |
9 | SPEC CHECKSUMS:
10 | pop: 82ca6b068ce9278fd350fd9dd09482a0ce9492e6
11 | SwiftIconFont: ebd8ee931a1e7072b61a87aec53f3a0786ef7f2b
12 |
13 | PODFILE CHECKSUM: 8baf72b81ca292413ee79147caa34ff533ba01f9
14 |
15 | COCOAPODS: 1.3.1
16 |
--------------------------------------------------------------------------------
/Pods/Manifest.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - pop (1.0.10)
3 | - SwiftIconFont (2.7.3)
4 |
5 | DEPENDENCIES:
6 | - pop (~> 1.0)
7 | - SwiftIconFont (~> 2.7.3)
8 |
9 | SPEC CHECKSUMS:
10 | pop: 82ca6b068ce9278fd350fd9dd09482a0ce9492e6
11 | SwiftIconFont: ebd8ee931a1e7072b61a87aec53f3a0786ef7f2b
12 |
13 | PODFILE CHECKSUM: 8baf72b81ca292413ee79147caa34ff533ba01f9
14 |
15 | COCOAPODS: 1.3.1
16 |
--------------------------------------------------------------------------------
/Pods/SwiftIconFont/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright (c) 2016 Sedat Gokbek CIFTCI
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining a copy
4 | of this software and associated documentation files (the "Software"), to deal
5 | in the Software without restriction, including without limitation the rights
6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 | copies of the Software, and to permit persons to whom the Software is
8 | furnished to do so, subject to the following conditions:
9 |
10 | The above copyright notice and this permission notice shall be included in
11 | all copies or substantial portions of the Software.
12 |
13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19 | THE SOFTWARE.
20 |
--------------------------------------------------------------------------------
/Pods/SwiftIconFont/README.md:
--------------------------------------------------------------------------------
1 | 
2 |
3 | [](https://travis-ci.org/0x73/SwiftIconFont)
4 | [](http://cocoapods.org/pods/SwiftIconFont)
5 | [](http://cocoapods.org/pods/SwiftIconFont)
6 | [](http://cocoapods.org/pods/SwiftIconFont)
7 | [](https://github.com/Carthage/Carthage)
8 |
9 | ## Installation
10 |
11 | ### Carthage
12 |
13 | [Carthage](https://github.com/Carthage/Carthage) is a decentralized dependency manager that automates the process of adding frameworks to your Cocoa application.
14 |
15 | You can install Carthage with [Homebrew](http://brew.sh/) using the following command:
16 |
17 | ```bash
18 | $ brew update
19 | $ brew install carthage
20 | ```
21 |
22 | To integrate SwiftIconFont into your Xcode project using Carthage, specify it in your `Cartfile`:
23 |
24 | ```ogdl
25 | github "0x73/SwiftIconFont"
26 | ```
27 |
28 | ### Cocoapods
29 |
30 | [CocoaPods](http://cocoapods.org) is a dependency manager for Cocoa projects.
31 |
32 | You can install it with the following command:
33 |
34 | ```bash
35 | $ gem install cocoapods
36 | ```
37 |
38 | To integrate SwiftIconFont into your Xcode project using CocoaPods, specify it in your `Podfile`:
39 |
40 | ```ruby
41 | use_frameworks!
42 |
43 | pod 'SwiftIconFont'
44 | ```
45 |
46 | ## Example
47 |
48 | To run the example project, clone the repo, and run `pod install` from the Example directory first.
49 |
50 | ## Prefixes
51 |
52 | | Font | Prefix | Cheat Sheet |
53 | |--------------|--------|-------------------------------------------|
54 | | Font Awesome | fa: | [List](http://fontawesome.io/icons/) |
55 | | Ion Icons | io: | [List](http://ionicons.com) |
56 | | Octicons | oc: | [List](https://octicons.github.com) |
57 | | Open Iconic | ic: | [List](https://useiconic.com/open/) |
58 | | Material Icon | ma: | [List](https://design.google.com/icons/) |
59 | | Themify | ti: | [List](https://themify.me/themify-icons) |
60 | | Map Icons | mi: | [List](http://map-icons.com) |
61 |
62 | ## Fonts
63 | ````swift
64 | public enum Fonts: String {
65 | case FontAwesome = "FontAwesome"
66 | case Iconic = "open-iconic"
67 | case Ionicon = "Ionicons"
68 | case Octicon = "octicons"
69 | case Themify = "themify"
70 | case MapIcon = "map-icons"
71 | case MaterialIcon = "MaterialIcons-Regular"
72 | }
73 | ````
74 |
75 | ## Runtime Structure
76 | > < Prefix >:< Icon >
77 |
78 |
79 | ## Usage
80 |
81 | In your UILabel, UIButton or UITextField, set a text containing a placeholder anywhere you want the icon to be. Somethink like this
82 |
83 | > oc:logo-github
84 |
85 |
86 | Then you can choose between 3 ways you can use SwiftIconFont.
87 |
88 | #### 1. Without Custom Class
89 |
90 | Simply import SwiftIconFont and call processIcons on any UILabel, UIButton or UITextField that has a placeholder.
91 |
92 | ```swift
93 | label.parseIcon()
94 | ```
95 |
96 | #### 2. Custom Class
97 |
98 | The lazy way, just set your UILabel, UITextField, UIButton, UITextView, UIBarButtonItem class as SwiftIconLabel, SwiftIconTextField, SwiftIconButton, SwiftIconTextView, SwiftBarButtonItem, and thats it, your icons will be processed at runtime.
99 |
100 |
101 | #### 3. Programmatically
102 |
103 | ````swift
104 | import SwiftIconFont
105 |
106 | label.font = UIFont.icon(from: .FontAwesome, ofSize: 50.0)
107 | label.text = String.fontAwesomeIcon(code: "twitter")
108 | ````
109 |
110 |
111 | #### UIBarButtonItem (Without Custom Class)
112 |
113 | ````swift
114 | import SwiftIconFont
115 |
116 | twitterBarButton.icon(from: .FontAwesome, code: "twitter", ofSize: 20)
117 | ````
118 |
119 | #### UITabBarItem (Without Custom Class)
120 |
121 | ````swift
122 | import SwiftIconFont
123 |
124 | twitterTabBarButton.icon(from: .FontAwesome, code: "twitter", imageSize: CGSizeMake(20, 20), ofSize: 20)
125 | ````
126 |
127 | #### UIImage
128 |
129 | ````swift
130 | import SwiftIconFont
131 |
132 | let githubLogo = UIImage(from: .Octicon, code: "logo-github", textColor: .black, backgroundColor: .clear, size: CGSize(width: 150, height: 50))
133 | ````
134 |
135 | #### UIImageView
136 |
137 | ````swift
138 | import SwiftIconFont
139 |
140 | let githubLogoImageView: UIImageView = UIImageView(frame: CGRect(x: 120, y: self.view.frame.size.height - 130, width: 150, height: 50))
141 | githubLogoImageView.setIcon(from: .Octicon, code: "logo-github", textColor: .black, backgroundColor: .clear, size: nil)
142 | ````
143 |
144 | ## Author
145 |
146 | * Sedat Gokbek CIFTCI, me@sedat.ninja
147 | * Jose Quintero, [@josejuanqm](https://github.com/josejuanqm)
148 |
149 | ## License
150 |
151 | SwiftIconFont is available under the MIT license. See the LICENSE file for more info.
152 |
153 |
154 | ## Contributing
155 |
156 | 1. Fork it (http://github.com/0x73/SwiftIconFont/fork)
157 | 2. Create your feature branch (`git checkout -b my-new-feature`)
158 | 3. Commit your changes (`git commit -am 'Add some feature'`)
159 | 4. Push to the branch (`git push origin my-new-feature`)
160 | 5. Create new Pull Request
161 |
--------------------------------------------------------------------------------
/Pods/SwiftIconFont/SwiftIconFont/Classes/Extensions/SwiftIconFont+NSRange.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SwiftIconFont+NSRange.swift
3 | // SwiftIconFont
4 | //
5 | // Created by Sedat Gökbek ÇİFTÇİ on 13.10.2017.
6 | // Copyright © 2017 Sedat Gökbek ÇİFTÇİ. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | extension NSRange {
12 | func range(for str: String) -> Range? {
13 | guard location != NSNotFound else { return nil }
14 |
15 | guard let fromUTFIndex = str.utf16.index(str.utf16.startIndex, offsetBy: location, limitedBy: str.utf16.endIndex) else { return nil }
16 | guard let toUTFIndex = str.utf16.index(fromUTFIndex, offsetBy: length, limitedBy: str.utf16.endIndex) else { return nil }
17 | guard let fromIndex = String.Index(fromUTFIndex, within: str) else { return nil }
18 | guard let toIndex = String.Index(toUTFIndex, within: str) else { return nil }
19 |
20 | return fromIndex ..< toIndex
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/Pods/SwiftIconFont/SwiftIconFont/Classes/Extensions/SwiftIconFont+String.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SwiftIconFont+String.swift
3 | // SwiftIconFont
4 | //
5 | // Created by Sedat Gökbek ÇİFTÇİ on 13.10.2017.
6 | // Copyright © 2017 Sedat Gökbek ÇİFTÇİ. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public extension String {
12 | public static func getIcon(from font: Fonts, code: String) -> String? {
13 | switch font {
14 | case .FontAwesome:
15 | return fontAwesomeIcon(code)
16 | case .Iconic:
17 | return fontIconicIcon(code)
18 | case .Ionicon:
19 | return fontIonIcon(code)
20 | case .MapIcon:
21 | return fontMapIcon(code)
22 | case .MaterialIcon:
23 | return fontMaterialIcon(code)
24 | case .Octicon:
25 | return fontOcticon(code)
26 | case .Themify:
27 | return fontThemifyIcon(code)
28 | }
29 | }
30 |
31 | public static func fontAwesomeIcon(_ code: String) -> String? {
32 | if let icon = fontAwesomeIconArr[code] {
33 | return icon
34 | }
35 | return nil
36 | }
37 |
38 | public static func fontOcticon(_ code: String) -> String? {
39 | if let icon = octiconArr[code] {
40 | return icon
41 | }
42 | return nil
43 | }
44 |
45 | public static func fontIonIcon(_ code: String) -> String? {
46 | if let icon = ioniconArr[code] {
47 | return icon
48 | }
49 | return nil
50 | }
51 |
52 | public static func fontIconicIcon(_ code: String) -> String? {
53 | if let icon = iconicIconArr[code] {
54 | return icon
55 | }
56 | return nil
57 | }
58 |
59 |
60 | public static func fontThemifyIcon(_ code: String) -> String? {
61 | if let icon = temifyIconArr[code] {
62 | return icon
63 | }
64 | return nil
65 | }
66 |
67 | public static func fontMapIcon(_ code: String) -> String? {
68 | if let icon = mapIconArr[code] {
69 | return icon
70 | }
71 | return nil
72 | }
73 |
74 | public static func fontMaterialIcon(_ code: String) -> String? {
75 | if let icon = materialIconArr[code] {
76 | return icon
77 | }
78 | return nil
79 | }
80 | }
81 |
--------------------------------------------------------------------------------
/Pods/SwiftIconFont/SwiftIconFont/Classes/Extensions/SwiftIconFont+UIBarButtonItem.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SwiftIconFont+UIBarButtonItem.swift
3 | // SwiftIconFont
4 | //
5 | // Created by Sedat Gökbek ÇİFTÇİ on 13.10.2017.
6 | // Copyright © 2017 Sedat Gökbek ÇİFTÇİ. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | public extension UIBarButtonItem {
12 | func icon(from font: Fonts, code: String, ofSize size: CGFloat){
13 | var textAttributes: [NSAttributedStringKey: AnyObject] = [NSAttributedStringKey.font: UIFont.icon(from: font, ofSize: size)]
14 | let currentTextAttributes: [String: AnyObject]? = self.titleTextAttributes(for: UIControlState()) as [String : AnyObject]?
15 |
16 | if currentTextAttributes != nil {
17 | for (rawKey, value) in currentTextAttributes! {
18 | let key = NSAttributedStringKey.init(rawKey)
19 | if key != NSAttributedStringKey.font {
20 | textAttributes[key] = value
21 | }
22 | }
23 | }
24 | self.setTitleTextAttributes(textAttributes, for: UIControlState.normal)
25 | self.setTitleTextAttributes(textAttributes, for: UIControlState.highlighted)
26 |
27 | self.title = String.getIcon(from: font, code: code)
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/Pods/SwiftIconFont/SwiftIconFont/Classes/Extensions/SwiftIconFont+UIButton.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SwiftIconFont+UIButton.swift
3 | // SwiftIconFont
4 | //
5 | // Created by Sedat Gökbek ÇİFTÇİ on 13.10.2017.
6 | // Copyright © 2017 Sedat Gökbek ÇİFTÇİ. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | public extension UIButton {
12 | func parseIcon() {
13 | guard let currentTitle = self.titleLabel?.text as NSString? else { return }
14 | let text = replace(withText: currentTitle)
15 | let attrTitle = getAttributedString(text, ofSize: (self.titleLabel?.font!.pointSize)!)
16 | let all = NSRange(location: 0, length: attrTitle.length)
17 | attrTitle.addAttribute(NSAttributedStringKey.foregroundColor, value: self.currentTitleColor, range: all)
18 | self.setAttributedTitle(attrTitle, for: UIControlState())
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Pods/SwiftIconFont/SwiftIconFont/Classes/Extensions/SwiftIconFont+UIImage.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SwiftIconFont+UIImage.swift
3 | // SwiftIconFont
4 | //
5 | // Created by Sedat Gökbek ÇİFTÇİ on 13.10.2017.
6 | // Copyright © 2017 Sedat Gökbek ÇİFTÇİ. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | public extension UIImage
12 | {
13 | public convenience init(from font: Fonts, code: String, textColor: UIColor = .black, backgroundColor: UIColor = .clear, size: CGSize) {
14 | let drawText = String.getIcon(from: font, code: code)
15 | let paragraphStyle = NSMutableParagraphStyle()
16 | paragraphStyle.alignment = NSTextAlignment.center
17 |
18 | let fontSize = min(size.width / 1.28571429, size.height)
19 | let attributes = [NSAttributedStringKey.font: UIFont.icon(from: font, ofSize: fontSize), NSAttributedStringKey.foregroundColor: textColor, NSAttributedStringKey.backgroundColor: backgroundColor, NSAttributedStringKey.paragraphStyle: paragraphStyle]
20 |
21 | let attributedString = NSAttributedString(string: drawText!, attributes: attributes)
22 | UIGraphicsBeginImageContextWithOptions(size, false , 0.0)
23 | attributedString.draw(in: CGRect(x: 0, y: (size.height - fontSize) * 0.5, width: size.width, height: fontSize))
24 | let image = UIGraphicsGetImageFromCurrentImageContext()
25 | UIGraphicsEndImageContext()
26 |
27 | if let image = image {
28 | self.init(cgImage: image.cgImage!, scale: image.scale, orientation: image.imageOrientation)
29 | } else {
30 | self.init()
31 | }
32 |
33 | }
34 |
35 | public static func icon(from font: Fonts, iconColor: UIColor, code: String, imageSize: CGSize, ofSize size: CGFloat) -> UIImage
36 | {
37 | let drawText = String.getIcon(from: font, code: code)
38 |
39 | UIGraphicsBeginImageContextWithOptions(imageSize, false, 0)
40 | let paragraphStyle = NSMutableParagraphStyle()
41 | paragraphStyle.alignment = NSTextAlignment.center
42 |
43 | drawText!.draw(in: CGRect(x:0, y:0, width:imageSize.width, height:imageSize.height), withAttributes: [NSAttributedStringKey.font : UIFont.icon(from: font, ofSize: size), NSAttributedStringKey.paragraphStyle: paragraphStyle, NSAttributedStringKey.foregroundColor: iconColor])
44 |
45 | let image = UIGraphicsGetImageFromCurrentImageContext()
46 | UIGraphicsEndImageContext()
47 |
48 | return image!
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/Pods/SwiftIconFont/SwiftIconFont/Classes/Extensions/SwiftIconFont+UIImageView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SwiftIconFont+UIImageView.swift
3 | // SwiftIconFont
4 | //
5 | // Created by Sedat Gökbek ÇİFTÇİ on 13.10.2017.
6 | // Copyright © 2017 Sedat Gökbek ÇİFTÇİ. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | public extension UIImageView {
12 | public func setIcon(from font: Fonts, code: String, textColor: UIColor = .black, backgroundColor: UIColor = .clear, size: CGSize? = nil) {
13 | self.image = UIImage(from: font, code: code, textColor: textColor, backgroundColor: backgroundColor, size: size ?? frame.size)
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Pods/SwiftIconFont/SwiftIconFont/Classes/Extensions/SwiftIconFont+UILabel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SwiftIconFont+UILabel.swift
3 | // SwiftIconFont
4 | //
5 | // Created by Sedat Gökbek ÇİFTÇİ on 13.10.2017.
6 | // Copyright © 2017 Sedat Gökbek ÇİFTÇİ. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | public extension UILabel {
12 | func parseIcon() {
13 | let text = SwiftIconFont.replace(withText: (self.text! as NSString))
14 | self.attributedText = getAttributedString(text, ofSize: self.font!.pointSize)
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Pods/SwiftIconFont/SwiftIconFont/Classes/Extensions/SwiftIconFont+UITabBarItem.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SwiftIconFont+UITabBarItem.swift
3 | // SwiftIconFont
4 | //
5 | // Created by Sedat Gökbek ÇİFTÇİ on 13.10.2017.
6 | // Copyright © 2017 Sedat Gökbek ÇİFTÇİ. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | public extension UITabBarItem {
12 |
13 | func iconWithSwiftIcon(defaultIcon: SwiftIcon) {
14 | self.image = UIImage.icon(from: defaultIcon.font, iconColor: defaultIcon.color, code: defaultIcon.code, imageSize: defaultIcon.imageSize, ofSize: defaultIcon.fontSize)
15 | }
16 |
17 | func icon(from font: Fonts, code: String, iconColor: UIColor, imageSize: CGSize, ofSize size: CGFloat) {
18 | self.image = UIImage.icon(from: font, iconColor: iconColor, code: code, imageSize: imageSize, ofSize: size)
19 | }
20 |
21 | func iconWithSelectedIcon(from defaultIcon: SwiftIcon, selectedIcon: SwiftIcon) {
22 | self.image = UIImage.icon(from: defaultIcon.font, iconColor: defaultIcon.color, code: defaultIcon.code, imageSize: defaultIcon.imageSize, ofSize: defaultIcon.fontSize)
23 | self.selectedImage = UIImage.icon(from: selectedIcon.font, iconColor: selectedIcon.color, code: selectedIcon.code, imageSize: selectedIcon.imageSize, ofSize: selectedIcon.fontSize)
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/Pods/SwiftIconFont/SwiftIconFont/Classes/Extensions/SwiftIconFont+UITextField.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SwiftIconFont+UITextField.swift
3 | // SwiftIconFont
4 | //
5 | // Created by Sedat Gökbek ÇİFTÇİ on 13.10.2017.
6 | // Copyright © 2017 Sedat Gökbek ÇİFTÇİ. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | public extension UITextField {
12 | func parseIcon() {
13 | let text = SwiftIconFont.replace(withText: (self.text! as NSString))
14 | self.attributedText = getAttributedString(text, ofSize: self.font!.pointSize)
15 | }
16 |
17 | func parseIconForRuntime() {
18 | let text = SwiftIconFont.replace(withText: (self.text! as NSString))
19 | self.attributedText = getAttributedStringForRuntimeReplace(text, ofSize: self.font!.pointSize)
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Pods/SwiftIconFont/SwiftIconFont/Classes/Extensions/SwiftIconFont+UITextView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SwiftIconFont+UITextView.swift
3 | // SwiftIconFont
4 | //
5 | // Created by Sedat Gökbek ÇİFTÇİ on 13.10.2017.
6 | // Copyright © 2017 Sedat Gökbek ÇİFTÇİ. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | public extension UITextView {
12 | func parseIcon() {
13 | let text = SwiftIconFont.replace(withText: "")
14 | self.attributedText = getAttributedString(text, ofSize: self.font!.pointSize)
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Pods/SwiftIconFont/SwiftIconFont/Classes/FontLoader.swift:
--------------------------------------------------------------------------------
1 | //
2 | // FontLoader.swift
3 | // SwiftIconFont
4 | //
5 | // Created by Sedat Ciftci on 18/03/16.
6 | // Copyright © 2016 Sedat Gokbek Ciftci. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import Foundation
11 | import CoreText
12 |
13 | class FontLoader: NSObject {
14 | class func loadFont(_ fontName: String) {
15 | let bundle = Bundle(for: FontLoader.self)
16 | let paths = bundle.paths(forResourcesOfType: "ttf", inDirectory: nil)
17 | var fontURL = URL(string: "")
18 | var error: Unmanaged?
19 |
20 | paths.forEach {
21 | guard let filename = NSURL(fileURLWithPath: $0).lastPathComponent,
22 | filename.lowercased().range(of: fontName.lowercased()) != nil else {
23 | return
24 | }
25 |
26 | fontURL = NSURL(fileURLWithPath: $0) as URL
27 | }
28 |
29 | guard let unwrappedFontURL = fontURL,
30 | let data = try? Data(contentsOf: unwrappedFontURL),
31 | let provider = CGDataProvider(data: data as CFData) else {
32 |
33 | return
34 | }
35 |
36 | let font = CGFont.init(provider)
37 |
38 | guard let unwrappedFont = font,
39 | !CTFontManagerRegisterGraphicsFont(unwrappedFont, &error),
40 | let unwrappedError = error,
41 | let nsError = (unwrappedError.takeUnretainedValue() as AnyObject) as? NSError else {
42 |
43 | return
44 | }
45 |
46 | let errorDescription: CFString = CFErrorCopyDescription(unwrappedError.takeUnretainedValue())
47 |
48 | NSException(name: NSExceptionName.internalInconsistencyException,
49 | reason: errorDescription as String,
50 | userInfo: [NSUnderlyingErrorKey: nsError]).raise()
51 | }
52 | }
53 |
54 | public extension UIFont {
55 | static func icon(from font: Fonts, ofSize size: CGFloat) -> UIFont {
56 | let fontName = font.rawValue
57 | if (UIFont.fontNames(forFamilyName: font.fontName).count == 0)
58 | {
59 | FontLoader.loadFont(fontName)
60 | }
61 | return UIFont(name: font.rawValue, size: size)!
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/Pods/SwiftIconFont/SwiftIconFont/Classes/Fonts/Octicon.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NSString+Octicon.swift
3 | // SwiftIconFont
4 | //
5 | // Created by Sedat Ciftci on 18/03/16.
6 | // Copyright © 2016 Sedat Gokbek Ciftci. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | public let octiconArr: [String: String] = [
12 | "alert":"\u{f02d}",
13 | "alignment-align":"\u{f08a}",
14 | "alignment-aligned-to":"\u{f08e}",
15 | "alignment-unalign":"\u{f08b}",
16 | "arrow-down":"\u{f03f}",
17 | "arrow-left":"\u{f040}",
18 | "arrow-right":"\u{f03e}",
19 | "arrow-small-down":"\u{f0a0}",
20 | "arrow-small-left":"\u{f0a1}",
21 | "arrow-small-right":"\u{f071}",
22 | "arrow-small-up":"\u{f09f}",
23 | "arrow-up":"\u{f03d}",
24 | "beer":"\u{f069}",
25 | "book":"\u{f007}",
26 | "bookmark":"\u{f07b}",
27 | "briefcase":"\u{f0d3}",
28 | "broadcast":"\u{f048}",
29 | "browser":"\u{f0c5}",
30 | "bug":"\u{f091}",
31 | "calendar":"\u{f068}",
32 | "check":"\u{f03a}",
33 | "checklist":"\u{f076}",
34 | "chevron-down":"\u{f0a3}",
35 | "chevron-left":"\u{f0a4}",
36 | "chevron-right":"\u{f078}",
37 | "chevron-up":"\u{f0a2}",
38 | "circle-slash":"\u{f084}",
39 | "circuit-board":"\u{f0d6}",
40 | "clippy":"\u{f035}",
41 | "clock":"\u{f046}",
42 | "cloud-download":"\u{f00b}",
43 | "cloud-upload":"\u{f00c}",
44 | "code":"\u{f05f}",
45 | "color-mode":"\u{f065}",
46 | "comment":"\u{f02b}",
47 | "comment-discussion":"\u{f04f}",
48 | "credit-card":"\u{f045}",
49 | "dash":"\u{f0ca}",
50 | "dashboard":"\u{f07d}",
51 | "database":"\u{f096}",
52 | "device-camera":"\u{f056}",
53 | "device-camera-video":"\u{f057}",
54 | "device-desktop":"\u{f27c}",
55 | "device-mobile":"\u{f038}",
56 | "diff":"\u{f04d}",
57 | "diff-added":"\u{f06b}",
58 | "diff-ignored":"\u{f099}",
59 | "diff-modified":"\u{f06d}",
60 | "diff-removed":"\u{f06c}",
61 | "diff-renamed":"\u{f06e}",
62 | "ellipsis":"\u{f09a}",
63 | "eye":"\u{f04e}",
64 | "file-binary":"\u{f094}",
65 | "file-code":"\u{f010}",
66 | "file-directory":"\u{f016}",
67 | "file-media":"\u{f012}",
68 | "file-pdf":"\u{f014}",
69 | "file-submodule":"\u{f017}",
70 | "file-symlink-directory":"\u{f0b1}",
71 | "file-symlink-file":"\u{f0b0}",
72 | "file-text":"\u{f011}",
73 | "file-zip":"\u{f013}",
74 | "flame":"\u{f0d2}",
75 | "fold":"\u{f0cc}",
76 | "gear":"\u{f02f}",
77 | "gift":"\u{f042}",
78 | "gist":"\u{f00e}",
79 | "gist-secret":"\u{f08c}",
80 | "git-branch":"\u{f020}",
81 | "git-commit":"\u{f01f}",
82 | "git-compare":"\u{f0ac}",
83 | "git-merge":"\u{f023}",
84 | "git-pull-request":"\u{f009}",
85 | "globe":"\u{f0b6}",
86 | "graph":"\u{f043}",
87 | "heart":"\u{2665}",
88 | "history":"\u{f07e}",
89 | "home":"\u{f08d}",
90 | "horizontal-rule":"\u{f070}",
91 | "hourglass":"\u{f09e}",
92 | "hubot":"\u{f09d}",
93 | "inbox":"\u{f0cf}",
94 | "info":"\u{f059}",
95 | "issue-closed":"\u{f028}",
96 | "issue-opened":"\u{f026}",
97 | "issue-reopened":"\u{f027}",
98 | "jersey":"\u{f019}",
99 | "jump-down":"\u{f072}",
100 | "jump-left":"\u{f0a5}",
101 | "jump-right":"\u{f0a6}",
102 | "jump-up":"\u{f073}",
103 | "key":"\u{f049}",
104 | "keyboard":"\u{f00d}",
105 | "law":"\u{f0d8}",
106 | "light-bulb":"\u{f000}",
107 | "link":"\u{f05c}",
108 | "link-external":"\u{f07f}",
109 | "list-ordered":"\u{f062}",
110 | "list-unordered":"\u{f061}",
111 | "location":"\u{f060}",
112 | "lock":"\u{f06a}",
113 | "logo-github":"\u{f092}",
114 | "mail":"\u{f03b}",
115 | "mail-read":"\u{f03c}",
116 | "mail-reply":"\u{f051}",
117 | "mark-github":"\u{f00a}",
118 | "markdown":"\u{f0c9}",
119 | "megaphone":"\u{f077}",
120 | "mention":"\u{f0be}",
121 | "microscope":"\u{f089}",
122 | "milestone":"\u{f075}",
123 | "mirror":"\u{f024}",
124 | "mortar-board":"\u{f0d7}",
125 | "move-down":"\u{f0a8}",
126 | "move-left":"\u{f074}",
127 | "move-right":"\u{f0a9}",
128 | "move-up":"\u{f0a7}",
129 | "mute":"\u{f080}",
130 | "no-newline":"\u{f09c}",
131 | "octoface":"\u{f008}",
132 | "organization":"\u{f037}",
133 | "package":"\u{f0c4}",
134 | "paintcan":"\u{f0d1}",
135 | "pencil":"\u{f058}",
136 | "person":"\u{f018}",
137 | "pin":"\u{f041}",
138 | "playback-fast-forward":"\u{f0bd}",
139 | "playback-pause":"\u{f0bb}",
140 | "playback-play":"\u{f0bf}",
141 | "playback-rewind":"\u{f0bc}",
142 | "plug":"\u{f0d4}",
143 | "plus":"\u{f05d}",
144 | "podium":"\u{f0af}",
145 | "primitive-dot":"\u{f052}",
146 | "primitive-square":"\u{f053}",
147 | "pulse":"\u{f085}",
148 | "puzzle":"\u{f0c0}",
149 | "question":"\u{f02c}",
150 | "quote":"\u{f063}",
151 | "radio-tower":"\u{f030}",
152 | "repo":"\u{f001}",
153 | "repo-clone":"\u{f04c}",
154 | "repo-force-push":"\u{f04a}",
155 | "repo-forked":"\u{f002}",
156 | "repo-pull":"\u{f006}",
157 | "repo-push":"\u{f005}",
158 | "rocket":"\u{f033}",
159 | "rss":"\u{f034}",
160 | "ruby":"\u{f047}",
161 | "screen-full":"\u{f066}",
162 | "screen-normal":"\u{f067}",
163 | "search":"\u{f02e}",
164 | "server":"\u{f097}",
165 | "settings":"\u{f07c}",
166 | "sign-in":"\u{f036}",
167 | "sign-out":"\u{f032}",
168 | "split":"\u{f0c6}",
169 | "squirrel":"\u{f0b2}",
170 | "star":"\u{f02a}",
171 | "steps":"\u{f0c7}",
172 | "stop":"\u{f08f}",
173 | "sync":"\u{f087}",
174 | "tag":"\u{f015}",
175 | "telescope":"\u{f088}",
176 | "terminal":"\u{f0c8}",
177 | "three-bars":"\u{f05e}",
178 | "thumbsdown":"\u{f0db}",
179 | "thumbsup":"\u{f0da}",
180 | "tools":"\u{f031}",
181 | "trashcan":"\u{f0d0}",
182 | "triangle-down":"\u{f05b}",
183 | "triangle-left":"\u{f044}",
184 | "triangle-right":"\u{f05a}",
185 | "triangle-up":"\u{f0aa}",
186 | "unfold":"\u{f039}",
187 | "unmute":"\u{f0ba}",
188 | "versions":"\u{f064}",
189 | "x":"\u{f081}",
190 | "zap":"\u{26A1}",
191 | ]
192 |
--------------------------------------------------------------------------------
/Pods/SwiftIconFont/SwiftIconFont/Classes/UI/SwiftIconBarButtonItem.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SwiftIconBarButtonItem.swift
3 | // Exm
4 | //
5 | // Created by Sedat Gökbek ÇİFTÇİ on 10/07/16.
6 | // Copyright © 2016 Sedat Gökbek ÇİFTÇİ. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @IBDesignable
12 | class SwiftIconBarButtonItem: UIBarButtonItem {
13 | @IBInspectable var Icon: String = ""
14 | @IBInspectable var FontSize: CGFloat = 15.00
15 |
16 | override func awakeFromNib() {
17 | parseIcon()
18 | }
19 |
20 | fileprivate func parseIcon() {
21 | self.icon(from: GetFontTypeWithSelectedIcon(Icon), code: GetIconIndexWithSelectedIcon(Icon), ofSize: FontSize)
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Pods/SwiftIconFont/SwiftIconFont/Classes/UI/SwiftIconButton.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SwiftIconButton.swift
3 | // icon
4 | //
5 | // Created by Sedat Gökbek ÇİFTÇİ on 08/07/16.
6 | // Copyright © 2016 Sedat Gökbek ÇİFTÇİ. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @IBDesignable
12 | class SwiftIconButton: UIButton {
13 | @IBInspectable var Icon: String = "" {
14 | didSet {
15 | self.parseIcon()
16 | self.setTitle(Icon, for: .normal)
17 | }
18 | }
19 |
20 | override func awakeFromNib() {
21 | self.parseIcon()
22 | }
23 | }
24 |
25 |
26 |
--------------------------------------------------------------------------------
/Pods/SwiftIconFont/SwiftIconFont/Classes/UI/SwiftIconFontView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SwiftIconFontView.swift
3 | // SwiftIconFont
4 | //
5 | // Created by Sedat Gökbek ÇİFTÇİ on 12/07/2017.
6 | // Copyright © 2017 Sedat Gökbek ÇİFTÇİ. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @IBDesignable public class SwiftIconFontView: UIView {
12 |
13 | @IBInspectable
14 | public var iconCode: String = "" {
15 | didSet {
16 | iconFont = GetFontTypeWithSelectedIcon(iconCode)
17 | let iconText = GetIconIndexWithSelectedIcon(iconCode)
18 | self.iconView.text = String.getIcon(from: iconFont, code: iconText)
19 | }
20 | }
21 |
22 |
23 | private var iconView = UILabel()
24 | private var iconFont = Fonts.FontAwesome
25 |
26 | override init(frame: CGRect) {
27 | super.init(frame: frame)
28 | setupViews()
29 | }
30 |
31 |
32 | required public init?(coder aDecoder: NSCoder) {
33 | super.init(coder: aDecoder)
34 | setupViews()
35 | }
36 |
37 | override public func prepareForInterfaceBuilder() {
38 | setupViews()
39 | }
40 |
41 |
42 | func setupViews() {
43 | iconFont = GetFontTypeWithSelectedIcon(iconCode)
44 | let iconText = GetIconIndexWithSelectedIcon(iconCode)
45 | self.iconView.textAlignment = NSTextAlignment.center
46 | self.iconView.text = String.getIcon(from: iconFont, code: iconText)
47 | self.iconView.textColor = self.tintColor
48 | self.addSubview(iconView)
49 | }
50 |
51 |
52 | override public func tintColorDidChange() {
53 | self.iconView.textColor = self.tintColor
54 | }
55 |
56 | override public func layoutSubviews() {
57 | super.layoutSubviews()
58 | self.clipsToBounds = true
59 | self.iconView.font = UIFont.icon(from: iconFont, ofSize: bounds.size.width < bounds.size.height ? bounds.size.width : bounds.size.height)
60 | self.iconView.frame = CGRect(origin: CGPoint(x: 0, y: 0), size: CGSize(width: bounds.size.width, height: bounds.size.height))
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/Pods/SwiftIconFont/SwiftIconFont/Classes/UI/SwiftIconLabel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SwiftIconLabel.swift
3 | // icon
4 | //
5 | // Created by Sedat Gökbek ÇİFTÇİ on 08/07/16.
6 | // Copyright © 2016 Sedat Gökbek ÇİFTÇİ. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @IBDesignable
12 | public class SwiftIconLabel: UILabel {
13 | @IBInspectable var Icon: String = "" {
14 | didSet {
15 | self.text = Icon
16 | self.parseIcon()
17 | }
18 | }
19 |
20 | public override func awakeFromNib() {
21 | self.parseIcon()
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Pods/SwiftIconFont/SwiftIconFont/Classes/UI/SwiftIconStepper.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SwiftIconStepper.swift
3 | // Pods
4 | //
5 | // Created by Sedat Gökbek ÇİFTÇİ on 08/09/2017.
6 | //
7 | //
8 |
9 | import UIKit
10 |
11 | #if os(iOS)
12 | @IBDesignable
13 | class SwiftIconStepper: UIStepper {
14 | @IBInspectable var incrementIcon: String?
15 | @IBInspectable var decrementIcon: String?
16 | @IBInspectable var fontSize : CGFloat = 15.0
17 | @IBInspectable var width: CGFloat = 20.0
18 | @IBInspectable var height: CGFloat = 20.0
19 |
20 | override func awakeFromNib() {
21 | parseIcon()
22 | }
23 |
24 | fileprivate func parseIcon() {
25 | if incrementIcon != nil {
26 | let incrementIconImage = UIImage.icon(from: GetFontTypeWithSelectedIcon(incrementIcon!), iconColor: self.tintColor, code: GetIconIndexWithSelectedIcon(incrementIcon!), imageSize: CGSize(width: width, height: height), ofSize: fontSize)
27 | self.setIncrementImage(incrementIconImage, for: .normal)
28 | }
29 |
30 | if decrementIcon != nil {
31 | let decrementIconImage = UIImage.icon(from: GetFontTypeWithSelectedIcon(decrementIcon!), iconColor: self.tintColor, code: GetIconIndexWithSelectedIcon(decrementIcon!), imageSize: CGSize(width: width, height: height), ofSize: fontSize)
32 | self.setDecrementImage(decrementIconImage, for: .normal)
33 | }
34 |
35 | }
36 |
37 | }
38 | #endif
39 |
--------------------------------------------------------------------------------
/Pods/SwiftIconFont/SwiftIconFont/Classes/UI/SwiftIconTabBarItem.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SwiftIconTabBarItem.swift
3 | // Exm
4 | //
5 | // Created by Sedat Gökbek ÇİFTÇİ on 10/07/16.
6 | // Copyright © 2016 Sedat Gökbek ÇİFTÇİ. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 |
12 | @IBDesignable
13 | class SwiftIconTabBarItem: UITabBarItem {
14 | @IBInspectable var Icon: String = ""
15 | @IBInspectable var IconFontSize: CGFloat = 20.0
16 | @IBInspectable var IconImageSize: CGSize = CGSize(width: 20, height: 20)
17 | @IBInspectable var IconColor: UIColor = UIColor.black
18 |
19 | @IBInspectable var SelectedIcon: String? {
20 | didSet {
21 | setIcon()
22 | }
23 | }
24 | @IBInspectable var SelectedIconFontSize: CGFloat = 20.0
25 | @IBInspectable var SelectedIconImageSize: CGSize = CGSize(width: 20, height: 20)
26 | @IBInspectable var SelectedIconColor: UIColor = UIColor.black
27 |
28 | override func awakeFromNib() {
29 | setIcon()
30 | }
31 |
32 | func setIcon() {
33 | let defaultIcon = SwiftIcon(font: GetFontTypeWithSelectedIcon(Icon), code: GetIconIndexWithSelectedIcon(Icon), color: IconColor, imageSize: IconImageSize, fontSize: IconFontSize)
34 | if SelectedIcon != nil {
35 | let selectedIcon = SwiftIcon(font: GetFontTypeWithSelectedIcon(SelectedIcon!), code: GetIconIndexWithSelectedIcon(SelectedIcon!), color: SelectedIconColor, imageSize: CGSize(width: 20, height: 20), fontSize: SelectedIconFontSize)
36 | iconWithSelectedIcon(from: defaultIcon, selectedIcon: selectedIcon)
37 | } else {
38 | iconWithSwiftIcon(defaultIcon: defaultIcon)
39 | }
40 | }
41 |
42 | }
43 |
--------------------------------------------------------------------------------
/Pods/SwiftIconFont/SwiftIconFont/Classes/UI/SwiftIconTextField.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SwiftIconTextField.swift
3 | // icon
4 | //
5 | // Created by Sedat Gökbek ÇİFTÇİ on 08/07/16.
6 | // Copyright © 2016 Sedat Gökbek ÇİFTÇİ. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @IBDesignable
12 | class SwiftIconTextField: UITextField {
13 |
14 | @IBInspectable var RuntimeParse: Bool = false
15 |
16 | override public func awakeFromNib() {
17 | self.parseIcon()
18 | if RuntimeParse {
19 | self.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged)
20 | }
21 | }
22 |
23 | @objc public func textFieldDidChange(textField: SwiftIconTextField) {
24 | do {
25 | let input = textField.text
26 | let regex = try NSRegularExpression(pattern: "icon:\\((\\w+):(\\w+)\\)", options: NSRegularExpression.Options.caseInsensitive)
27 | let matches = regex.matches(in: input!, options: [], range: NSRange(location: 0, length: (input?.utf16.count)!))
28 |
29 |
30 | for match in matches {
31 | var fontPrefix = ""
32 | var fontCode = ""
33 | let iconLibraryNameRange = match.range(at: 1)
34 | let iconNameRange = match.range(at: 2)
35 |
36 | if let swiftRange = iconLibraryNameRange.range(for: input!) {
37 | fontPrefix = String((input?[swiftRange])!)
38 | }
39 |
40 |
41 | if let swiftRange = iconNameRange.range(for: input!) {
42 | fontCode = String((input?[swiftRange])!)
43 | }
44 |
45 | if fontPrefix.utf16.count > 0 && fontCode.utf16.count > 0 {
46 |
47 | var fontArr: [String: String] = ["": ""]
48 |
49 | if fontPrefix == "fa" {
50 | fontArr = fontAwesomeIconArr
51 | } else if fontPrefix == "ic" {
52 | fontArr = iconicIconArr
53 | } else if fontPrefix == "io" {
54 | fontArr = ioniconArr
55 | } else if fontPrefix == "oc" {
56 | fontArr = octiconArr
57 | } else if fontPrefix == "ti" {
58 | fontArr = temifyIconArr
59 | } else if fontPrefix == "mi" {
60 | fontArr = mapIconArr
61 | } else if fontPrefix == "ma" {
62 | fontArr = materialIconArr
63 | }
64 |
65 | if let _ = fontArr[fontCode] {
66 | self.parseIconForRuntime()
67 | }
68 | }
69 | }
70 | } catch {
71 | // regex was bad!
72 | }
73 |
74 | }
75 | }
76 |
--------------------------------------------------------------------------------
/Pods/SwiftIconFont/SwiftIconFont/Classes/UI/SwiftIconTextView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SwiftIconTextView.swift
3 | // Exm
4 | //
5 | // Created by Sedat Gökbek ÇİFTÇİ on 10/07/16.
6 | // Copyright © 2016 Sedat Gökbek ÇİFTÇİ. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @IBDesignable
12 | class SwiftIconTextView: UITextView {
13 | @IBInspectable public var Icon: String = "" {
14 | didSet {
15 | self.text = Icon
16 | self.parseIcon()
17 | }
18 | }
19 |
20 | override func awakeFromNib() {
21 | self.parseIcon()
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Pods/SwiftIconFont/SwiftIconFont/Resources/FontAwesome.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tranquan/KJOverlayTutorial/63d05313c402aae693b02dc89148fd4750de10c9/Pods/SwiftIconFont/SwiftIconFont/Resources/FontAwesome.ttf
--------------------------------------------------------------------------------
/Pods/SwiftIconFont/SwiftIconFont/Resources/Ionicons.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tranquan/KJOverlayTutorial/63d05313c402aae693b02dc89148fd4750de10c9/Pods/SwiftIconFont/SwiftIconFont/Resources/Ionicons.ttf
--------------------------------------------------------------------------------
/Pods/SwiftIconFont/SwiftIconFont/Resources/MaterialIcons-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tranquan/KJOverlayTutorial/63d05313c402aae693b02dc89148fd4750de10c9/Pods/SwiftIconFont/SwiftIconFont/Resources/MaterialIcons-Regular.ttf
--------------------------------------------------------------------------------
/Pods/SwiftIconFont/SwiftIconFont/Resources/map-icons.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tranquan/KJOverlayTutorial/63d05313c402aae693b02dc89148fd4750de10c9/Pods/SwiftIconFont/SwiftIconFont/Resources/map-icons.ttf
--------------------------------------------------------------------------------
/Pods/SwiftIconFont/SwiftIconFont/Resources/octicons.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tranquan/KJOverlayTutorial/63d05313c402aae693b02dc89148fd4750de10c9/Pods/SwiftIconFont/SwiftIconFont/Resources/octicons.ttf
--------------------------------------------------------------------------------
/Pods/SwiftIconFont/SwiftIconFont/Resources/open-iconic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tranquan/KJOverlayTutorial/63d05313c402aae693b02dc89148fd4750de10c9/Pods/SwiftIconFont/SwiftIconFont/Resources/open-iconic.ttf
--------------------------------------------------------------------------------
/Pods/SwiftIconFont/SwiftIconFont/Resources/themify.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tranquan/KJOverlayTutorial/63d05313c402aae693b02dc89148fd4750de10c9/Pods/SwiftIconFont/SwiftIconFont/Resources/themify.ttf
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-OverlayTutorial/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | ${EXECUTABLE_NAME}
9 | CFBundleIdentifier
10 | ${PRODUCT_BUNDLE_IDENTIFIER}
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | ${PRODUCT_NAME}
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 1.0.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | ${CURRENT_PROJECT_VERSION}
23 | NSPrincipalClass
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-OverlayTutorial/Pods-OverlayTutorial-acknowledgements.markdown:
--------------------------------------------------------------------------------
1 | # Acknowledgements
2 | This application makes use of the following third party libraries:
3 |
4 | ## SwiftIconFont
5 |
6 | Copyright (c) 2016 Sedat Gokbek CIFTCI
7 |
8 | Permission is hereby granted, free of charge, to any person obtaining a copy
9 | of this software and associated documentation files (the "Software"), to deal
10 | in the Software without restriction, including without limitation the rights
11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 | copies of the Software, and to permit persons to whom the Software is
13 | furnished to do so, subject to the following conditions:
14 |
15 | The above copyright notice and this permission notice shall be included in
16 | all copies or substantial portions of the Software.
17 |
18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 | THE SOFTWARE.
25 |
26 |
27 | ## pop
28 |
29 | BSD License
30 |
31 | For Pop software
32 |
33 | Copyright (c) 2014, Facebook, Inc. All rights reserved.
34 |
35 | Redistribution and use in source and binary forms, with or without modification,
36 | are permitted provided that the following conditions are met:
37 |
38 | * Redistributions of source code must retain the above copyright notice, this
39 | list of conditions and the following disclaimer.
40 |
41 | * Redistributions in binary form must reproduce the above copyright notice,
42 | this list of conditions and the following disclaimer in the documentation
43 | and/or other materials provided with the distribution.
44 |
45 | * Neither the name Facebook nor the names of its contributors may be used to
46 | endorse or promote products derived from this software without specific
47 | prior written permission.
48 |
49 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
50 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
51 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
52 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
53 | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
54 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
55 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
56 | ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
57 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
58 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
59 |
60 | Generated by CocoaPods - https://cocoapods.org
61 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-OverlayTutorial/Pods-OverlayTutorial-acknowledgements.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreferenceSpecifiers
6 |
7 |
8 | FooterText
9 | This application makes use of the following third party libraries:
10 | Title
11 | Acknowledgements
12 | Type
13 | PSGroupSpecifier
14 |
15 |
16 | FooterText
17 | Copyright (c) 2016 Sedat Gokbek CIFTCI <me@sedat.ninja>
18 |
19 | Permission is hereby granted, free of charge, to any person obtaining a copy
20 | of this software and associated documentation files (the "Software"), to deal
21 | in the Software without restriction, including without limitation the rights
22 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
23 | copies of the Software, and to permit persons to whom the Software is
24 | furnished to do so, subject to the following conditions:
25 |
26 | The above copyright notice and this permission notice shall be included in
27 | all copies or substantial portions of the Software.
28 |
29 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
30 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
31 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
32 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
33 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
34 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
35 | THE SOFTWARE.
36 |
37 | License
38 | MIT
39 | Title
40 | SwiftIconFont
41 | Type
42 | PSGroupSpecifier
43 |
44 |
45 | FooterText
46 | BSD License
47 |
48 | For Pop software
49 |
50 | Copyright (c) 2014, Facebook, Inc. All rights reserved.
51 |
52 | Redistribution and use in source and binary forms, with or without modification,
53 | are permitted provided that the following conditions are met:
54 |
55 | * Redistributions of source code must retain the above copyright notice, this
56 | list of conditions and the following disclaimer.
57 |
58 | * Redistributions in binary form must reproduce the above copyright notice,
59 | this list of conditions and the following disclaimer in the documentation
60 | and/or other materials provided with the distribution.
61 |
62 | * Neither the name Facebook nor the names of its contributors may be used to
63 | endorse or promote products derived from this software without specific
64 | prior written permission.
65 |
66 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
67 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
68 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
69 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
70 | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
71 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
72 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
73 | ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
74 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
75 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
76 |
77 | License
78 | BSD
79 | Title
80 | pop
81 | Type
82 | PSGroupSpecifier
83 |
84 |
85 | FooterText
86 | Generated by CocoaPods - https://cocoapods.org
87 | Title
88 |
89 | Type
90 | PSGroupSpecifier
91 |
92 |
93 | StringsTable
94 | Acknowledgements
95 | Title
96 | Acknowledgements
97 |
98 |
99 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-OverlayTutorial/Pods-OverlayTutorial-dummy.m:
--------------------------------------------------------------------------------
1 | #import
2 | @interface PodsDummy_Pods_OverlayTutorial : NSObject
3 | @end
4 | @implementation PodsDummy_Pods_OverlayTutorial
5 | @end
6 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-OverlayTutorial/Pods-OverlayTutorial-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 | # This protects against multiple targets copying the same framework dependency at the same time. The solution
10 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html
11 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????")
12 |
13 | install_framework()
14 | {
15 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then
16 | local source="${BUILT_PRODUCTS_DIR}/$1"
17 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then
18 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")"
19 | elif [ -r "$1" ]; then
20 | local source="$1"
21 | fi
22 |
23 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
24 |
25 | if [ -L "${source}" ]; then
26 | echo "Symlinked..."
27 | source="$(readlink "${source}")"
28 | fi
29 |
30 | # Use filter instead of exclude so missing patterns don't throw errors.
31 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\""
32 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}"
33 |
34 | local basename
35 | basename="$(basename -s .framework "$1")"
36 | binary="${destination}/${basename}.framework/${basename}"
37 | if ! [ -r "$binary" ]; then
38 | binary="${destination}/${basename}"
39 | fi
40 |
41 | # Strip invalid architectures so "fat" simulator / device frameworks work on device
42 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then
43 | strip_invalid_archs "$binary"
44 | fi
45 |
46 | # Resign the code if required by the build settings to avoid unstable apps
47 | code_sign_if_enabled "${destination}/$(basename "$1")"
48 |
49 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7.
50 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then
51 | local swift_runtime_libs
52 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]})
53 | for lib in $swift_runtime_libs; do
54 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\""
55 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}"
56 | code_sign_if_enabled "${destination}/${lib}"
57 | done
58 | fi
59 | }
60 |
61 | # Copies the dSYM of a vendored framework
62 | install_dsym() {
63 | local source="$1"
64 | if [ -r "$source" ]; then
65 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DWARF_DSYM_FOLDER_PATH}\""
66 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DWARF_DSYM_FOLDER_PATH}"
67 | fi
68 | }
69 |
70 | # Signs a framework with the provided identity
71 | code_sign_if_enabled() {
72 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then
73 | # Use the current code_sign_identitiy
74 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}"
75 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements '$1'"
76 |
77 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then
78 | code_sign_cmd="$code_sign_cmd &"
79 | fi
80 | echo "$code_sign_cmd"
81 | eval "$code_sign_cmd"
82 | fi
83 | }
84 |
85 | # Strip invalid architectures
86 | strip_invalid_archs() {
87 | binary="$1"
88 | # Get architectures for current file
89 | archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)"
90 | stripped=""
91 | for arch in $archs; do
92 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then
93 | # Strip non-valid architectures in-place
94 | lipo -remove "$arch" -output "$binary" "$binary" || exit 1
95 | stripped="$stripped $arch"
96 | fi
97 | done
98 | if [[ "$stripped" ]]; then
99 | echo "Stripped $binary of architectures:$stripped"
100 | fi
101 | }
102 |
103 |
104 | if [[ "$CONFIGURATION" == "Debug" ]]; then
105 | install_framework "${BUILT_PRODUCTS_DIR}/SwiftIconFont/SwiftIconFont.framework"
106 | install_framework "${BUILT_PRODUCTS_DIR}/pop/pop.framework"
107 | fi
108 | if [[ "$CONFIGURATION" == "Release" ]]; then
109 | install_framework "${BUILT_PRODUCTS_DIR}/SwiftIconFont/SwiftIconFont.framework"
110 | install_framework "${BUILT_PRODUCTS_DIR}/pop/pop.framework"
111 | fi
112 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then
113 | wait
114 | fi
115 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-OverlayTutorial/Pods-OverlayTutorial-resources.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | set -e
3 |
4 | mkdir -p "${TARGET_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 | # This protects against multiple targets copying the same framework dependency at the same time. The solution
12 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html
13 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????")
14 |
15 | case "${TARGETED_DEVICE_FAMILY}" in
16 | 1,2)
17 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone"
18 | ;;
19 | 1)
20 | TARGET_DEVICE_ARGS="--target-device iphone"
21 | ;;
22 | 2)
23 | TARGET_DEVICE_ARGS="--target-device ipad"
24 | ;;
25 | 3)
26 | TARGET_DEVICE_ARGS="--target-device tv"
27 | ;;
28 | 4)
29 | TARGET_DEVICE_ARGS="--target-device watch"
30 | ;;
31 | *)
32 | TARGET_DEVICE_ARGS="--target-device mac"
33 | ;;
34 | esac
35 |
36 | install_resource()
37 | {
38 | if [[ "$1" = /* ]] ; then
39 | RESOURCE_PATH="$1"
40 | else
41 | RESOURCE_PATH="${PODS_ROOT}/$1"
42 | fi
43 | if [[ ! -e "$RESOURCE_PATH" ]] ; then
44 | cat << EOM
45 | error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script.
46 | EOM
47 | exit 1
48 | fi
49 | case $RESOURCE_PATH in
50 | *.storyboard)
51 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true
52 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS}
53 | ;;
54 | *.xib)
55 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true
56 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS}
57 | ;;
58 | *.framework)
59 | echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true
60 | mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
61 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true
62 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
63 | ;;
64 | *.xcdatamodel)
65 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true
66 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom"
67 | ;;
68 | *.xcdatamodeld)
69 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true
70 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd"
71 | ;;
72 | *.xcmappingmodel)
73 | echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true
74 | xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm"
75 | ;;
76 | *.xcassets)
77 | ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH"
78 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE")
79 | ;;
80 | *)
81 | echo "$RESOURCE_PATH" || true
82 | echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY"
83 | ;;
84 | esac
85 | }
86 |
87 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
88 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
89 | if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then
90 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
91 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
92 | fi
93 | rm -f "$RESOURCES_TO_COPY"
94 |
95 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ]
96 | then
97 | # Find all other xcassets (this unfortunately includes those of path pods and other targets).
98 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d)
99 | while read line; do
100 | if [[ $line != "${PODS_ROOT}*" ]]; then
101 | XCASSET_FILES+=("$line")
102 | fi
103 | done <<<"$OTHER_XCASSETS"
104 |
105 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
106 | fi
107 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-OverlayTutorial/Pods-OverlayTutorial-umbrella.h:
--------------------------------------------------------------------------------
1 | #ifdef __OBJC__
2 | #import
3 | #else
4 | #ifndef FOUNDATION_EXPORT
5 | #if defined(__cplusplus)
6 | #define FOUNDATION_EXPORT extern "C"
7 | #else
8 | #define FOUNDATION_EXPORT extern
9 | #endif
10 | #endif
11 | #endif
12 |
13 |
14 | FOUNDATION_EXPORT double Pods_OverlayTutorialVersionNumber;
15 | FOUNDATION_EXPORT const unsigned char Pods_OverlayTutorialVersionString[];
16 |
17 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-OverlayTutorial/Pods-OverlayTutorial.debug.xcconfig:
--------------------------------------------------------------------------------
1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/SwiftIconFont" "$PODS_CONFIGURATION_BUILD_DIR/pop"
3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
4 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
5 | OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/SwiftIconFont/SwiftIconFont.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/pop/pop.framework/Headers"
6 | OTHER_LDFLAGS = $(inherited) -framework "SwiftIconFont" -framework "pop"
7 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS"
8 | PODS_BUILD_DIR = $BUILD_DIR
9 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
10 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
11 | PODS_ROOT = ${SRCROOT}/Pods
12 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-OverlayTutorial/Pods-OverlayTutorial.modulemap:
--------------------------------------------------------------------------------
1 | framework module Pods_OverlayTutorial {
2 | umbrella header "Pods-OverlayTutorial-umbrella.h"
3 |
4 | export *
5 | module * { export * }
6 | }
7 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-OverlayTutorial/Pods-OverlayTutorial.release.xcconfig:
--------------------------------------------------------------------------------
1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/SwiftIconFont" "$PODS_CONFIGURATION_BUILD_DIR/pop"
3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
4 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
5 | OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/SwiftIconFont/SwiftIconFont.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/pop/pop.framework/Headers"
6 | OTHER_LDFLAGS = $(inherited) -framework "SwiftIconFont" -framework "pop"
7 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS"
8 | PODS_BUILD_DIR = $BUILD_DIR
9 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
10 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
11 | PODS_ROOT = ${SRCROOT}/Pods
12 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/SwiftIconFont/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | ${EXECUTABLE_NAME}
9 | CFBundleIdentifier
10 | ${PRODUCT_BUNDLE_IDENTIFIER}
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | ${PRODUCT_NAME}
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 2.7.3
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | ${CURRENT_PROJECT_VERSION}
23 | NSPrincipalClass
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/SwiftIconFont/SwiftIconFont-dummy.m:
--------------------------------------------------------------------------------
1 | #import
2 | @interface PodsDummy_SwiftIconFont : NSObject
3 | @end
4 | @implementation PodsDummy_SwiftIconFont
5 | @end
6 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/SwiftIconFont/SwiftIconFont-prefix.pch:
--------------------------------------------------------------------------------
1 | #ifdef __OBJC__
2 | #import
3 | #else
4 | #ifndef FOUNDATION_EXPORT
5 | #if defined(__cplusplus)
6 | #define FOUNDATION_EXPORT extern "C"
7 | #else
8 | #define FOUNDATION_EXPORT extern
9 | #endif
10 | #endif
11 | #endif
12 |
13 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/SwiftIconFont/SwiftIconFont-umbrella.h:
--------------------------------------------------------------------------------
1 | #ifdef __OBJC__
2 | #import
3 | #else
4 | #ifndef FOUNDATION_EXPORT
5 | #if defined(__cplusplus)
6 | #define FOUNDATION_EXPORT extern "C"
7 | #else
8 | #define FOUNDATION_EXPORT extern
9 | #endif
10 | #endif
11 | #endif
12 |
13 |
14 | FOUNDATION_EXPORT double SwiftIconFontVersionNumber;
15 | FOUNDATION_EXPORT const unsigned char SwiftIconFontVersionString[];
16 |
17 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/SwiftIconFont/SwiftIconFont.modulemap:
--------------------------------------------------------------------------------
1 | framework module SwiftIconFont {
2 | umbrella header "SwiftIconFont-umbrella.h"
3 |
4 | export *
5 | module * { export * }
6 | }
7 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/SwiftIconFont/SwiftIconFont.xcconfig:
--------------------------------------------------------------------------------
1 | CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/SwiftIconFont
2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
3 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public"
4 | OTHER_LDFLAGS = -framework "UIKit"
5 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS"
6 | PODS_BUILD_DIR = $BUILD_DIR
7 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
8 | PODS_ROOT = ${SRCROOT}
9 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/SwiftIconFont
10 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
11 | SKIP_INSTALL = YES
12 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/pop/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | ${EXECUTABLE_NAME}
9 | CFBundleIdentifier
10 | ${PRODUCT_BUNDLE_IDENTIFIER}
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | ${PRODUCT_NAME}
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 1.0.10
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | ${CURRENT_PROJECT_VERSION}
23 | NSPrincipalClass
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/pop/pop-dummy.m:
--------------------------------------------------------------------------------
1 | #import
2 | @interface PodsDummy_pop : NSObject
3 | @end
4 | @implementation PodsDummy_pop
5 | @end
6 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/pop/pop-prefix.pch:
--------------------------------------------------------------------------------
1 | #ifdef __OBJC__
2 | #import
3 | #else
4 | #ifndef FOUNDATION_EXPORT
5 | #if defined(__cplusplus)
6 | #define FOUNDATION_EXPORT extern "C"
7 | #else
8 | #define FOUNDATION_EXPORT extern
9 | #endif
10 | #endif
11 | #endif
12 |
13 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/pop/pop-umbrella.h:
--------------------------------------------------------------------------------
1 | #ifdef __OBJC__
2 | #import
3 | #else
4 | #ifndef FOUNDATION_EXPORT
5 | #if defined(__cplusplus)
6 | #define FOUNDATION_EXPORT extern "C"
7 | #else
8 | #define FOUNDATION_EXPORT extern
9 | #endif
10 | #endif
11 | #endif
12 |
13 | #import "POP.h"
14 | #import "POPAnimatableProperty.h"
15 | #import "POPAnimatablePropertyTypes.h"
16 | #import "POPAnimation.h"
17 | #import "POPAnimationEvent.h"
18 | #import "POPAnimationExtras.h"
19 | #import "POPAnimationTracer.h"
20 | #import "POPAnimator.h"
21 | #import "POPBasicAnimation.h"
22 | #import "POPCustomAnimation.h"
23 | #import "POPDecayAnimation.h"
24 | #import "POPDefines.h"
25 | #import "POPGeometry.h"
26 | #import "POPLayerExtras.h"
27 | #import "POPPropertyAnimation.h"
28 | #import "POPSpringAnimation.h"
29 |
30 | FOUNDATION_EXPORT double popVersionNumber;
31 | FOUNDATION_EXPORT const unsigned char popVersionString[];
32 |
33 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/pop/pop.modulemap:
--------------------------------------------------------------------------------
1 | framework module pop {
2 | umbrella header "pop-umbrella.h"
3 |
4 | export *
5 | module * { export * }
6 | }
7 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/pop/pop.xcconfig:
--------------------------------------------------------------------------------
1 | CLANG_CXX_LANGUAGE_STANDARD = c++11
2 | CLANG_CXX_LIBRARY = libc++
3 | CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/pop
4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
5 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public"
6 | OTHER_LDFLAGS = -l"c++"
7 | PODS_BUILD_DIR = $BUILD_DIR
8 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
9 | PODS_ROOT = ${SRCROOT}
10 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/pop
11 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
12 | SKIP_INSTALL = YES
13 |
--------------------------------------------------------------------------------
/Pods/pop/LICENSE:
--------------------------------------------------------------------------------
1 | BSD License
2 |
3 | For Pop software
4 |
5 | Copyright (c) 2014, Facebook, Inc. All rights reserved.
6 |
7 | Redistribution and use in source and binary forms, with or without modification,
8 | are permitted provided that the following conditions are met:
9 |
10 | * Redistributions of source code must retain the above copyright notice, this
11 | list of conditions and the following disclaimer.
12 |
13 | * Redistributions in binary form must reproduce the above copyright notice,
14 | this list of conditions and the following disclaimer in the documentation
15 | and/or other materials provided with the distribution.
16 |
17 | * Neither the name Facebook nor the names of its contributors may be used to
18 | endorse or promote products derived from this software without specific
19 | prior written permission.
20 |
21 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
22 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
25 | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
28 | ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 |
--------------------------------------------------------------------------------
/Pods/pop/pop/POP.h:
--------------------------------------------------------------------------------
1 | /**
2 | Copyright (c) 2014-present, Facebook, Inc.
3 | All rights reserved.
4 |
5 | This source code is licensed under the BSD-style license found in the
6 | LICENSE file in the root directory of this source tree. An additional grant
7 | of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #ifndef POP_POP_H
11 | #define POP_POP_H
12 |
13 | #import
14 |
15 | #import
16 | #import
17 | #import
18 | #import
19 | #import
20 | #import
21 | #import
22 | #import
23 | #import
24 | #import
25 | #import
26 | #import
27 | #import
28 | #import
29 |
30 | #endif /* POP_POP_H */
31 |
--------------------------------------------------------------------------------
/Pods/pop/pop/POPAction.h:
--------------------------------------------------------------------------------
1 | /**
2 | Copyright (c) 2014-present, Facebook, Inc.
3 | All rights reserved.
4 |
5 | This source code is licensed under the BSD-style license found in the
6 | LICENSE file in the root directory of this source tree. An additional grant
7 | of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #ifndef POPACTION_H
11 | #define POPACTION_H
12 |
13 | #import
14 |
15 | #import
16 |
17 | #ifdef __cplusplus
18 |
19 | namespace POP {
20 |
21 | /**
22 | @abstract Disables Core Animation actions using RAII.
23 | @discussion The disablement of actions is scoped to the current transaction.
24 | */
25 | class ActionDisabler
26 | {
27 | BOOL state;
28 |
29 | public:
30 | ActionDisabler() POP_NOTHROW
31 | {
32 | state = [CATransaction disableActions];
33 | [CATransaction setDisableActions:YES];
34 | }
35 |
36 | ~ActionDisabler()
37 | {
38 | [CATransaction setDisableActions:state];
39 | }
40 | };
41 |
42 | /**
43 | @abstract Enables Core Animation actions using RAII.
44 | @discussion The enablement of actions is scoped to the current transaction.
45 | */
46 | class ActionEnabler
47 | {
48 | BOOL state;
49 |
50 | public:
51 | ActionEnabler() POP_NOTHROW
52 | {
53 | state = [CATransaction disableActions];
54 | [CATransaction setDisableActions:NO];
55 | }
56 |
57 | ~ActionEnabler()
58 | {
59 | [CATransaction setDisableActions:state];
60 | }
61 | };
62 |
63 | }
64 |
65 | #endif /* __cplusplus */
66 |
67 | #endif /* POPACTION_H */
68 |
--------------------------------------------------------------------------------
/Pods/pop/pop/POPAnimatablePropertyTypes.h:
--------------------------------------------------------------------------------
1 | /**
2 | Copyright (c) 2014-present, Facebook, Inc.
3 | All rights reserved.
4 |
5 | This source code is licensed under the BSD-style license found in the
6 | LICENSE file in the root directory of this source tree. An additional grant
7 | of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | typedef void (^POPAnimatablePropertyReadBlock)(id obj, CGFloat values[]);
11 | typedef void (^POPAnimatablePropertyWriteBlock)(id obj, const CGFloat values[]);
12 |
--------------------------------------------------------------------------------
/Pods/pop/pop/POPAnimationEvent.h:
--------------------------------------------------------------------------------
1 | /**
2 | Copyright (c) 2014-present, Facebook, Inc.
3 | All rights reserved.
4 |
5 | This source code is licensed under the BSD-style license found in the
6 | LICENSE file in the root directory of this source tree. An additional grant
7 | of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import
11 |
12 | /**
13 | @abstract Enumeraton of animation event types.
14 | */
15 | typedef NS_ENUM(NSUInteger, POPAnimationEventType) {
16 | kPOPAnimationEventPropertyRead = 0,
17 | kPOPAnimationEventPropertyWrite,
18 | kPOPAnimationEventToValueUpdate,
19 | kPOPAnimationEventFromValueUpdate,
20 | kPOPAnimationEventVelocityUpdate,
21 | kPOPAnimationEventBouncinessUpdate,
22 | kPOPAnimationEventSpeedUpdate,
23 | kPOPAnimationEventFrictionUpdate,
24 | kPOPAnimationEventMassUpdate,
25 | kPOPAnimationEventTensionUpdate,
26 | kPOPAnimationEventDidStart,
27 | kPOPAnimationEventDidStop,
28 | kPOPAnimationEventDidReachToValue,
29 | kPOPAnimationEventAutoreversed
30 | };
31 |
32 | /**
33 | @abstract The base animation event class.
34 | */
35 | @interface POPAnimationEvent : NSObject
36 |
37 | /**
38 | @abstract The event type. See {@ref POPAnimationEventType} for possible values.
39 | */
40 | @property (readonly, nonatomic, assign) POPAnimationEventType type;
41 |
42 | /**
43 | @abstract The time of event.
44 | */
45 | @property (readonly, nonatomic, assign) CFTimeInterval time;
46 |
47 | /**
48 | @abstract Optional string describing the animation at time of event.
49 | */
50 | @property (readonly, nonatomic, copy) NSString *animationDescription;
51 |
52 | @end
53 |
54 | /**
55 | @abstract An animation event subclass for recording value and velocity.
56 | */
57 | @interface POPAnimationValueEvent : POPAnimationEvent
58 |
59 | /**
60 | @abstract The value recorded.
61 | */
62 | @property (readonly, nonatomic, strong) id value;
63 |
64 | /**
65 | @abstract The velocity recorded, if any.
66 | */
67 | @property (readonly, nonatomic, strong) id velocity;
68 |
69 | @end
70 |
--------------------------------------------------------------------------------
/Pods/pop/pop/POPAnimationEvent.mm:
--------------------------------------------------------------------------------
1 | /**
2 | Copyright (c) 2014-present, Facebook, Inc.
3 | All rights reserved.
4 |
5 | This source code is licensed under the BSD-style license found in the
6 | LICENSE file in the root directory of this source tree. An additional grant
7 | of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import "POPAnimationEvent.h"
11 | #import "POPAnimationEventInternal.h"
12 |
13 | static NSString *stringFromType(POPAnimationEventType aType)
14 | {
15 | switch (aType) {
16 | case kPOPAnimationEventPropertyRead:
17 | return @"read";
18 | case kPOPAnimationEventPropertyWrite:
19 | return @"write";
20 | case kPOPAnimationEventToValueUpdate:
21 | return @"toValue";
22 | case kPOPAnimationEventFromValueUpdate:
23 | return @"fromValue";
24 | case kPOPAnimationEventVelocityUpdate:
25 | return @"velocity";
26 | case kPOPAnimationEventSpeedUpdate:
27 | return @"speed";
28 | case kPOPAnimationEventBouncinessUpdate:
29 | return @"bounciness";
30 | case kPOPAnimationEventFrictionUpdate:
31 | return @"friction";
32 | case kPOPAnimationEventMassUpdate:
33 | return @"mass";
34 | case kPOPAnimationEventTensionUpdate:
35 | return @"tension";
36 | case kPOPAnimationEventDidStart:
37 | return @"didStart";
38 | case kPOPAnimationEventDidStop:
39 | return @"didStop";
40 | case kPOPAnimationEventDidReachToValue:
41 | return @"didReachToValue";
42 | case kPOPAnimationEventAutoreversed:
43 | return @"autoreversed";
44 | default:
45 | return nil;
46 | }
47 | }
48 |
49 | @implementation POPAnimationEvent
50 | @synthesize type = _type;
51 | @synthesize time = _time;
52 | @synthesize animationDescription = _animationDescription;
53 |
54 | - (instancetype)initWithType:(POPAnimationEventType)aType time:(CFTimeInterval)aTime
55 | {
56 | self = [super init];
57 | if (nil != self) {
58 | _type = aType;
59 | _time = aTime;
60 | }
61 | return self;
62 | }
63 |
64 | - (NSString *)description
65 | {
66 | NSMutableString *s = [NSMutableString stringWithFormat:@""];
69 | return s;
70 | }
71 |
72 | // subclass override
73 | - (void)_appendDescription:(NSMutableString *)s
74 | {
75 | if (0 != _animationDescription.length) {
76 | [s appendFormat:@"; animation = %@", _animationDescription];
77 | }
78 | }
79 |
80 | @end
81 |
82 | @implementation POPAnimationValueEvent
83 | @synthesize value = _value;
84 | @synthesize velocity = _velocity;
85 |
86 | - (instancetype)initWithType:(POPAnimationEventType)aType time:(CFTimeInterval)aTime value:(id)aValue
87 | {
88 | self = [self initWithType:aType time:aTime];
89 | if (nil != self) {
90 | _value = aValue;
91 | }
92 | return self;
93 | }
94 |
95 | - (void)_appendDescription:(NSMutableString *)s
96 | {
97 | [super _appendDescription:s];
98 |
99 | if (nil != _value) {
100 | [s appendFormat:@"; value = %@", _value];
101 | }
102 |
103 | if (nil != _velocity) {
104 | [s appendFormat:@"; velocity = %@", _velocity];
105 | }
106 | }
107 |
108 | @end
109 |
--------------------------------------------------------------------------------
/Pods/pop/pop/POPAnimationEventInternal.h:
--------------------------------------------------------------------------------
1 | /**
2 | Copyright (c) 2014-present, Facebook, Inc.
3 | All rights reserved.
4 |
5 | This source code is licensed under the BSD-style license found in the
6 | LICENSE file in the root directory of this source tree. An additional grant
7 | of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import
11 |
12 | #import "POPAnimationEvent.h"
13 |
14 | @interface POPAnimationEvent ()
15 |
16 | /**
17 | @abstract Default initializer.
18 | */
19 | - (instancetype)initWithType:(POPAnimationEventType)type time:(CFTimeInterval)time;
20 |
21 | /**
22 | @abstract Readwrite redefinition of public property.
23 | */
24 | @property (readwrite, nonatomic, copy) NSString *animationDescription;
25 |
26 | @end
27 |
28 | @interface POPAnimationValueEvent ()
29 |
30 | /**
31 | @abstract Default initializer.
32 | */
33 | - (instancetype)initWithType:(POPAnimationEventType)type time:(CFTimeInterval)time value:(id)value;
34 |
35 | /**
36 | @abstract Readwrite redefinition of public property.
37 | */
38 | @property (readwrite, nonatomic, strong) id velocity;
39 |
40 | @end
41 |
42 |
--------------------------------------------------------------------------------
/Pods/pop/pop/POPAnimationExtras.h:
--------------------------------------------------------------------------------
1 | /**
2 | Copyright (c) 2014-present, Facebook, Inc.
3 | All rights reserved.
4 |
5 | This source code is licensed under the BSD-style license found in the
6 | LICENSE file in the root directory of this source tree. An additional grant
7 | of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import
11 |
12 | #import
13 | #import
14 |
15 | /**
16 | @abstract The current drag coefficient.
17 | @discussion A value greater than 1.0 indicates Simulator slow-motion animations are enabled. Defaults to 1.0.
18 | */
19 | extern CGFloat POPAnimationDragCoefficient();
20 |
21 | @interface CAAnimation (POPAnimationExtras)
22 |
23 | /**
24 | @abstract Apply the current drag coefficient to animation speed.
25 | @discussion Convenience utility to respect Simulator slow-motion animation settings.
26 | */
27 | - (void)pop_applyDragCoefficient;
28 |
29 | @end
30 |
31 | @interface POPSpringAnimation (POPAnimationExtras)
32 |
33 | /**
34 | @abstract Converts from spring bounciness and speed to tension, friction and mass dynamics values.
35 | */
36 | + (void)convertBounciness:(CGFloat)bounciness speed:(CGFloat)speed toTension:(CGFloat *)outTension friction:(CGFloat *)outFriction mass:(CGFloat *)outMass;
37 |
38 | /**
39 | @abstract Converts from dynamics tension, friction and mass to spring bounciness and speed values.
40 | */
41 | + (void)convertTension:(CGFloat)tension friction:(CGFloat)friction toBounciness:(CGFloat *)outBounciness speed:(CGFloat *)outSpeed;
42 |
43 | @end
44 |
--------------------------------------------------------------------------------
/Pods/pop/pop/POPAnimationExtras.mm:
--------------------------------------------------------------------------------
1 | /**
2 | Copyright (c) 2014-present, Facebook, Inc.
3 | All rights reserved.
4 |
5 | This source code is licensed under the BSD-style license found in the
6 | LICENSE file in the root directory of this source tree. An additional grant
7 | of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import "POPAnimationExtras.h"
11 | #import "POPAnimationPrivate.h"
12 |
13 | #if TARGET_OS_IPHONE
14 | #import
15 | #endif
16 |
17 | #if TARGET_IPHONE_SIMULATOR
18 | UIKIT_EXTERN float UIAnimationDragCoefficient(); // UIKit private drag coefficient, use judiciously
19 | #endif
20 |
21 | #import "POPMath.h"
22 |
23 | CGFloat POPAnimationDragCoefficient()
24 | {
25 | #if TARGET_IPHONE_SIMULATOR
26 | return UIAnimationDragCoefficient();
27 | #else
28 | return 1.0;
29 | #endif
30 | }
31 |
32 | @implementation CAAnimation (POPAnimationExtras)
33 |
34 | - (void)pop_applyDragCoefficient
35 | {
36 | CGFloat k = POPAnimationDragCoefficient();
37 | if (k != 0 && k != 1)
38 | self.speed = 1 / k;
39 | }
40 |
41 | @end
42 |
43 | @implementation POPSpringAnimation (POPAnimationExtras)
44 |
45 | static const CGFloat POPBouncy3NormalizationRange = 20.0;
46 | static const CGFloat POPBouncy3NormalizationScale = 1.7;
47 | static const CGFloat POPBouncy3BouncinessNormalizedMin = 0.0;
48 | static const CGFloat POPBouncy3BouncinessNormalizedMax = 0.8;
49 | static const CGFloat POPBouncy3SpeedNormalizedMin = 0.5;
50 | static const CGFloat POPBouncy3SpeedNormalizedMax = 200;
51 | static const CGFloat POPBouncy3FrictionInterpolationMax = 0.01;
52 |
53 | + (void)convertBounciness:(CGFloat)bounciness speed:(CGFloat)speed toTension:(CGFloat *)outTension friction:(CGFloat *)outFriction mass:(CGFloat *)outMass
54 | {
55 | double b = POPNormalize(bounciness / POPBouncy3NormalizationScale, 0, POPBouncy3NormalizationRange);
56 | b = POPProjectNormal(b, POPBouncy3BouncinessNormalizedMin, POPBouncy3BouncinessNormalizedMax);
57 |
58 | double s = POPNormalize(speed / POPBouncy3NormalizationScale, 0, POPBouncy3NormalizationRange);
59 |
60 | CGFloat tension = POPProjectNormal(s, POPBouncy3SpeedNormalizedMin, POPBouncy3SpeedNormalizedMax);
61 | CGFloat friction = POPQuadraticOutInterpolation(b, POPBouncy3NoBounce(tension), POPBouncy3FrictionInterpolationMax);
62 |
63 | tension = POP_ANIMATION_TENSION_FOR_QC_TENSION(tension);
64 | friction = POP_ANIMATION_FRICTION_FOR_QC_FRICTION(friction);
65 |
66 | if (outTension) {
67 | *outTension = tension;
68 | }
69 |
70 | if (outFriction) {
71 | *outFriction = friction;
72 | }
73 |
74 | if (outMass) {
75 | *outMass = 1.0;
76 | }
77 | }
78 |
79 | + (void)convertTension:(CGFloat)tension friction:(CGFloat)friction toBounciness:(CGFloat *)outBounciness speed:(CGFloat *)outSpeed
80 | {
81 | // Convert to QC values, in which our calculations are done.
82 | CGFloat qcFriction = QC_FRICTION_FOR_POP_ANIMATION_FRICTION(friction);
83 | CGFloat qcTension = QC_TENSION_FOR_POP_ANIMATION_TENSION(tension);
84 |
85 | // Friction is a function of bounciness and tension, according to the following:
86 | // friction = POPQuadraticOutInterpolation(b, POPBouncy3NoBounce(tension), POPBouncy3FrictionInterpolationMax);
87 | // Solve for bounciness, given a tension and friction.
88 |
89 | CGFloat nobounceTension = POPBouncy3NoBounce(qcTension);
90 | CGFloat bounciness1, bounciness2;
91 |
92 | POPQuadraticSolve((nobounceTension - POPBouncy3FrictionInterpolationMax), // a
93 | 2 * (POPBouncy3FrictionInterpolationMax - nobounceTension), // b
94 | (nobounceTension - qcFriction), // c
95 | bounciness1, // x1
96 | bounciness2); // x2
97 |
98 |
99 | // Choose the quadratic solution within the normalized bounciness range
100 | CGFloat projectedNormalizedBounciness = (bounciness2 < POPBouncy3BouncinessNormalizedMax) ? bounciness2 : bounciness1;
101 | CGFloat projectedNormalizedSpeed = qcTension;
102 |
103 | // Reverse projection + normalization
104 | CGFloat bounciness = ((POPBouncy3NormalizationRange * POPBouncy3NormalizationScale) / (POPBouncy3BouncinessNormalizedMax - POPBouncy3BouncinessNormalizedMin)) * (projectedNormalizedBounciness - POPBouncy3BouncinessNormalizedMin);
105 | CGFloat speed = ((POPBouncy3NormalizationRange * POPBouncy3NormalizationScale) / (POPBouncy3SpeedNormalizedMax - POPBouncy3SpeedNormalizedMin)) * (projectedNormalizedSpeed - POPBouncy3SpeedNormalizedMin);
106 |
107 | // Write back results
108 | if (outBounciness) {
109 | *outBounciness = bounciness;
110 | }
111 |
112 | if (outSpeed) {
113 | *outSpeed = speed;
114 | }
115 | }
116 |
117 | @end
118 |
--------------------------------------------------------------------------------
/Pods/pop/pop/POPAnimationPrivate.h:
--------------------------------------------------------------------------------
1 | /**
2 | Copyright (c) 2014-present, Facebook, Inc.
3 | All rights reserved.
4 |
5 | This source code is licensed under the BSD-style license found in the
6 | LICENSE file in the root directory of this source tree. An additional grant
7 | of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import
11 |
12 | #define POP_ANIMATION_FRICTION_FOR_QC_FRICTION(qcFriction) (25.0 + (((qcFriction - 8.0) / 2.0) * (25.0 - 19.0)))
13 | #define POP_ANIMATION_TENSION_FOR_QC_TENSION(qcTension) (194.0 + (((qcTension - 30.0) / 50.0) * (375.0 - 194.0)))
14 |
15 | #define QC_FRICTION_FOR_POP_ANIMATION_FRICTION(fbFriction) (8.0 + 2.0 * ((fbFriction - 25.0)/(25.0 - 19.0)))
16 | #define QC_TENSION_FOR_POP_ANIMATION_TENSION(fbTension) (30.0 + 50.0 * ((fbTension - 194.0)/(375.0 - 194.0)))
17 |
--------------------------------------------------------------------------------
/Pods/pop/pop/POPAnimationRuntime.h:
--------------------------------------------------------------------------------
1 | /**
2 | Copyright (c) 2014-present, Facebook, Inc.
3 | All rights reserved.
4 |
5 | This source code is licensed under the BSD-style license found in the
6 | LICENSE file in the root directory of this source tree. An additional grant
7 | of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import
11 |
12 | #import
13 | #import
14 |
15 | #import "POPAnimatablePropertyTypes.h"
16 | #import "POPVector.h"
17 |
18 | enum POPValueType
19 | {
20 | kPOPValueUnknown = 0,
21 | kPOPValueInteger,
22 | kPOPValueFloat,
23 | kPOPValuePoint,
24 | kPOPValueSize,
25 | kPOPValueRect,
26 | kPOPValueEdgeInsets,
27 | kPOPValueAffineTransform,
28 | kPOPValueTransform,
29 | kPOPValueRange,
30 | kPOPValueColor,
31 | kPOPValueSCNVector3,
32 | kPOPValueSCNVector4,
33 | };
34 |
35 | using namespace POP;
36 |
37 | /**
38 | Returns value type based on objc type description, given list of supported value types and length.
39 | */
40 | extern POPValueType POPSelectValueType(const char *objctype, const POPValueType *types, size_t length);
41 |
42 | /**
43 | Returns value type based on objc object, given a list of supported value types and length.
44 | */
45 | extern POPValueType POPSelectValueType(id obj, const POPValueType *types, size_t length);
46 |
47 | /**
48 | Array of all value types.
49 | */
50 | extern const POPValueType kPOPAnimatableAllTypes[12];
51 |
52 | /**
53 | Array of all value types supported for animation.
54 | */
55 | extern const POPValueType kPOPAnimatableSupportTypes[10];
56 |
57 | /**
58 | Returns a string description of a value type.
59 | */
60 | extern NSString *POPValueTypeToString(POPValueType t);
61 |
62 | /**
63 | Returns a mutable dictionary of weak pointer keys to weak pointer values.
64 | */
65 | extern CFMutableDictionaryRef POPDictionaryCreateMutableWeakPointerToWeakPointer(NSUInteger capacity) CF_RETURNS_RETAINED;
66 |
67 | /**
68 | Returns a mutable dictionary of weak pointer keys to weak pointer values.
69 | */
70 | extern CFMutableDictionaryRef POPDictionaryCreateMutableWeakPointerToStrongObject(NSUInteger capacity) CF_RETURNS_RETAINED;
71 |
72 | /**
73 | Box a vector.
74 | */
75 | extern id POPBox(VectorConstRef vec, POPValueType type, bool force = false);
76 |
77 | /**
78 | Unbox a vector.
79 | */
80 | extern VectorRef POPUnbox(id value, POPValueType &type, NSUInteger &count, bool validate);
81 |
82 | /**
83 | Read object value and return a Vector4r.
84 | */
85 | NS_INLINE Vector4r read_values(POPAnimatablePropertyReadBlock read, id obj, size_t count)
86 | {
87 | Vector4r vec = Vector4r::Zero();
88 | if (0 == count)
89 | return vec;
90 |
91 | read(obj, vec.data());
92 |
93 | return vec;
94 | }
95 |
96 | NS_INLINE NSString *POPStringFromBOOL(BOOL value)
97 | {
98 | return value ? @"YES" : @"NO";
99 | }
100 |
--------------------------------------------------------------------------------
/Pods/pop/pop/POPAnimationTracer.h:
--------------------------------------------------------------------------------
1 | /**
2 | Copyright (c) 2014-present, Facebook, Inc.
3 | All rights reserved.
4 |
5 | This source code is licensed under the BSD-style license found in the
6 | LICENSE file in the root directory of this source tree. An additional grant
7 | of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import
11 |
12 | #import
13 |
14 | @class POPAnimation;
15 |
16 | /**
17 | @abstract Tracer of animation events to facilitate unit testing & debugging.
18 | */
19 | @interface POPAnimationTracer : NSObject
20 |
21 | /**
22 | @abstract Start recording events.
23 | */
24 | - (void)start;
25 |
26 | /**
27 | @abstract Stop recording events.
28 | */
29 | - (void)stop;
30 |
31 | /**
32 | @abstract Resets any recoded events. Continues recording events if already started.
33 | */
34 | - (void)reset;
35 |
36 | /**
37 | @abstract Property representing all recorded events.
38 | @discussion Events are returned in order of occurrence.
39 | */
40 | @property (nonatomic, assign, readonly) NSArray *allEvents;
41 |
42 | /**
43 | @abstract Property representing all recorded write events for convenience.
44 | @discussion Events are returned in order of occurrence.
45 | */
46 | @property (nonatomic, assign, readonly) NSArray *writeEvents;
47 |
48 | /**
49 | @abstract Queries for events of specified type.
50 | @param type The type of event to return.
51 | @returns An array of events of specified type in order of occurrence.
52 | */
53 | - (NSArray *)eventsWithType:(POPAnimationEventType)type;
54 |
55 | /**
56 | @abstract Property indicating whether tracer should automatically log events and reset collection on animation completion.
57 | */
58 | @property (nonatomic, assign) BOOL shouldLogAndResetOnCompletion;
59 |
60 | @end
61 |
--------------------------------------------------------------------------------
/Pods/pop/pop/POPAnimationTracer.mm:
--------------------------------------------------------------------------------
1 | /**
2 | Copyright (c) 2014-present, Facebook, Inc.
3 | All rights reserved.
4 |
5 | This source code is licensed under the BSD-style license found in the
6 | LICENSE file in the root directory of this source tree. An additional grant
7 | of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import "POPAnimationTracer.h"
11 |
12 | #import
13 |
14 | #import "POPAnimationEventInternal.h"
15 | #import "POPAnimationInternal.h"
16 | #import "POPSpringAnimation.h"
17 |
18 | @implementation POPAnimationTracer
19 | {
20 | __weak POPAnimation *_animation;
21 | POPAnimationState *_animationState;
22 | NSMutableArray *_events;
23 | BOOL _animationHasVelocity;
24 | }
25 | @synthesize shouldLogAndResetOnCompletion = _shouldLogAndResetOnCompletion;
26 |
27 | static POPAnimationEvent *create_event(POPAnimationTracer *self, POPAnimationEventType type, id value = nil, bool recordAnimation = false)
28 | {
29 | bool useLocalTime = 0 != self->_animationState->startTime;
30 | CFTimeInterval time = useLocalTime
31 | ? self->_animationState->lastTime - self->_animationState->startTime
32 | : self->_animationState->lastTime;
33 |
34 | POPAnimationEvent *event;
35 | __strong POPAnimation* animation = self->_animation;
36 |
37 | if (!value) {
38 | event = [[POPAnimationEvent alloc] initWithType:type time:time];
39 | } else {
40 | event = [[POPAnimationValueEvent alloc] initWithType:type time:time value:value];
41 | if (self->_animationHasVelocity) {
42 | [(POPAnimationValueEvent *)event setVelocity:[(POPSpringAnimation *)animation velocity]];
43 | }
44 | }
45 |
46 | if (recordAnimation) {
47 | event.animationDescription = [animation description];
48 | }
49 |
50 | return event;
51 | }
52 |
53 | - (id)initWithAnimation:(POPAnimation *)anAnim
54 | {
55 | self = [super init];
56 | if (nil != self) {
57 | _animation = anAnim;
58 | _animationState = POPAnimationGetState(anAnim);
59 | _events = [[NSMutableArray alloc] initWithCapacity:50];
60 | _animationHasVelocity = [anAnim respondsToSelector:@selector(velocity)];
61 | }
62 | return self;
63 | }
64 |
65 | - (void)readPropertyValue:(id)aValue
66 | {
67 | POPAnimationEvent *event = create_event(self, kPOPAnimationEventPropertyRead, aValue);
68 | [_events addObject:event];
69 | }
70 |
71 | - (void)writePropertyValue:(id)aValue
72 | {
73 | POPAnimationEvent *event = create_event(self, kPOPAnimationEventPropertyWrite, aValue);
74 | [_events addObject:event];
75 | }
76 |
77 | - (void)updateToValue:(id)aValue
78 | {
79 | POPAnimationEvent *event = create_event(self, kPOPAnimationEventToValueUpdate, aValue);
80 | [_events addObject:event];
81 | }
82 |
83 | - (void)updateFromValue:(id)aValue
84 | {
85 | POPAnimationEvent *event = create_event(self, kPOPAnimationEventFromValueUpdate, aValue);
86 | [_events addObject:event];
87 | }
88 |
89 | - (void)updateVelocity:(id)aValue
90 | {
91 | POPAnimationEvent *event = create_event(self, kPOPAnimationEventVelocityUpdate, aValue);
92 | [_events addObject:event];
93 | }
94 |
95 | - (void)updateSpeed:(float)aFloat
96 | {
97 | POPAnimationEvent *event = create_event(self, kPOPAnimationEventSpeedUpdate, @(aFloat));
98 | [_events addObject:event];
99 | }
100 |
101 | - (void)updateBounciness:(float)aFloat
102 | {
103 | POPAnimationEvent *event = create_event(self, kPOPAnimationEventBouncinessUpdate, @(aFloat));
104 | [_events addObject:event];
105 | }
106 |
107 | - (void)updateFriction:(float)aFloat
108 | {
109 | POPAnimationEvent *event = create_event(self, kPOPAnimationEventFrictionUpdate, @(aFloat));
110 | [_events addObject:event];
111 | }
112 |
113 | - (void)updateMass:(float)aFloat
114 | {
115 | POPAnimationEvent *event = create_event(self, kPOPAnimationEventMassUpdate, @(aFloat));
116 | [_events addObject:event];
117 | }
118 |
119 | - (void)updateTension:(float)aFloat
120 | {
121 | POPAnimationEvent *event = create_event(self, kPOPAnimationEventTensionUpdate, @(aFloat));
122 | [_events addObject:event];
123 | }
124 |
125 | - (void)didStart
126 | {
127 | POPAnimationEvent *event = create_event(self, kPOPAnimationEventDidStart, nil, true);
128 | [_events addObject:event];
129 | }
130 |
131 | - (void)didStop:(BOOL)finished
132 | {
133 | POPAnimationEvent *event = create_event(self, kPOPAnimationEventDidStop, @(finished), true);
134 | [_events addObject:event];
135 |
136 | if (_shouldLogAndResetOnCompletion) {
137 | NSLog(@"events:%@", self.allEvents);
138 | [self reset];
139 | }
140 | }
141 |
142 | - (void)didReachToValue:(id)aValue
143 | {
144 | POPAnimationEvent *event = create_event(self, kPOPAnimationEventDidReachToValue, aValue);
145 | [_events addObject:event];
146 | }
147 |
148 | - (void)autoreversed
149 | {
150 | POPAnimationEvent *event = create_event(self, kPOPAnimationEventAutoreversed);
151 | [_events addObject:event];
152 | }
153 |
154 | - (void)start
155 | {
156 | POPAnimationState *s = POPAnimationGetState(_animation);
157 | s->tracing = true;
158 | }
159 |
160 | - (void)stop
161 | {
162 | POPAnimationState *s = POPAnimationGetState(_animation);
163 | s->tracing = false;
164 | }
165 |
166 | - (void)reset
167 | {
168 | [_events removeAllObjects];
169 | }
170 |
171 | - (NSArray *)allEvents
172 | {
173 | return [_events copy];
174 | }
175 |
176 | - (NSArray *)writeEvents
177 | {
178 | return [self eventsWithType:kPOPAnimationEventPropertyWrite];
179 | }
180 |
181 | - (NSArray *)eventsWithType:(POPAnimationEventType)aType
182 | {
183 | NSMutableArray *array = [NSMutableArray array];
184 | for (POPAnimationEvent *event in _events) {
185 | if (aType == event.type) {
186 | [array addObject:event];
187 | }
188 | }
189 | return array;
190 | }
191 |
192 | @end
193 |
--------------------------------------------------------------------------------
/Pods/pop/pop/POPAnimationTracerInternal.h:
--------------------------------------------------------------------------------
1 | /**
2 | Copyright (c) 2014-present, Facebook, Inc.
3 | All rights reserved.
4 |
5 | This source code is licensed under the BSD-style license found in the
6 | LICENSE file in the root directory of this source tree. An additional grant
7 | of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import
11 |
12 | #import
13 |
14 | @interface POPAnimationTracer (Internal)
15 |
16 | /**
17 | @abstract Designated initializer. Pass the animation being traced.
18 | */
19 | - (instancetype)initWithAnimation:(POPAnimation *)anAnim;
20 |
21 | /**
22 | @abstract Records read value.
23 | */
24 | - (void)readPropertyValue:(id)aValue;
25 |
26 | /**
27 | @abstract Records write value.
28 | */
29 | - (void)writePropertyValue:(id)aValue;
30 |
31 | /**
32 | Records to value update.
33 | */
34 | - (void)updateToValue:(id)aValue;
35 |
36 | /**
37 | @abstract Records from value update.
38 | */
39 | - (void)updateFromValue:(id)aValue;
40 |
41 | /**
42 | @abstract Records from value update.
43 | */
44 | - (void)updateVelocity:(id)aValue;
45 |
46 | /**
47 | @abstract Records bounciness update.
48 | */
49 | - (void)updateBounciness:(float)aFloat;
50 |
51 | /**
52 | @abstract Records speed update.
53 | */
54 | - (void)updateSpeed:(float)aFloat;
55 |
56 | /**
57 | @abstract Records friction update.
58 | */
59 | - (void)updateFriction:(float)aFloat;
60 |
61 | /**
62 | @abstract Records mass update.
63 | */
64 | - (void)updateMass:(float)aFloat;
65 |
66 | /**
67 | @abstract Records tension update.
68 | */
69 | - (void)updateTension:(float)aFloat;
70 |
71 | /**
72 | @abstract Records did add.
73 | */
74 | - (void)didAdd;
75 |
76 | /**
77 | @abstract Records did start.
78 | */
79 | - (void)didStart;
80 |
81 | /**
82 | @abstract Records did stop.
83 | */
84 | - (void)didStop:(BOOL)finished;
85 |
86 | /**
87 | @abstract Records did reach to value.
88 | */
89 | - (void)didReachToValue:(id)aValue;
90 |
91 | /**
92 | @abstract Records when an autoreverse animation takes place.
93 | */
94 | - (void)autoreversed;
95 |
96 | @end
97 |
--------------------------------------------------------------------------------
/Pods/pop/pop/POPAnimator.h:
--------------------------------------------------------------------------------
1 | /**
2 | Copyright (c) 2014-present, Facebook, Inc.
3 | All rights reserved.
4 |
5 | This source code is licensed under the BSD-style license found in the
6 | LICENSE file in the root directory of this source tree. An additional grant
7 | of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import
11 |
12 | @protocol POPAnimatorDelegate;
13 |
14 | /**
15 | @abstract The animator class renders animations.
16 | */
17 | @interface POPAnimator : NSObject
18 |
19 | /**
20 | @abstract The shared animator instance.
21 | @discussion Consumers should generally use the shared instance in lieu of creating new instances.
22 | */
23 | + (instancetype)sharedAnimator;
24 |
25 | #if !TARGET_OS_IPHONE
26 | /**
27 | @abstract Allows to select display to bind. Returns nil if failed to create the display link.
28 | */
29 | - (instancetype)initWithDisplayID:(CGDirectDisplayID)displayID;
30 | #endif
31 |
32 | /**
33 | @abstract The optional animator delegate.
34 | */
35 | @property (weak, nonatomic) id delegate;
36 |
37 | /**
38 | @abstract Retrieves the nominal refresh period of a display link. Returns zero if unavailable.
39 | */
40 | @property (readonly, nonatomic) CFTimeInterval refreshPeriod;
41 |
42 | @end
43 |
44 | /**
45 | @abstract The animator delegate.
46 | */
47 | @protocol POPAnimatorDelegate
48 |
49 | /**
50 | @abstract Called on each frame before animation application.
51 | */
52 | - (void)animatorWillAnimate:(POPAnimator *)animator;
53 |
54 | /**
55 | @abstract Called on each frame after animation application.
56 | */
57 | - (void)animatorDidAnimate:(POPAnimator *)animator;
58 |
59 | @end
60 |
--------------------------------------------------------------------------------
/Pods/pop/pop/POPAnimatorPrivate.h:
--------------------------------------------------------------------------------
1 | /**
2 | Copyright (c) 2014-present, Facebook, Inc.
3 | All rights reserved.
4 |
5 | This source code is licensed under the BSD-style license found in the
6 | LICENSE file in the root directory of this source tree. An additional grant
7 | of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import
11 |
12 | @class POPAnimation;
13 |
14 | @protocol POPAnimatorObserving
15 | @required
16 |
17 | /**
18 | @abstract Called on each observer after animator has advanced. Core Animation actions are disabled by default.
19 | */
20 | - (void)animatorDidAnimate:(POPAnimator *)animator;
21 |
22 | @end
23 |
24 | @interface POPAnimator ()
25 |
26 | #if !TARGET_OS_IPHONE
27 | /**
28 | Determines whether or not to use a high priority background thread for animation updates. Using a background thread can result in faster, more responsive updates, but may be less compatible. Defaults to YES.
29 | */
30 | + (BOOL)disableBackgroundThread;
31 | + (void)setDisableBackgroundThread:(BOOL)flag;
32 |
33 | /**
34 | Determines the frequency (Hz) of the timer used when no display is available. Defaults to 60Hz.
35 | */
36 | + (uint64_t)displayTimerFrequency;
37 | + (void)setDisplayTimerFrequency:(uint64_t)frequency;
38 | #endif
39 |
40 | /**
41 | Used for externally driven animator instances.
42 | */
43 | @property (assign, nonatomic) BOOL disableDisplayLink;
44 |
45 | /**
46 | Time used when starting animations. Defaults to 0 meaning current media time is used. Exposed for unit testing.
47 | */
48 | @property (assign, nonatomic) CFTimeInterval beginTime;
49 |
50 | /**
51 | Exposed for unit testing.
52 | */
53 | - (void)renderTime:(CFTimeInterval)time;
54 |
55 | /**
56 | Funnel methods for category additions.
57 | */
58 | - (void)addAnimation:(POPAnimation *)anim forObject:(id)obj key:(NSString *)key;
59 | - (void)removeAllAnimationsForObject:(id)obj;
60 | - (void)removeAnimationForObject:(id)obj key:(NSString *)key;
61 | - (NSArray *)animationKeysForObject:(id)obj;
62 | - (POPAnimation *)animationForObject:(id)obj key:(NSString *)key;
63 |
64 | /**
65 | @abstract Add an animator observer. Observer will be notified of each subsequent animator advance until removal.
66 | */
67 | - (void)addObserver:(id)observer;
68 |
69 | /**
70 | @abstract Remove an animator observer.
71 | */
72 | - (void)removeObserver:(id)observer;
73 |
74 | @end
75 |
--------------------------------------------------------------------------------
/Pods/pop/pop/POPBasicAnimation.h:
--------------------------------------------------------------------------------
1 | /**
2 | Copyright (c) 2014-present, Facebook, Inc.
3 | All rights reserved.
4 |
5 | This source code is licensed under the BSD-style license found in the
6 | LICENSE file in the root directory of this source tree. An additional grant
7 | of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import
11 |
12 | /**
13 | @abstract A concrete basic animation class.
14 | @discussion Animation is achieved through interpolation.
15 | */
16 | @interface POPBasicAnimation : POPPropertyAnimation
17 |
18 | /**
19 | @abstract The designated initializer.
20 | @returns An instance of a basic animation.
21 | */
22 | + (instancetype)animation;
23 |
24 | /**
25 | @abstract Convenience initializer that returns an animation with animatable property of name.
26 | @param name The name of the animatable property.
27 | @returns An instance of a basic animation configured with specified animatable property.
28 | */
29 | + (instancetype)animationWithPropertyNamed:(NSString *)name;
30 |
31 | /**
32 | @abstract Convenience constructor.
33 | @returns Returns a basic animation with kCAMediaTimingFunctionDefault timing function.
34 | */
35 | + (instancetype)defaultAnimation;
36 |
37 | /**
38 | @abstract Convenience constructor.
39 | @returns Returns a basic animation with kCAMediaTimingFunctionLinear timing function.
40 | */
41 | + (instancetype)linearAnimation;
42 |
43 | /**
44 | @abstract Convenience constructor.
45 | @returns Returns a basic animation with kCAMediaTimingFunctionEaseIn timing function.
46 | */
47 | + (instancetype)easeInAnimation;
48 |
49 | /**
50 | @abstract Convenience constructor.
51 | @returns Returns a basic animation with kCAMediaTimingFunctionEaseOut timing function.
52 | */
53 | + (instancetype)easeOutAnimation;
54 |
55 | /**
56 | @abstract Convenience constructor.
57 | @returns Returns a basic animation with kCAMediaTimingFunctionEaseInEaseOut timing function.
58 | */
59 | + (instancetype)easeInEaseOutAnimation;
60 |
61 | /**
62 | @abstract The duration in seconds. Defaults to 0.4.
63 | */
64 | @property (assign, nonatomic) CFTimeInterval duration;
65 |
66 | /**
67 | @abstract A timing function defining the pacing of the animation. Defaults to nil indicating pacing according to kCAMediaTimingFunctionDefault.
68 | */
69 | @property (strong, nonatomic) CAMediaTimingFunction *timingFunction;
70 |
71 | @end
72 |
--------------------------------------------------------------------------------
/Pods/pop/pop/POPBasicAnimation.mm:
--------------------------------------------------------------------------------
1 | /**
2 | Copyright (c) 2014-present, Facebook, Inc.
3 | All rights reserved.
4 |
5 | This source code is licensed under the BSD-style license found in the
6 | LICENSE file in the root directory of this source tree. An additional grant
7 | of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import "POPBasicAnimationInternal.h"
11 |
12 | @implementation POPBasicAnimation
13 |
14 | #undef __state
15 | #define __state ((POPBasicAnimationState *)_state)
16 |
17 | #pragma mark - Lifecycle
18 |
19 | + (instancetype)animation
20 | {
21 | return [[self alloc] init];
22 | }
23 |
24 | + (instancetype)animationWithPropertyNamed:(NSString *)aName
25 | {
26 | POPBasicAnimation *anim = [self animation];
27 | anim.property = [POPAnimatableProperty propertyWithName:aName];
28 | return anim;
29 | }
30 |
31 | - (void)_initState
32 | {
33 | _state = new POPBasicAnimationState(self);
34 | }
35 |
36 | + (instancetype)linearAnimation
37 | {
38 | POPBasicAnimation *anim = [self animation];
39 | anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
40 | return anim;
41 | }
42 |
43 | + (instancetype)easeInAnimation
44 | {
45 | POPBasicAnimation *anim = [self animation];
46 | anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
47 | return anim;
48 | }
49 |
50 | + (instancetype)easeOutAnimation
51 | {
52 | POPBasicAnimation *anim = [self animation];
53 | anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
54 | return anim;
55 | }
56 |
57 | + (instancetype)easeInEaseOutAnimation
58 | {
59 | POPBasicAnimation *anim = [self animation];
60 | anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
61 | return anim;
62 | }
63 |
64 | + (instancetype)defaultAnimation
65 | {
66 | POPBasicAnimation *anim = [self animation];
67 | anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault];
68 | return anim;
69 | }
70 |
71 | - (id)init
72 | {
73 | return [self _init];
74 | }
75 |
76 | #pragma mark - Properties
77 |
78 | DEFINE_RW_PROPERTY(POPBasicAnimationState, duration, setDuration:, CFTimeInterval);
79 | DEFINE_RW_PROPERTY_OBJ(POPBasicAnimationState, timingFunction, setTimingFunction:, CAMediaTimingFunction*, __state->updatedTimingFunction(););
80 |
81 | #pragma mark - Utility
82 |
83 | - (void)_appendDescription:(NSMutableString *)s debug:(BOOL)debug
84 | {
85 | [super _appendDescription:s debug:debug];
86 | if (__state->duration)
87 | [s appendFormat:@"; duration = %f", __state->duration];
88 | }
89 |
90 | @end
91 |
92 | @implementation POPBasicAnimation (NSCopying)
93 |
94 | - (instancetype)copyWithZone:(NSZone *)zone {
95 |
96 | POPBasicAnimation *copy = [super copyWithZone:zone];
97 |
98 | if (copy) {
99 | copy.duration = self.duration;
100 | copy.timingFunction = self.timingFunction; // not a 'copy', but timing functions are publicly immutable.
101 | }
102 |
103 | return copy;
104 | }
105 |
106 | @end
--------------------------------------------------------------------------------
/Pods/pop/pop/POPBasicAnimationInternal.h:
--------------------------------------------------------------------------------
1 | /**
2 | Copyright (c) 2014-present, Facebook, Inc.
3 | All rights reserved.
4 |
5 | This source code is licensed under the BSD-style license found in the
6 | LICENSE file in the root directory of this source tree. An additional grant
7 | of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import "POPBasicAnimation.h"
11 |
12 | #import "POPPropertyAnimationInternal.h"
13 |
14 | // default animation duration
15 | static CGFloat const kPOPAnimationDurationDefault = 0.4;
16 |
17 | // progress threshold for computing done
18 | static CGFloat const kPOPProgressThreshold = 1e-6;
19 |
20 | static void interpolate(POPValueType valueType, NSUInteger count, const CGFloat *fromVec, const CGFloat *toVec, CGFloat *outVec, CGFloat p)
21 | {
22 | switch (valueType) {
23 | case kPOPValueInteger:
24 | case kPOPValueFloat:
25 | case kPOPValuePoint:
26 | case kPOPValueSize:
27 | case kPOPValueRect:
28 | case kPOPValueEdgeInsets:
29 | case kPOPValueColor:
30 | POPInterpolateVector(count, outVec, fromVec, toVec, p);
31 | break;
32 | default:
33 | NSCAssert(false, @"unhandled type %d", valueType);
34 | break;
35 | }
36 | }
37 |
38 | struct _POPBasicAnimationState : _POPPropertyAnimationState
39 | {
40 | CAMediaTimingFunction *timingFunction;
41 | double timingControlPoints[4];
42 | CFTimeInterval duration;
43 | CFTimeInterval timeProgress;
44 |
45 | _POPBasicAnimationState(id __unsafe_unretained anim) : _POPPropertyAnimationState(anim),
46 | timingFunction(nil),
47 | timingControlPoints{0.},
48 | duration(kPOPAnimationDurationDefault),
49 | timeProgress(0.)
50 | {
51 | type = kPOPAnimationBasic;
52 | }
53 |
54 | bool isDone() {
55 | if (_POPPropertyAnimationState::isDone()) {
56 | return true;
57 | }
58 | return timeProgress + kPOPProgressThreshold >= 1.;
59 | }
60 |
61 | void updatedTimingFunction()
62 | {
63 | float vec[4] = {0.};
64 | [timingFunction getControlPointAtIndex:1 values:&vec[0]];
65 | [timingFunction getControlPointAtIndex:2 values:&vec[2]];
66 | for (NSUInteger idx = 0; idx < POP_ARRAY_COUNT(vec); idx++) {
67 | timingControlPoints[idx] = vec[idx];
68 | }
69 | }
70 |
71 | bool advance(CFTimeInterval time, CFTimeInterval dt, id obj) {
72 | // default timing function
73 | if (!timingFunction) {
74 | ((POPBasicAnimation *)self).timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault];
75 | }
76 |
77 | // solve for normalized time, aka progress [0, 1]
78 | CGFloat p = 1.0f;
79 | if (duration > 0.0f) {
80 | // cap local time to duration
81 | CFTimeInterval t = MIN(time - startTime, duration) / duration;
82 | p = POPTimingFunctionSolve(timingControlPoints, t, SOLVE_EPS(duration));
83 | timeProgress = t;
84 | } else {
85 | timeProgress = 1.;
86 | }
87 |
88 | // interpolate and advance
89 | interpolate(valueType, valueCount, fromVec->data(), toVec->data(), currentVec->data(), p);
90 | progress = p;
91 | clampCurrentValue();
92 |
93 | return true;
94 | }
95 | };
96 |
97 | typedef struct _POPBasicAnimationState POPBasicAnimationState;
98 |
--------------------------------------------------------------------------------
/Pods/pop/pop/POPCGUtils.h:
--------------------------------------------------------------------------------
1 | /**
2 | Copyright (c) 2014-present, Facebook, Inc.
3 | All rights reserved.
4 |
5 | This source code is licensed under the BSD-style license found in the
6 | LICENSE file in the root directory of this source tree. An additional grant
7 | of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import
11 |
12 | #if TARGET_OS_IPHONE
13 | #import
14 | #else
15 | #import
16 | #endif
17 |
18 | #import "POPDefines.h"
19 |
20 | #if SCENEKIT_SDK_AVAILABLE
21 | #import
22 | #endif
23 |
24 | POP_EXTERN_C_BEGIN
25 |
26 | NS_INLINE CGPoint values_to_point(const CGFloat values[])
27 | {
28 | return CGPointMake(values[0], values[1]);
29 | }
30 |
31 | NS_INLINE CGSize values_to_size(const CGFloat values[])
32 | {
33 | return CGSizeMake(values[0], values[1]);
34 | }
35 |
36 | NS_INLINE CGRect values_to_rect(const CGFloat values[])
37 | {
38 | return CGRectMake(values[0], values[1], values[2], values[3]);
39 | }
40 |
41 | #if SCENEKIT_SDK_AVAILABLE
42 | NS_INLINE SCNVector3 values_to_vec3(const CGFloat values[])
43 | {
44 | return SCNVector3Make(values[0], values[1], values[2]);
45 | }
46 |
47 | NS_INLINE SCNVector4 values_to_vec4(const CGFloat values[])
48 | {
49 | return SCNVector4Make(values[0], values[1], values[2], values[3]);
50 | }
51 | #endif
52 |
53 | #if TARGET_OS_IPHONE
54 |
55 | NS_INLINE UIEdgeInsets values_to_edge_insets(const CGFloat values[])
56 | {
57 | return UIEdgeInsetsMake(values[0], values[1], values[2], values[3]);
58 | }
59 |
60 | #endif
61 |
62 | NS_INLINE void values_from_point(CGFloat values[], CGPoint p)
63 | {
64 | values[0] = p.x;
65 | values[1] = p.y;
66 | }
67 |
68 | NS_INLINE void values_from_size(CGFloat values[], CGSize s)
69 | {
70 | values[0] = s.width;
71 | values[1] = s.height;
72 | }
73 |
74 | NS_INLINE void values_from_rect(CGFloat values[], CGRect r)
75 | {
76 | values[0] = r.origin.x;
77 | values[1] = r.origin.y;
78 | values[2] = r.size.width;
79 | values[3] = r.size.height;
80 | }
81 |
82 | #if SCENEKIT_SDK_AVAILABLE
83 | NS_INLINE void values_from_vec3(CGFloat values[], SCNVector3 v)
84 | {
85 | values[0] = v.x;
86 | values[1] = v.y;
87 | values[2] = v.z;
88 | }
89 |
90 | NS_INLINE void values_from_vec4(CGFloat values[], SCNVector4 v)
91 | {
92 | values[0] = v.x;
93 | values[1] = v.y;
94 | values[2] = v.z;
95 | values[3] = v.w;
96 | }
97 | #endif
98 |
99 | #if TARGET_OS_IPHONE
100 |
101 | NS_INLINE void values_from_edge_insets(CGFloat values[], UIEdgeInsets i)
102 | {
103 | values[0] = i.top;
104 | values[1] = i.left;
105 | values[2] = i.bottom;
106 | values[3] = i.right;
107 | }
108 |
109 | #endif
110 |
111 | /**
112 | Takes a CGColorRef and converts it into RGBA components, if necessary.
113 | */
114 | extern void POPCGColorGetRGBAComponents(CGColorRef color, CGFloat components[]);
115 |
116 | /**
117 | Takes RGBA components and returns a CGColorRef.
118 | */
119 | extern CGColorRef POPCGColorRGBACreate(const CGFloat components[]) CF_RETURNS_RETAINED;
120 |
121 | /**
122 | Takes a color reference and returns a CGColor.
123 | */
124 | extern CGColorRef POPCGColorWithColor(id color) CF_RETURNS_NOT_RETAINED;
125 |
126 | #if TARGET_OS_IPHONE
127 |
128 | /**
129 | Takes a UIColor and converts it into RGBA components, if necessary.
130 | */
131 | extern void POPUIColorGetRGBAComponents(UIColor *color, CGFloat components[]);
132 |
133 | /**
134 | Takes RGBA components and returns a UIColor.
135 | */
136 | extern UIColor *POPUIColorRGBACreate(const CGFloat components[]) NS_RETURNS_RETAINED;
137 |
138 | #else
139 |
140 | /**
141 | Takes a NSColor and converts it into RGBA components, if necessary.
142 | */
143 | extern void POPNSColorGetRGBAComponents(NSColor *color, CGFloat components[]);
144 |
145 | /**
146 | Takes RGBA components and returns a NSColor.
147 | */
148 | extern NSColor *POPNSColorRGBACreate(const CGFloat components[]) NS_RETURNS_RETAINED;
149 |
150 | #endif
151 |
152 | POP_EXTERN_C_END
153 |
--------------------------------------------------------------------------------
/Pods/pop/pop/POPCGUtils.mm:
--------------------------------------------------------------------------------
1 | /**
2 | Copyright (c) 2014-present, Facebook, Inc.
3 | All rights reserved.
4 |
5 | This source code is licensed under the BSD-style license found in the
6 | LICENSE file in the root directory of this source tree. An additional grant
7 | of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import "POPCGUtils.h"
11 |
12 | #import
13 |
14 | void POPCGColorGetRGBAComponents(CGColorRef color, CGFloat components[])
15 | {
16 | if (color) {
17 | const CGFloat *colors = CGColorGetComponents(color);
18 | size_t count = CGColorGetNumberOfComponents(color);
19 |
20 | if (4 == count) {
21 | // RGB colorspace
22 | components[0] = colors[0];
23 | components[1] = colors[1];
24 | components[2] = colors[2];
25 | components[3] = colors[3];
26 | } else if (2 == count) {
27 | // Grey colorspace
28 | components[0] = components[1] = components[2] = colors[0];
29 | components[3] = colors[1];
30 | } else {
31 | // Use CI to convert
32 | CIColor *ciColor = [CIColor colorWithCGColor:color];
33 | components[0] = ciColor.red;
34 | components[1] = ciColor.green;
35 | components[2] = ciColor.blue;
36 | components[3] = ciColor.alpha;
37 | }
38 | } else {
39 | memset(components, 0, 4 * sizeof(components[0]));
40 | }
41 | }
42 |
43 | CGColorRef POPCGColorRGBACreate(const CGFloat components[])
44 | {
45 | #if TARGET_OS_IPHONE
46 | CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
47 | CGColorRef color = CGColorCreate(space, components);
48 | CGColorSpaceRelease(space);
49 | return color;
50 | #else
51 | return CGColorCreateGenericRGB(components[0], components[1], components[2], components[3]);
52 | #endif
53 | }
54 |
55 | CGColorRef POPCGColorWithColor(id color)
56 | {
57 | if (CFGetTypeID((__bridge CFTypeRef)color) == CGColorGetTypeID()) {
58 | return ((__bridge CGColorRef)color);
59 | }
60 | #if TARGET_OS_IPHONE
61 | else if ([color isKindOfClass:[UIColor class]]) {
62 | return [color CGColor];
63 | }
64 | #else
65 | else if ([color isKindOfClass:[NSColor class]]) {
66 | // -[NSColor CGColor] is only supported since OSX 10.8+
67 | if ([color respondsToSelector:@selector(CGColor)]) {
68 | return [color CGColor];
69 | }
70 |
71 | /*
72 | * Otherwise create a CGColorRef manually.
73 | *
74 | * The original accessor is (or would be) declared as:
75 | * @property(readonly) CGColorRef CGColor;
76 | * - (CGColorRef)CGColor NS_RETURNS_INNER_POINTER CF_RETURNS_NOT_RETAINED;
77 | *
78 | * (Please note that OSX' accessor is atomic, while iOS' isn't.)
79 | *
80 | * The access to the NSColor object must thus be synchronized
81 | * and the CGColorRef be stored as an associated object,
82 | * to return a reference which doesn't need to be released manually.
83 | */
84 | @synchronized(color) {
85 | static const void* key = &key;
86 |
87 | CGColorRef colorRef = (__bridge CGColorRef)objc_getAssociatedObject(color, key);
88 |
89 | if (!colorRef) {
90 | size_t numberOfComponents = [(NSColor *)color numberOfComponents];
91 | CGFloat components[numberOfComponents];
92 | CGColorSpaceRef colorSpace = [[(NSColor *)color colorSpace] CGColorSpace];
93 |
94 | [color getComponents:components];
95 |
96 | colorRef = CGColorCreate(colorSpace, components);
97 |
98 | objc_setAssociatedObject(color, key, (__bridge id)colorRef, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
99 | CGColorRelease(colorRef);
100 | }
101 |
102 | return colorRef;
103 | }
104 | }
105 | #endif
106 | return nil;
107 | }
108 |
109 | #if TARGET_OS_IPHONE
110 |
111 | void POPUIColorGetRGBAComponents(UIColor *color, CGFloat components[])
112 | {
113 | return POPCGColorGetRGBAComponents(POPCGColorWithColor(color), components);
114 | }
115 |
116 | UIColor *POPUIColorRGBACreate(const CGFloat components[])
117 | {
118 | CGColorRef colorRef = POPCGColorRGBACreate(components);
119 | UIColor *color = [[UIColor alloc] initWithCGColor:colorRef];
120 | CGColorRelease(colorRef);
121 | return color;
122 | }
123 |
124 | #else
125 |
126 | void POPNSColorGetRGBAComponents(NSColor *color, CGFloat components[])
127 | {
128 | return POPCGColorGetRGBAComponents(POPCGColorWithColor(color), components);
129 | }
130 |
131 | NSColor *POPNSColorRGBACreate(const CGFloat components[])
132 | {
133 | CGColorRef colorRef = POPCGColorRGBACreate(components);
134 | NSColor *color = nil;
135 |
136 | if (colorRef) {
137 | if ([NSColor respondsToSelector:@selector(colorWithCGColor:)]) {
138 | color = [NSColor colorWithCGColor:colorRef];
139 | } else {
140 | color = [NSColor colorWithCIColor:[CIColor colorWithCGColor:colorRef]];
141 | }
142 |
143 | CGColorRelease(colorRef);
144 | }
145 |
146 | return color;
147 | }
148 |
149 | #endif
150 |
151 |
--------------------------------------------------------------------------------
/Pods/pop/pop/POPCustomAnimation.h:
--------------------------------------------------------------------------------
1 | /**
2 | Copyright (c) 2014-present, Facebook, Inc.
3 | All rights reserved.
4 |
5 | This source code is licensed under the BSD-style license found in the
6 | LICENSE file in the root directory of this source tree. An additional grant
7 | of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import
11 |
12 | @class POPCustomAnimation;
13 |
14 | /**
15 | @abstract POPCustomAnimationBlock is the callback block of a custom animation.
16 | @discussion This block will be executed for each animation frame and should update the property or properties being animated based on current timing.
17 | @param target The object being animated. Reference the passed in target to help avoid retain loops.
18 | @param animation The custom animation instance. Use to determine the current and elapsed time since last callback. Reference the passed in animation to help avoid retain loops.
19 | @return Flag indicating whether the animation should continue animating. Return NO to indicate animation is done.
20 | */
21 | typedef BOOL (^POPCustomAnimationBlock)(id target, POPCustomAnimation *animation);
22 |
23 | /**
24 | @abstract POPCustomAnimation is a concrete animation subclass for custom animations.
25 | */
26 | @interface POPCustomAnimation : POPAnimation
27 |
28 | /**
29 | @abstract Creates and returns an initialized custom animation instance.
30 | @discussion This is the designated initializer.
31 | @param block The custom animation callback block. See {@ref POPCustomAnimationBlock}.
32 | @return The initialized custom animation instance.
33 | */
34 | + (instancetype)animationWithBlock:(POPCustomAnimationBlock)block;
35 |
36 | /**
37 | @abstract The current animation time at time of callback.
38 | */
39 | @property (readonly, nonatomic) CFTimeInterval currentTime;
40 |
41 | /**
42 | @abstract The elapsed animation time since last callback.
43 | */
44 | @property (readonly, nonatomic) CFTimeInterval elapsedTime;
45 |
46 | @end
47 |
--------------------------------------------------------------------------------
/Pods/pop/pop/POPCustomAnimation.mm:
--------------------------------------------------------------------------------
1 | /**
2 | Copyright (c) 2014-present, Facebook, Inc.
3 | All rights reserved.
4 |
5 | This source code is licensed under the BSD-style license found in the
6 | LICENSE file in the root directory of this source tree. An additional grant
7 | of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import "POPAnimationInternal.h"
11 |
12 | #import "POPCustomAnimation.h"
13 |
14 | @interface POPCustomAnimation ()
15 | @property (nonatomic, copy) POPCustomAnimationBlock animate;
16 | @end
17 |
18 | @implementation POPCustomAnimation
19 | @synthesize currentTime = _currentTime;
20 | @synthesize elapsedTime = _elapsedTime;
21 | @synthesize animate = _animate;
22 |
23 | + (instancetype)animationWithBlock:(BOOL(^)(id target, POPCustomAnimation *))block
24 | {
25 | POPCustomAnimation *b = [[self alloc] _init];
26 | b.animate = block;
27 | return b;
28 | }
29 |
30 | - (id)_init
31 | {
32 | self = [super _init];
33 | if (nil != self) {
34 | _state->type = kPOPAnimationCustom;
35 | }
36 | return self;
37 | }
38 |
39 | - (CFTimeInterval)beginTime
40 | {
41 | POPAnimationState *s = POPAnimationGetState(self);
42 | return s->startTime > 0 ? s->startTime : s->beginTime;
43 | }
44 |
45 | - (BOOL)_advance:(id)object currentTime:(CFTimeInterval)currentTime elapsedTime:(CFTimeInterval)elapsedTime
46 | {
47 | _currentTime = currentTime;
48 | _elapsedTime = elapsedTime;
49 | return _animate(object, self);
50 | }
51 |
52 | - (void)_appendDescription:(NSMutableString *)s debug:(BOOL)debug
53 | {
54 | [s appendFormat:@"; elapsedTime = %f; currentTime = %f;", _elapsedTime, _currentTime];
55 | }
56 |
57 | @end
58 |
59 | /**
60 | * Note that only the animate block is copied, but not the current/elapsed times
61 | */
62 | @implementation POPCustomAnimation (NSCopying)
63 |
64 | - (instancetype)copyWithZone:(NSZone *)zone {
65 |
66 | POPCustomAnimation *copy = [super copyWithZone:zone];
67 |
68 | if (copy) {
69 | copy.animate = self.animate;
70 | }
71 |
72 | return copy;
73 | }
74 |
75 | @end
--------------------------------------------------------------------------------
/Pods/pop/pop/POPDecayAnimation.h:
--------------------------------------------------------------------------------
1 | /**
2 | Copyright (c) 2014-present, Facebook, Inc.
3 | All rights reserved.
4 |
5 | This source code is licensed under the BSD-style license found in the
6 | LICENSE file in the root directory of this source tree. An additional grant
7 | of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import
11 |
12 | /**
13 | @abstract A concrete decay animation class.
14 | @discussion Animation is achieved through gradual decay of animation value.
15 | */
16 | @interface POPDecayAnimation : POPPropertyAnimation
17 |
18 | /**
19 | @abstract The designated initializer.
20 | @returns An instance of a decay animation.
21 | */
22 | + (instancetype)animation;
23 |
24 | /**
25 | @abstract Convenience initializer that returns an animation with animatable property of name.
26 | @param name The name of the animatable property.
27 | @returns An instance of a decay animation configured with specified animatable property.
28 | */
29 | + (instancetype)animationWithPropertyNamed:(NSString *)name;
30 |
31 | /**
32 | @abstract The current velocity value.
33 | @discussion Set before animation start to account for initial velocity. Expressed in change of value units per second. The only POPValueTypes supported for velocity are: kPOPValuePoint, kPOPValueInteger, kPOPValueFloat, kPOPValueRect, and kPOPValueSize.
34 | */
35 | @property (copy, nonatomic) id velocity;
36 |
37 | /**
38 | @abstract The original velocity value.
39 | @discussion Since the velocity property is modified as the animation progresses, this property stores the original, passed in velocity to support autoreverse and repeatCount.
40 | */
41 | @property (copy, nonatomic, readonly) id originalVelocity;
42 |
43 | /**
44 | @abstract The deceleration factor.
45 | @discussion Values specifies should be in the range [0, 1]. Lower values results in faster deceleration. Defaults to 0.998.
46 | */
47 | @property (assign, nonatomic) CGFloat deceleration;
48 |
49 | /**
50 | @abstract The expected duration.
51 | @discussion Derived based on input velocity and deceleration values.
52 | */
53 | @property (readonly, assign, nonatomic) CFTimeInterval duration;
54 |
55 | /**
56 | The to value is derived based on input velocity and deceleration.
57 | */
58 | - (void)setToValue:(id)toValue NS_UNAVAILABLE;
59 |
60 | /**
61 | @abstract The reversed velocity.
62 | @discussion The reversed velocity based on the originalVelocity when the animation was set up.
63 | */
64 | - (id)reversedVelocity;
65 |
66 | @end
67 |
--------------------------------------------------------------------------------
/Pods/pop/pop/POPDecayAnimation.mm:
--------------------------------------------------------------------------------
1 | /**
2 | Copyright (c) 2014-present, Facebook, Inc.
3 | All rights reserved.
4 |
5 | This source code is licensed under the BSD-style license found in the
6 | LICENSE file in the root directory of this source tree. An additional grant
7 | of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import "POPDecayAnimationInternal.h"
11 |
12 | #if TARGET_OS_IPHONE
13 | #import
14 | #endif
15 |
16 | const POPValueType supportedVelocityTypes[6] = { kPOPValuePoint, kPOPValueInteger, kPOPValueFloat, kPOPValueRect, kPOPValueSize, kPOPValueEdgeInsets };
17 |
18 | @implementation POPDecayAnimation
19 |
20 | #pragma mark - Lifecycle
21 |
22 | #undef __state
23 | #define __state ((POPDecayAnimationState *)_state)
24 |
25 | + (instancetype)animation
26 | {
27 | return [[self alloc] init];
28 | }
29 |
30 | + (instancetype)animationWithPropertyNamed:(NSString *)aName
31 | {
32 | POPDecayAnimation *anim = [self animation];
33 | anim.property = [POPAnimatableProperty propertyWithName:aName];
34 | return anim;
35 | }
36 |
37 | - (id)init
38 | {
39 | return [self _init];
40 | }
41 |
42 | - (void)_initState
43 | {
44 | _state = new POPDecayAnimationState(self);
45 | }
46 |
47 | #pragma mark - Properties
48 |
49 | DEFINE_RW_PROPERTY(POPDecayAnimationState, deceleration, setDeceleration:, CGFloat, __state->toVec = NULL;);
50 |
51 | @dynamic velocity;
52 |
53 | - (id)toValue
54 | {
55 | [self _ensureComputedProperties];
56 | return POPBox(__state->toVec, __state->valueType);
57 | }
58 |
59 | - (CFTimeInterval)duration
60 | {
61 | [self _ensureComputedProperties];
62 | return __state->duration;
63 | }
64 |
65 | - (void)setFromValue:(id)fromValue
66 | {
67 | super.fromValue = fromValue;
68 | [self _invalidateComputedProperties];
69 | }
70 |
71 | - (void)setToValue:(id)aValue
72 | {
73 | // no-op
74 | NSLog(@"ignoring to value on decay animation %@", self);
75 | }
76 |
77 | - (id)reversedVelocity
78 | {
79 | id reversedVelocity = nil;
80 |
81 | POPValueType velocityType = POPSelectValueType(self.originalVelocity, supportedVelocityTypes, POP_ARRAY_COUNT(supportedVelocityTypes));
82 | if (velocityType == kPOPValueFloat) {
83 | #if CGFLOAT_IS_DOUBLE
84 | CGFloat originalVelocityFloat = [(NSNumber *)self.originalVelocity doubleValue];
85 | #else
86 | CGFloat originalVelocityFloat = [(NSNumber *)self.originalVelocity floatValue];
87 | #endif
88 | NSNumber *negativeOriginalVelocityNumber = @(-originalVelocityFloat);
89 | reversedVelocity = negativeOriginalVelocityNumber;
90 | } else if (velocityType == kPOPValueInteger) {
91 | NSInteger originalVelocityInteger = [(NSNumber *)self.originalVelocity integerValue];
92 | NSNumber *negativeOriginalVelocityNumber = @(-originalVelocityInteger);
93 | reversedVelocity = negativeOriginalVelocityNumber;
94 | } else if (velocityType == kPOPValuePoint) {
95 | CGPoint originalVelocityPoint = [self.originalVelocity CGPointValue];
96 | CGPoint negativeOriginalVelocityPoint = CGPointMake(-originalVelocityPoint.x, -originalVelocityPoint.y);
97 | reversedVelocity = [NSValue valueWithCGPoint:negativeOriginalVelocityPoint];
98 | } else if (velocityType == kPOPValueRect) {
99 | CGRect originalVelocityRect = [self.originalVelocity CGRectValue];
100 | CGRect negativeOriginalVelocityRect = CGRectMake(-originalVelocityRect.origin.x, -originalVelocityRect.origin.y, -originalVelocityRect.size.width, -originalVelocityRect.size.height);
101 | reversedVelocity = [NSValue valueWithCGRect:negativeOriginalVelocityRect];
102 | } else if (velocityType == kPOPValueSize) {
103 | CGSize originalVelocitySize = [self.originalVelocity CGSizeValue];
104 | CGSize negativeOriginalVelocitySize = CGSizeMake(-originalVelocitySize.width, -originalVelocitySize.height);
105 | reversedVelocity = [NSValue valueWithCGSize:negativeOriginalVelocitySize];
106 | } else if (velocityType == kPOPValueEdgeInsets) {
107 | #if TARGET_OS_IPHONE
108 | UIEdgeInsets originalVelocityInsets = [self.originalVelocity UIEdgeInsetsValue];
109 | UIEdgeInsets negativeOriginalVelocityInsets = UIEdgeInsetsMake(-originalVelocityInsets.top, -originalVelocityInsets.left, -originalVelocityInsets.bottom, -originalVelocityInsets.right);
110 | reversedVelocity = [NSValue valueWithUIEdgeInsets:negativeOriginalVelocityInsets];
111 | #endif
112 | }
113 |
114 | return reversedVelocity;
115 | }
116 |
117 | - (id)originalVelocity
118 | {
119 | return POPBox(__state->originalVelocityVec, __state->valueType);
120 | }
121 |
122 | - (id)velocity
123 | {
124 | return POPBox(__state->velocityVec, __state->valueType);
125 | }
126 |
127 | - (void)setVelocity:(id)aValue
128 | {
129 | POPValueType valueType = POPSelectValueType(aValue, supportedVelocityTypes, POP_ARRAY_COUNT(supportedVelocityTypes));
130 | if (valueType != kPOPValueUnknown) {
131 | VectorRef vec = POPUnbox(aValue, __state->valueType, __state->valueCount, YES);
132 | VectorRef origVec = POPUnbox(aValue, __state->valueType, __state->valueCount, YES);
133 |
134 | if (!vec_equal(vec, __state->velocityVec)) {
135 | __state->velocityVec = vec;
136 | __state->originalVelocityVec = origVec;
137 |
138 | if (__state->tracing) {
139 | [__state->tracer updateVelocity:aValue];
140 | }
141 |
142 | [self _invalidateComputedProperties];
143 |
144 | // automatically unpause active animations
145 | if (__state->active && __state->paused) {
146 | __state->fromVec = NULL;
147 | __state->setPaused(false);
148 | }
149 | }
150 | } else {
151 | __state->velocityVec = NULL;
152 | NSLog(@"Invalid velocity value for the decayAnimation: %@", aValue);
153 | }
154 | }
155 |
156 | #pragma mark - Utility
157 |
158 | - (void)_ensureComputedProperties
159 | {
160 | if (NULL == __state->toVec) {
161 | __state->computeDuration();
162 | __state->computeToValue();
163 | }
164 | }
165 |
166 | - (void)_invalidateComputedProperties
167 | {
168 | __state->toVec = NULL;
169 | __state->duration = 0;
170 | }
171 |
172 | - (void)_appendDescription:(NSMutableString *)s debug:(BOOL)debug
173 | {
174 | [super _appendDescription:s debug:debug];
175 |
176 | if (0 != self.duration) {
177 | [s appendFormat:@"; duration = %f", self.duration];
178 | }
179 |
180 | if (__state->deceleration) {
181 | [s appendFormat:@"; deceleration = %f", __state->deceleration];
182 | }
183 | }
184 |
185 | @end
186 |
187 | @implementation POPDecayAnimation (NSCopying)
188 |
189 | - (instancetype)copyWithZone:(NSZone *)zone {
190 |
191 | POPDecayAnimation *copy = [super copyWithZone:zone];
192 |
193 | if (copy) {
194 | // Set the velocity to the animation's original velocity, not its current.
195 | copy.velocity = self.originalVelocity;
196 | copy.deceleration = self.deceleration;
197 |
198 | }
199 |
200 | return copy;
201 | }
202 |
203 | @end
--------------------------------------------------------------------------------
/Pods/pop/pop/POPDecayAnimationInternal.h:
--------------------------------------------------------------------------------
1 | /**
2 | Copyright (c) 2014-present, Facebook, Inc.
3 | All rights reserved.
4 |
5 | This source code is licensed under the BSD-style license found in the
6 | LICENSE file in the root directory of this source tree. An additional grant
7 | of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import "POPDecayAnimation.h"
11 |
12 | #import
13 |
14 | #import "POPPropertyAnimationInternal.h"
15 |
16 | // minimal velocity factor before decay animation is considered complete, in units / s
17 | static CGFloat kPOPAnimationDecayMinimalVelocityFactor = 5.;
18 |
19 | // default decay animation deceleration
20 | static CGFloat kPOPAnimationDecayDecelerationDefault = 0.998;
21 |
22 | static void decay_position(CGFloat *x, CGFloat *v, NSUInteger count, CFTimeInterval dt, CGFloat deceleration)
23 | {
24 | dt *= 1000;
25 |
26 | // v0 = v / 1000
27 | // v = v0 * powf(deceleration, dt);
28 | // v = v * 1000;
29 |
30 | // x0 = x;
31 | // x = x0 + v0 * deceleration * (1 - powf(deceleration, dt)) / (1 - deceleration)
32 | float v0[count];
33 | float kv = powf(deceleration, dt);
34 | float kx = deceleration * (1 - kv) / (1 - deceleration);
35 |
36 | for (NSUInteger idx = 0; idx < count; idx++) {
37 | v0[idx] = v[idx] / 1000.;
38 | v[idx] = v0[idx] * kv * 1000.;
39 | x[idx] = x[idx] + v0[idx] * kx;
40 | }
41 | }
42 |
43 | struct _POPDecayAnimationState : _POPPropertyAnimationState
44 | {
45 | double deceleration;
46 | CFTimeInterval duration;
47 |
48 | _POPDecayAnimationState(id __unsafe_unretained anim) :
49 | _POPPropertyAnimationState(anim),
50 | deceleration(kPOPAnimationDecayDecelerationDefault),
51 | duration(0)
52 | {
53 | type = kPOPAnimationDecay;
54 | }
55 |
56 | bool isDone() {
57 | if (_POPPropertyAnimationState::isDone()) {
58 | return true;
59 | }
60 |
61 | CGFloat f = dynamicsThreshold * kPOPAnimationDecayMinimalVelocityFactor;
62 | const CGFloat *velocityValues = vec_data(velocityVec);
63 | for (NSUInteger idx = 0; idx < valueCount; idx++) {
64 | if (std::abs((velocityValues[idx])) >= f)
65 | return false;
66 | }
67 | return true;
68 |
69 | }
70 |
71 | void computeDuration() {
72 |
73 | // compute duration till threshold velocity
74 | Vector4r scaledVelocity = vector4(velocityVec) / 1000.;
75 |
76 | double k = dynamicsThreshold * kPOPAnimationDecayMinimalVelocityFactor / 1000.;
77 | double vx = k / scaledVelocity.x;
78 | double vy = k / scaledVelocity.y;
79 | double vz = k / scaledVelocity.z;
80 | double vw = k / scaledVelocity.w;
81 | double d = log(deceleration) * 1000.;
82 | duration = MAX(MAX(MAX(log(fabs(vx)) / d, log(fabs(vy)) / d), log(fabs(vz)) / d), log(fabs(vw)) / d);
83 |
84 | // ensure velocity threshold is exceeded
85 | if (std::isnan(duration) || duration < 0) {
86 | duration = 0;
87 | }
88 | }
89 |
90 | void computeToValue() {
91 | // to value assuming final velocity as a factor of dynamics threshold
92 | // derived from v' = v * d^dt used in decay_position
93 | // to compute the to value with maximal dt, p' = p + (v * d) / (1 - d)
94 | VectorRef fromValue = NULL != currentVec ? currentVec : fromVec;
95 | if (!fromValue) {
96 | return;
97 | }
98 |
99 | // ensure duration is computed
100 | if (0 == duration) {
101 | computeDuration();
102 | }
103 |
104 | // compute to value
105 | VectorRef toValue(Vector::new_vector(fromValue.get()));
106 | Vector4r velocity = velocityVec->vector4r();
107 | decay_position(toValue->data(), velocity.data(), valueCount, duration, deceleration);
108 | toVec = toValue;
109 | }
110 |
111 | bool advance(CFTimeInterval time, CFTimeInterval dt, id obj) {
112 | // advance past not yet initialized animations
113 | if (NULL == currentVec) {
114 | return false;
115 | }
116 |
117 | decay_position(currentVec->data(), velocityVec->data(), valueCount, dt, deceleration);
118 |
119 | // clamp to compute end value; avoid possibility of decaying past
120 | clampCurrentValue(kPOPAnimationClampEnd | clampMode);
121 |
122 | return true;
123 | }
124 |
125 | };
126 |
127 | typedef struct _POPDecayAnimationState POPDecayAnimationState;
128 |
--------------------------------------------------------------------------------
/Pods/pop/pop/POPDefines.h:
--------------------------------------------------------------------------------
1 | /**
2 | Copyright (c) 2014-present, Facebook, Inc.
3 | All rights reserved.
4 |
5 | This source code is licensed under the BSD-style license found in the
6 | LICENSE file in the root directory of this source tree. An additional grant
7 | of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #ifndef POP_POPDefines_h
11 | #define POP_POPDefines_h
12 |
13 | #import
14 |
15 | #ifdef __cplusplus
16 | # define POP_EXTERN_C_BEGIN extern "C" {
17 | # define POP_EXTERN_C_END }
18 | #else
19 | # define POP_EXTERN_C_BEGIN
20 | # define POP_EXTERN_C_END
21 | #endif
22 |
23 | #define POP_ARRAY_COUNT(x) sizeof(x) / sizeof(x[0])
24 |
25 | #if defined (__cplusplus) && defined (__GNUC__)
26 | # define POP_NOTHROW __attribute__ ((nothrow))
27 | #else
28 | # define POP_NOTHROW
29 | #endif
30 |
31 | #if defined(POP_USE_SCENEKIT)
32 | # if TARGET_OS_MAC || TARGET_OS_IPHONE
33 | # define SCENEKIT_SDK_AVAILABLE 1
34 | # endif
35 | #endif
36 |
37 | #endif
38 |
--------------------------------------------------------------------------------
/Pods/pop/pop/POPGeometry.h:
--------------------------------------------------------------------------------
1 | /**
2 | Copyright (c) 2014-present, Facebook, Inc.
3 | All rights reserved.
4 |
5 | This source code is licensed under the BSD-style license found in the
6 | LICENSE file in the root directory of this source tree. An additional grant
7 | of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import
11 |
12 | #if TARGET_OS_IPHONE
13 | #import
14 | #endif
15 |
16 | #if !TARGET_OS_IPHONE
17 |
18 | /** NSValue extensions to support animatable types. */
19 | @interface NSValue (POP)
20 |
21 | /**
22 | @abstract Creates an NSValue given a CGPoint.
23 | */
24 | + (NSValue *)valueWithCGPoint:(CGPoint)point;
25 |
26 | /**
27 | @abstract Creates an NSValue given a CGSize.
28 | */
29 | + (NSValue *)valueWithCGSize:(CGSize)size;
30 |
31 | /**
32 | @abstract Creates an NSValue given a CGRect.
33 | */
34 | + (NSValue *)valueWithCGRect:(CGRect)rect;
35 |
36 | /**
37 | @abstract Creates an NSValue given a CFRange.
38 | */
39 | + (NSValue *)valueWithCFRange:(CFRange)range;
40 |
41 | /**
42 | @abstract Creates an NSValue given a CGAffineTransform.
43 | */
44 | + (NSValue *)valueWithCGAffineTransform:(CGAffineTransform)transform;
45 |
46 | /**
47 | @abstract Returns the underlying CGPoint value.
48 | */
49 | - (CGPoint)CGPointValue;
50 |
51 | /**
52 | @abstract Returns the underlying CGSize value.
53 | */
54 | - (CGSize)CGSizeValue;
55 |
56 | /**
57 | @abstract Returns the underlying CGRect value.
58 | */
59 | - (CGRect)CGRectValue;
60 |
61 | /**
62 | @abstract Returns the underlying CFRange value.
63 | */
64 | - (CFRange)CFRangeValue;
65 |
66 | /**
67 | @abstract Returns the underlying CGAffineTransform value.
68 | */
69 | - (CGAffineTransform)CGAffineTransformValue;
70 |
71 | @end
72 |
73 | #endif
74 |
--------------------------------------------------------------------------------
/Pods/pop/pop/POPGeometry.mm:
--------------------------------------------------------------------------------
1 | /**
2 | Copyright (c) 2014-present, Facebook, Inc.
3 | All rights reserved.
4 |
5 | This source code is licensed under the BSD-style license found in the
6 | LICENSE file in the root directory of this source tree. An additional grant
7 | of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import "POPGeometry.h"
11 |
12 | #if !TARGET_OS_IPHONE
13 | @implementation NSValue (POP)
14 |
15 | + (NSValue *)valueWithCGPoint:(CGPoint)point {
16 | return [NSValue valueWithBytes:&point objCType:@encode(CGPoint)];
17 | }
18 |
19 | + (NSValue *)valueWithCGSize:(CGSize)size {
20 | return [NSValue valueWithBytes:&size objCType:@encode(CGSize)];
21 | }
22 |
23 | + (NSValue *)valueWithCGRect:(CGRect)rect {
24 | return [NSValue valueWithBytes:&rect objCType:@encode(CGRect)];
25 | }
26 |
27 | + (NSValue *)valueWithCFRange:(CFRange)range {
28 | return [NSValue valueWithBytes:&range objCType:@encode(CFRange)];
29 | }
30 |
31 | + (NSValue *)valueWithCGAffineTransform:(CGAffineTransform)transform
32 | {
33 | return [NSValue valueWithBytes:&transform objCType:@encode(CGAffineTransform)];
34 | }
35 |
36 | - (CGPoint)CGPointValue {
37 | CGPoint result;
38 | [self getValue:&result];
39 | return result;
40 | }
41 |
42 | - (CGSize)CGSizeValue {
43 | CGSize result;
44 | [self getValue:&result];
45 | return result;
46 | }
47 |
48 | - (CGRect)CGRectValue {
49 | CGRect result;
50 | [self getValue:&result];
51 | return result;
52 | }
53 |
54 | - (CFRange)CFRangeValue {
55 | CFRange result;
56 | [self getValue:&result];
57 | return result;
58 | }
59 |
60 | - (CGAffineTransform)CGAffineTransformValue {
61 | CGAffineTransform result;
62 | [self getValue:&result];
63 | return result;
64 | }
65 | @end
66 |
67 | #endif
68 |
69 | #if TARGET_OS_IPHONE
70 | #import "POPDefines.h"
71 |
72 | #if SCENEKIT_SDK_AVAILABLE
73 | #import
74 |
75 | /**
76 | Dirty hacks because iOS is weird and decided to define both SCNVector3's and SCNVector4's objCType as "t". However @encode(SCNVector3) and @encode(SCNVector4) both return the proper definition ("{SCNVector3=fff}" and "{SCNVector4=ffff}" respectively)
77 |
78 | [[NSValue valueWithSCNVector3:SCNVector3Make(0.0, 0.0, 0.0)] objcType] returns "t", whereas it should return "{SCNVector3=fff}".
79 |
80 | *flips table*
81 | */
82 | @implementation NSValue (SceneKitFixes)
83 |
84 | + (NSValue *)valueWithSCNVector3:(SCNVector3)vec3 {
85 | return [NSValue valueWithBytes:&vec3 objCType:@encode(SCNVector3)];
86 | }
87 |
88 | + (NSValue *)valueWithSCNVector4:(SCNVector4)vec4 {
89 | return [NSValue valueWithBytes:&vec4 objCType:@encode(SCNVector4)];
90 | }
91 |
92 | @end
93 | #endif
94 | #endif
95 |
--------------------------------------------------------------------------------
/Pods/pop/pop/POPLayerExtras.h:
--------------------------------------------------------------------------------
1 | /**
2 | Copyright (c) 2014-present, Facebook, Inc.
3 | All rights reserved.
4 |
5 | This source code is licensed under the BSD-style license found in the
6 | LICENSE file in the root directory of this source tree. An additional grant
7 | of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import
11 |
12 | #import
13 |
14 | POP_EXTERN_C_BEGIN
15 |
16 | #pragma mark - Scale
17 |
18 | /**
19 | @abstract Returns layer scale factor for the x axis.
20 | */
21 | extern CGFloat POPLayerGetScaleX(CALayer *l);
22 |
23 | /**
24 | @abstract Set layer scale factor for the x axis.
25 | */
26 | extern void POPLayerSetScaleX(CALayer *l, CGFloat f);
27 |
28 | /**
29 | @abstract Returns layer scale factor for the y axis.
30 | */
31 | extern CGFloat POPLayerGetScaleY(CALayer *l);
32 |
33 | /**
34 | @abstract Set layer scale factor for the y axis.
35 | */
36 | extern void POPLayerSetScaleY(CALayer *l, CGFloat f);
37 |
38 | /**
39 | @abstract Returns layer scale factor for the z axis.
40 | */
41 | extern CGFloat POPLayerGetScaleZ(CALayer *l);
42 |
43 | /**
44 | @abstract Set layer scale factor for the z axis.
45 | */
46 | extern void POPLayerSetScaleZ(CALayer *l, CGFloat f);
47 |
48 | /**
49 | @abstract Returns layer scale factors for x and y access as point.
50 | */
51 | extern CGPoint POPLayerGetScaleXY(CALayer *l);
52 |
53 | /**
54 | @abstract Sets layer x and y scale factors given point.
55 | */
56 | extern void POPLayerSetScaleXY(CALayer *l, CGPoint p);
57 |
58 | #pragma mark - Translation
59 |
60 | /**
61 | @abstract Returns layer translation factor for the x axis.
62 | */
63 | extern CGFloat POPLayerGetTranslationX(CALayer *l);
64 |
65 | /**
66 | @abstract Set layer translation factor for the x axis.
67 | */
68 | extern void POPLayerSetTranslationX(CALayer *l, CGFloat f);
69 |
70 | /**
71 | @abstract Returns layer translation factor for the y axis.
72 | */
73 | extern CGFloat POPLayerGetTranslationY(CALayer *l);
74 |
75 | /**
76 | @abstract Set layer translation factor for the y axis.
77 | */
78 | extern void POPLayerSetTranslationY(CALayer *l, CGFloat f);
79 |
80 | /**
81 | @abstract Returns layer translation factor for the z axis.
82 | */
83 | extern CGFloat POPLayerGetTranslationZ(CALayer *l);
84 |
85 | /**
86 | @abstract Set layer translation factor for the z axis.
87 | */
88 | extern void POPLayerSetTranslationZ(CALayer *l, CGFloat f);
89 |
90 | /**
91 | @abstract Returns layer translation factors for x and y access as point.
92 | */
93 | extern CGPoint POPLayerGetTranslationXY(CALayer *l);
94 |
95 | /**
96 | @abstract Sets layer x and y translation factors given point.
97 | */
98 | extern void POPLayerSetTranslationXY(CALayer *l, CGPoint p);
99 |
100 | #pragma mark - Rotation
101 |
102 | /**
103 | @abstract Returns layer rotation, in radians, in the X axis.
104 | */
105 | extern CGFloat POPLayerGetRotationX(CALayer *l);
106 |
107 | /**
108 | @abstract Sets layer rotation, in radians, in the X axis.
109 | */
110 | extern void POPLayerSetRotationX(CALayer *l, CGFloat f);
111 |
112 | /**
113 | @abstract Returns layer rotation, in radians, in the Y axis.
114 | */
115 | extern CGFloat POPLayerGetRotationY(CALayer *l);
116 |
117 | /**
118 | @abstract Sets layer rotation, in radians, in the Y axis.
119 | */
120 | extern void POPLayerSetRotationY(CALayer *l, CGFloat f);
121 |
122 | /**
123 | @abstract Returns layer rotation, in radians, in the Z axis.
124 | */
125 | extern CGFloat POPLayerGetRotationZ(CALayer *l);
126 |
127 | /**
128 | @abstract Sets layer rotation, in radians, in the Z axis.
129 | */
130 | extern void POPLayerSetRotationZ(CALayer *l, CGFloat f);
131 |
132 | /**
133 | @abstract Returns layer rotation, in radians, in the Z axis.
134 | */
135 | extern CGFloat POPLayerGetRotation(CALayer *l);
136 |
137 | /**
138 | @abstract Sets layer rotation, in radians, in the Z axis.
139 | */
140 | extern void POPLayerSetRotation(CALayer *l, CGFloat f);
141 |
142 | #pragma mark - Sublayer Scale
143 |
144 | /**
145 | @abstract Returns sublayer scale factors for x and y access as point.
146 | */
147 | extern CGPoint POPLayerGetSubScaleXY(CALayer *l);
148 |
149 | /**
150 | @abstract Sets sublayer x and y scale factors given point.
151 | */
152 | extern void POPLayerSetSubScaleXY(CALayer *l, CGPoint p);
153 |
154 | #pragma mark - Sublayer Translation
155 |
156 | /**
157 | @abstract Returns sublayer translation factor for the x axis.
158 | */
159 | extern CGFloat POPLayerGetSubTranslationX(CALayer *l);
160 |
161 | /**
162 | @abstract Set sublayer translation factor for the x axis.
163 | */
164 | extern void POPLayerSetSubTranslationX(CALayer *l, CGFloat f);
165 |
166 | /**
167 | @abstract Returns sublayer translation factor for the y axis.
168 | */
169 | extern CGFloat POPLayerGetSubTranslationY(CALayer *l);
170 |
171 | /**
172 | @abstract Set sublayer translation factor for the y axis.
173 | */
174 | extern void POPLayerSetSubTranslationY(CALayer *l, CGFloat f);
175 |
176 | /**
177 | @abstract Returns sublayer translation factor for the z axis.
178 | */
179 | extern CGFloat POPLayerGetSubTranslationZ(CALayer *l);
180 |
181 | /**
182 | @abstract Set sublayer translation factor for the z axis.
183 | */
184 | extern void POPLayerSetSubTranslationZ(CALayer *l, CGFloat f);
185 |
186 | /**
187 | @abstract Returns sublayer translation factors for x and y access as point.
188 | */
189 | extern CGPoint POPLayerGetSubTranslationXY(CALayer *l);
190 |
191 | /**
192 | @abstract Sets sublayer x and y translation factors given point.
193 | */
194 | extern void POPLayerSetSubTranslationXY(CALayer *l, CGPoint p);
195 |
196 | POP_EXTERN_C_END
197 |
--------------------------------------------------------------------------------
/Pods/pop/pop/POPMath.h:
--------------------------------------------------------------------------------
1 | /**
2 | Copyright (c) 2014-present, Facebook, Inc.
3 | All rights reserved.
4 |
5 | This source code is licensed under the BSD-style license found in the
6 | LICENSE file in the root directory of this source tree. An additional grant
7 | of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import
11 |
12 | #import
13 |
14 | #import "POPDefines.h"
15 | #import "POPVector.h"
16 |
17 | NS_INLINE CGFloat sqrtr(CGFloat f)
18 | {
19 | #if CGFLOAT_IS_DOUBLE
20 | return sqrt(f);
21 | #else
22 | return sqrtf(f);
23 | #endif
24 | }
25 |
26 | // round to nearest sub; pass 2.0 to round to every 0.5 (eg: retina pixels)
27 | NS_INLINE CGFloat POPSubRound(CGFloat f, CGFloat sub)
28 | {
29 | return round(f * sub) / sub;
30 | }
31 |
32 | #define MIX(a, b, f) ((a) + (f) * ((b) - (a)))
33 |
34 | // the longer the duration, the higher the necessary precision
35 | #define SOLVE_EPS(dur) (1. / (1000. * (dur)))
36 |
37 | #define _EQLF_(x, y, epsilon) (fabsf ((x) - (y)) < epsilon)
38 |
39 | extern void POPInterpolateVector(NSUInteger count, CGFloat *dst, const CGFloat *from, const CGFloat *to, CGFloat f);
40 |
41 | extern double POPTimingFunctionSolve(const double vec[4], double t, double eps);
42 |
43 | // quadratic mapping of t [0, 1] to [start, end]
44 | extern double POPQuadraticOutInterpolation(double t, double start, double end);
45 |
46 | // normalize value to [0, 1] based on its range [startValue, endValue]
47 | extern double POPNormalize(double value, double startValue, double endValue);
48 |
49 | // project a normalized value [0, 1] to a given range [start, end]
50 | extern double POPProjectNormal(double n, double start, double end);
51 |
52 | // solve a quadratic equation of the form a * x^2 + b * x + c = 0
53 | extern void POPQuadraticSolve(CGFloat a, CGFloat b, CGFloat c, CGFloat &x1, CGFloat &x2);
54 |
55 | // for a given tension return the bouncy 3 friction that produces no bounce
56 | extern double POPBouncy3NoBounce(double tension);
57 |
--------------------------------------------------------------------------------
/Pods/pop/pop/POPMath.mm:
--------------------------------------------------------------------------------
1 | /**
2 | Copyright (c) 2014-present, Facebook, Inc.
3 | All rights reserved.
4 |
5 | This source code is licensed under the BSD-style license found in the
6 | LICENSE file in the root directory of this source tree. An additional grant
7 | of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import "POPMath.h"
11 |
12 | #import "POPAnimationPrivate.h"
13 | #import "UnitBezier.h"
14 |
15 | void POPInterpolateVector(NSUInteger count, CGFloat *dst, const CGFloat *from, const CGFloat *to, CGFloat f)
16 | {
17 | for (NSUInteger idx = 0; idx < count; idx++) {
18 | dst[idx] = MIX(from[idx], to[idx], f);
19 | }
20 | }
21 |
22 | double POPTimingFunctionSolve(const double vec[4], double t, double eps)
23 | {
24 | WebCore::UnitBezier bezier(vec[0], vec[1], vec[2], vec[3]);
25 | return bezier.solve(t, eps);
26 | }
27 |
28 | double POPNormalize(double value, double startValue, double endValue)
29 | {
30 | return (value - startValue) / (endValue - startValue);
31 | }
32 |
33 | double POPProjectNormal(double n, double start, double end)
34 | {
35 | return start + (n * (end - start));
36 | }
37 |
38 | static double linear_interpolation(double t, double start, double end)
39 | {
40 | return t * end + (1.f - t) * start;
41 | }
42 |
43 | double POPQuadraticOutInterpolation(double t, double start, double end)
44 | {
45 | return linear_interpolation(2*t - t*t, start, end);
46 | }
47 |
48 | static double b3_friction1(double x)
49 | {
50 | return (0.0007 * pow(x, 3)) - (0.031 * pow(x, 2)) + 0.64 * x + 1.28;
51 | }
52 |
53 | static double b3_friction2(double x)
54 | {
55 | return (0.000044 * pow(x, 3)) - (0.006 * pow(x, 2)) + 0.36 * x + 2.;
56 | }
57 |
58 | static double b3_friction3(double x)
59 | {
60 | return (0.00000045 * pow(x, 3)) - (0.000332 * pow(x, 2)) + 0.1078 * x + 5.84;
61 | }
62 |
63 | double POPBouncy3NoBounce(double tension)
64 | {
65 | double friction = 0;
66 | if (tension <= 18.) {
67 | friction = b3_friction1(tension);
68 | } else if (tension > 18 && tension <= 44) {
69 | friction = b3_friction2(tension);
70 | } else if (tension > 44) {
71 | friction = b3_friction3(tension);
72 | } else {
73 | assert(false);
74 | }
75 | return friction;
76 | }
77 |
78 | void POPQuadraticSolve(CGFloat a, CGFloat b, CGFloat c, CGFloat &x1, CGFloat &x2)
79 | {
80 | CGFloat discriminant = sqrt(b * b - 4 * a * c);
81 | x1 = (-b + discriminant) / (2 * a);
82 | x2 = (-b - discriminant) / (2 * a);
83 | }
84 |
--------------------------------------------------------------------------------
/Pods/pop/pop/POPPropertyAnimation.h:
--------------------------------------------------------------------------------
1 | /**
2 | Copyright (c) 2014-present, Facebook, Inc.
3 | All rights reserved.
4 |
5 | This source code is licensed under the BSD-style license found in the
6 | LICENSE file in the root directory of this source tree. An additional grant
7 | of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import
11 | #import
12 |
13 | /**
14 | @abstract Flags for clamping animation values.
15 | @discussion Animation values can optionally be clamped to avoid overshoot. kPOPAnimationClampStart ensures values are more than fromValue and kPOPAnimationClampEnd ensures values are less than toValue.
16 | */
17 | typedef NS_OPTIONS(NSUInteger, POPAnimationClampFlags)
18 | {
19 | kPOPAnimationClampNone = 0,
20 | kPOPAnimationClampStart = 1UL << 0,
21 | kPOPAnimationClampEnd = 1UL << 1,
22 | kPOPAnimationClampBoth = kPOPAnimationClampStart | kPOPAnimationClampEnd,
23 | };
24 |
25 | /**
26 | @abstract The semi-concrete property animation subclass.
27 | */
28 | @interface POPPropertyAnimation : POPAnimation
29 |
30 | /**
31 | @abstract The property to animate.
32 | */
33 | @property (strong, nonatomic) POPAnimatableProperty *property;
34 |
35 | /**
36 | @abstract The value to animate from.
37 | @discussion The value type should match the property. If unspecified, the value is initialized to the object's current value on animation start.
38 | */
39 | @property (copy, nonatomic) id fromValue;
40 |
41 | /**
42 | @abstract The value to animate to.
43 | @discussion The value type should match the property. If unspecified, the value is initialized to the object's current value on animation start.
44 | */
45 | @property (copy, nonatomic) id toValue;
46 |
47 | /**
48 | @abstract The rounding factor applied to the current animated value.
49 | @discussion Specify 1.0 to animate between integral values. Defaults to 0 meaning no rounding.
50 | */
51 | @property (assign, nonatomic) CGFloat roundingFactor;
52 |
53 | /**
54 | @abstract The clamp mode applied to the current animated value.
55 | @discussion See {@ref POPAnimationClampFlags} for possible values. Defaults to kPOPAnimationClampNone.
56 | */
57 | @property (assign, nonatomic) NSUInteger clampMode;
58 |
59 | /**
60 | @abstract The flag indicating whether values should be "added" each frame, rather than set.
61 | @discussion Addition may be type dependent. Defaults to NO.
62 | */
63 | @property (assign, nonatomic, getter = isAdditive) BOOL additive;
64 |
65 | @end
66 |
67 | @interface POPPropertyAnimation (CustomProperty)
68 |
69 | + (instancetype)animationWithCustomPropertyNamed:(NSString *)name
70 | readBlock:(POPAnimatablePropertyReadBlock)readBlock
71 | writeBlock:(POPAnimatablePropertyWriteBlock)writeBlock;
72 |
73 | + (instancetype)animationWithCustomPropertyReadBlock:(POPAnimatablePropertyReadBlock)readBlock
74 | writeBlock:(POPAnimatablePropertyWriteBlock)writeBlock;
75 |
76 | @end
77 |
--------------------------------------------------------------------------------
/Pods/pop/pop/POPPropertyAnimation.mm:
--------------------------------------------------------------------------------
1 | /**
2 | Copyright (c) 2014-present, Facebook, Inc.
3 | All rights reserved.
4 |
5 | This source code is licensed under the BSD-style license found in the
6 | LICENSE file in the root directory of this source tree. An additional grant
7 | of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import "POPPropertyAnimationInternal.h"
11 |
12 | @implementation POPPropertyAnimation
13 |
14 | #pragma mark - Lifecycle
15 |
16 | #undef __state
17 | #define __state ((POPPropertyAnimationState *)_state)
18 |
19 | - (void)_initState
20 | {
21 | _state = new POPPropertyAnimationState(self);
22 | }
23 |
24 | #pragma mark - Properties
25 |
26 | DEFINE_RW_FLAG(POPPropertyAnimationState, additive, isAdditive, setAdditive:);
27 | DEFINE_RW_PROPERTY(POPPropertyAnimationState, roundingFactor, setRoundingFactor:, CGFloat);
28 | DEFINE_RW_PROPERTY(POPPropertyAnimationState, clampMode, setClampMode:, NSUInteger);
29 | DEFINE_RW_PROPERTY_OBJ(POPPropertyAnimationState, property, setProperty:, POPAnimatableProperty*, ((POPPropertyAnimationState*)_state)->updatedDynamicsThreshold(););
30 | DEFINE_RW_PROPERTY_OBJ_COPY(POPPropertyAnimationState, progressMarkers, setProgressMarkers:, NSArray*, ((POPPropertyAnimationState*)_state)->updatedProgressMarkers(););
31 |
32 | - (id)fromValue
33 | {
34 | return POPBox(__state->fromVec, __state->valueType);
35 | }
36 |
37 | - (void)setFromValue:(id)aValue
38 | {
39 | POPPropertyAnimationState *s = __state;
40 | VectorRef vec = POPUnbox(aValue, s->valueType, s->valueCount, YES);
41 | if (!vec_equal(vec, s->fromVec)) {
42 | s->fromVec = vec;
43 |
44 | if (s->tracing) {
45 | [s->tracer updateFromValue:aValue];
46 | }
47 | }
48 | }
49 |
50 | - (id)toValue
51 | {
52 | return POPBox(__state->toVec, __state->valueType);
53 | }
54 |
55 | - (void)setToValue:(id)aValue
56 | {
57 | POPPropertyAnimationState *s = __state;
58 | VectorRef vec = POPUnbox(aValue, s->valueType, s->valueCount, YES);
59 |
60 | if (!vec_equal(vec, s->toVec)) {
61 | s->toVec = vec;
62 |
63 | // invalidate to dependent state
64 | s->didReachToValue = false;
65 | s->distanceVec = NULL;
66 |
67 | if (s->tracing) {
68 | [s->tracer updateToValue:aValue];
69 | }
70 |
71 | // automatically unpause active animations
72 | if (s->active && s->paused) {
73 | s->setPaused(false);
74 | }
75 | }
76 | }
77 |
78 | - (id)currentValue
79 | {
80 | return POPBox(__state->currentValue(), __state->valueType);
81 | }
82 |
83 | #pragma mark - Utility
84 |
85 | - (void)_appendDescription:(NSMutableString *)s debug:(BOOL)debug
86 | {
87 | [s appendFormat:@"; from = %@; to = %@", describe(__state->fromVec), describe(__state->toVec)];
88 |
89 | if (_state->active)
90 | [s appendFormat:@"; currentValue = %@", describe(__state->currentValue())];
91 |
92 | if (__state->velocityVec && 0 != __state->velocityVec->norm())
93 | [s appendFormat:@"; velocity = %@", describe(__state->velocityVec)];
94 |
95 | if (!self.removedOnCompletion)
96 | [s appendFormat:@"; removedOnCompletion = %@", POPStringFromBOOL(self.removedOnCompletion)];
97 |
98 | if (__state->progressMarkers)
99 | [s appendFormat:@"; progressMarkers = [%@]", [__state->progressMarkers componentsJoinedByString:@", "]];
100 |
101 | if (_state->active)
102 | [s appendFormat:@"; progress = %f", __state->progress];
103 | }
104 |
105 | @end
106 |
107 | @implementation POPPropertyAnimation (NSCopying)
108 |
109 | - (instancetype)copyWithZone:(NSZone *)zone {
110 |
111 | POPPropertyAnimation *copy = [super copyWithZone:zone];
112 |
113 | if (copy) {
114 | copy.property = [self.property copyWithZone:zone];
115 | copy.fromValue = self.fromValue;
116 | copy.toValue = self.toValue;
117 | copy.roundingFactor = self.roundingFactor;
118 | copy.clampMode = self.clampMode;
119 | copy.additive = self.additive;
120 | }
121 |
122 | return copy;
123 | }
124 |
125 | @end
126 |
127 | @implementation POPPropertyAnimation (CustomProperty)
128 |
129 | + (instancetype)animationWithCustomPropertyNamed:(NSString *)name
130 | readBlock:(POPAnimatablePropertyReadBlock)readBlock
131 | writeBlock:(POPAnimatablePropertyWriteBlock)writeBlock
132 | {
133 | POPPropertyAnimation *animation = [[self alloc] init];
134 | animation.property = [POPAnimatableProperty propertyWithName:name initializer:^(POPMutableAnimatableProperty *prop) {
135 | prop.readBlock = readBlock;
136 | prop.writeBlock = writeBlock;
137 | }];
138 | return animation;
139 | }
140 |
141 | + (instancetype)animationWithCustomPropertyReadBlock:(POPAnimatablePropertyReadBlock)readBlock
142 | writeBlock:(POPAnimatablePropertyWriteBlock)writeBlock
143 | {
144 | return [self animationWithCustomPropertyNamed:[NSUUID UUID].UUIDString
145 | readBlock:readBlock
146 | writeBlock:writeBlock];
147 | }
148 |
149 | @end
150 |
--------------------------------------------------------------------------------
/Pods/pop/pop/POPSpringAnimation.h:
--------------------------------------------------------------------------------
1 | /**
2 | Copyright (c) 2014-present, Facebook, Inc.
3 | All rights reserved.
4 |
5 | This source code is licensed under the BSD-style license found in the
6 | LICENSE file in the root directory of this source tree. An additional grant
7 | of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import
11 |
12 | /**
13 | @abstract A concrete spring animation class.
14 | @discussion Animation is achieved through modeling spring dynamics.
15 | */
16 | @interface POPSpringAnimation : POPPropertyAnimation
17 |
18 | /**
19 | @abstract The designated initializer.
20 | @returns An instance of a spring animation.
21 | */
22 | + (instancetype)animation;
23 |
24 | /**
25 | @abstract Convenience initializer that returns an animation with animatable property of name.
26 | @param name The name of the animatable property.
27 | @returns An instance of a spring animation configured with specified animatable property.
28 | */
29 | + (instancetype)animationWithPropertyNamed:(NSString *)name;
30 |
31 | /**
32 | @abstract The current velocity value.
33 | @discussion Set before animation start to account for initial velocity. Expressed in change of value units per second.
34 | */
35 | @property (copy, nonatomic) id velocity;
36 |
37 | /**
38 | @abstract The effective bounciness.
39 | @discussion Use in conjunction with 'springSpeed' to change animation effect. Values are converted into corresponding dynamics constants. Higher values increase spring movement range resulting in more oscillations and springiness. Defined as a value in the range [0, 20]. Defaults to 4.
40 | */
41 | @property (assign, nonatomic) CGFloat springBounciness;
42 |
43 | /**
44 | @abstract The effective speed.
45 | @discussion Use in conjunction with 'springBounciness' to change animation effect. Values are converted into corresponding dynamics constants. Higher values increase the dampening power of the spring resulting in a faster initial velocity and more rapid bounce slowdown. Defined as a value in the range [0, 20]. Defaults to 12.
46 | */
47 | @property (assign, nonatomic) CGFloat springSpeed;
48 |
49 | /**
50 | @abstract The tension used in the dynamics simulation.
51 | @discussion Can be used over bounciness and speed for finer grain tweaking of animation effect.
52 | */
53 | @property (assign, nonatomic) CGFloat dynamicsTension;
54 |
55 | /**
56 | @abstract The friction used in the dynamics simulation.
57 | @discussion Can be used over bounciness and speed for finer grain tweaking of animation effect.
58 | */
59 | @property (assign, nonatomic) CGFloat dynamicsFriction;
60 |
61 | /**
62 | @abstract The mass used in the dynamics simulation.
63 | @discussion Can be used over bounciness and speed for finer grain tweaking of animation effect.
64 | */
65 | @property (assign, nonatomic) CGFloat dynamicsMass;
66 |
67 | @end
68 |
--------------------------------------------------------------------------------
/Pods/pop/pop/POPSpringAnimation.mm:
--------------------------------------------------------------------------------
1 | /**
2 | Copyright (c) 2014-present, Facebook, Inc.
3 | All rights reserved.
4 |
5 | This source code is licensed under the BSD-style license found in the
6 | LICENSE file in the root directory of this source tree. An additional grant
7 | of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import "POPSpringAnimationInternal.h"
11 |
12 | @implementation POPSpringAnimation
13 |
14 | #pragma mark - Lifecycle
15 |
16 | #undef __state
17 | #define __state ((POPSpringAnimationState *)_state)
18 |
19 | + (instancetype)animation
20 | {
21 | return [[self alloc] init];
22 | }
23 |
24 | + (instancetype)animationWithPropertyNamed:(NSString *)aName
25 | {
26 | POPSpringAnimation *anim = [self animation];
27 | anim.property = [POPAnimatableProperty propertyWithName:aName];
28 | return anim;
29 | }
30 |
31 | - (void)_initState
32 | {
33 | _state = new POPSpringAnimationState(self);
34 | }
35 |
36 | - (id)init
37 | {
38 | self = [super _init];
39 | if (nil != self) {
40 | __state->solver = new SpringSolver4d(1, 1, 1);
41 | __state->updatedDynamicsThreshold();
42 | __state->updatedBouncinessAndSpeed();
43 | }
44 | return self;
45 | }
46 |
47 | - (void)dealloc
48 | {
49 | if (__state) {
50 | delete __state->solver;
51 | __state->solver = NULL;
52 | }
53 | }
54 |
55 | #pragma mark - Properties
56 |
57 | - (id)velocity
58 | {
59 | return POPBox(__state->velocityVec, __state->valueType);
60 | }
61 |
62 | - (void)setVelocity:(id)aValue
63 | {
64 | POPPropertyAnimationState *s = __state;
65 | VectorRef vec = POPUnbox(aValue, s->valueType, s->valueCount, YES);
66 | VectorRef origVec = POPUnbox(aValue, s->valueType, s->valueCount, YES);
67 | if (!vec_equal(vec, s->velocityVec)) {
68 | s->velocityVec = vec;
69 | s->originalVelocityVec = origVec;
70 |
71 | if (s->tracing) {
72 | [s->tracer updateVelocity:aValue];
73 | }
74 | }
75 | }
76 |
77 | DEFINE_RW_PROPERTY(POPSpringAnimationState, dynamicsTension, setDynamicsTension:, CGFloat, [self _updatedDynamicsTension];);
78 | DEFINE_RW_PROPERTY(POPSpringAnimationState, dynamicsFriction, setDynamicsFriction:, CGFloat, [self _updatedDynamicsFriction];);
79 | DEFINE_RW_PROPERTY(POPSpringAnimationState, dynamicsMass, setDynamicsMass:, CGFloat, [self _updatedDynamicsMass];);
80 |
81 | FB_PROPERTY_GET(POPSpringAnimationState, springSpeed, CGFloat);
82 | - (void)setSpringSpeed:(CGFloat)aFloat
83 | {
84 | POPSpringAnimationState *s = __state;
85 | if (s->userSpecifiedDynamics || aFloat != s->springSpeed) {
86 | s->springSpeed = aFloat;
87 | s->userSpecifiedDynamics = false;
88 | s->updatedBouncinessAndSpeed();
89 | if (s->tracing) {
90 | [s->tracer updateSpeed:aFloat];
91 | }
92 | }
93 | }
94 |
95 | FB_PROPERTY_GET(POPSpringAnimationState, springBounciness, CGFloat);
96 | - (void)setSpringBounciness:(CGFloat)aFloat
97 | {
98 | POPSpringAnimationState *s = __state;
99 | if (s->userSpecifiedDynamics || aFloat != s->springBounciness) {
100 | s->springBounciness = aFloat;
101 | s->userSpecifiedDynamics = false;
102 | s->updatedBouncinessAndSpeed();
103 | if (s->tracing) {
104 | [s->tracer updateBounciness:aFloat];
105 | }
106 | }
107 | }
108 |
109 | - (SpringSolver4d *)solver
110 | {
111 | return __state->solver;
112 | }
113 |
114 | - (void)setSolver:(SpringSolver4d *)aSolver
115 | {
116 | if (aSolver != __state->solver) {
117 | if (__state->solver) {
118 | delete(__state->solver);
119 | }
120 | __state->solver = aSolver;
121 | }
122 | }
123 |
124 | #pragma mark - Utility
125 |
126 | - (void)_updatedDynamicsTension
127 | {
128 | __state->userSpecifiedDynamics = true;
129 | if(__state->tracing) {
130 | [__state->tracer updateTension:__state->dynamicsTension];
131 | }
132 | __state->updatedDynamics();
133 | }
134 |
135 | - (void)_updatedDynamicsFriction
136 | {
137 | __state->userSpecifiedDynamics = true;
138 | if(__state->tracing) {
139 | [__state->tracer updateFriction:__state->dynamicsFriction];
140 | }
141 | __state->updatedDynamics();
142 | }
143 |
144 | - (void)_updatedDynamicsMass
145 | {
146 | __state->userSpecifiedDynamics = true;
147 | if(__state->tracing) {
148 | [__state->tracer updateMass:__state->dynamicsMass];
149 | }
150 | __state->updatedDynamics();
151 | }
152 |
153 | - (void)_appendDescription:(NSMutableString *)s debug:(BOOL)debug
154 | {
155 | [super _appendDescription:s debug:debug];
156 |
157 | if (debug) {
158 | if (_state->userSpecifiedDynamics) {
159 | [s appendFormat:@"; dynamics = (tension:%f, friction:%f, mass:%f)", __state->dynamicsTension, __state->dynamicsFriction, __state->dynamicsMass];
160 | } else {
161 | [s appendFormat:@"; bounciness = %f; speed = %f", __state->springBounciness, __state->springSpeed];
162 | }
163 | }
164 | }
165 |
166 | @end
167 |
168 | @implementation POPSpringAnimation (NSCopying)
169 |
170 | - (instancetype)copyWithZone:(NSZone *)zone {
171 |
172 | POPSpringAnimation *copy = [super copyWithZone:zone];
173 |
174 | if (copy) {
175 | id velocity = POPBox(__state->originalVelocityVec, __state->valueType);
176 |
177 | // If velocity never gets set, then POPBox will return nil, messing up __state->valueCount.
178 | if (velocity) {
179 | copy.velocity = velocity;
180 | }
181 |
182 | copy.springBounciness = self.springBounciness;
183 | copy.springSpeed = self.springSpeed;
184 | copy.dynamicsTension = self.dynamicsTension;
185 | copy.dynamicsFriction = self.dynamicsFriction;
186 | copy.dynamicsMass = self.dynamicsMass;
187 | }
188 |
189 | return copy;
190 | }
191 |
192 | @end
--------------------------------------------------------------------------------
/Pods/pop/pop/POPSpringAnimationInternal.h:
--------------------------------------------------------------------------------
1 | /**
2 | Copyright (c) 2014-present, Facebook, Inc.
3 | All rights reserved.
4 |
5 | This source code is licensed under the BSD-style license found in the
6 | LICENSE file in the root directory of this source tree. An additional grant
7 | of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import
11 |
12 | #import "POPAnimationExtras.h"
13 | #import "POPPropertyAnimationInternal.h"
14 |
15 | struct _POPSpringAnimationState : _POPPropertyAnimationState
16 | {
17 | SpringSolver4d *solver;
18 | CGFloat springSpeed;
19 | CGFloat springBounciness; // normalized springiness
20 | CGFloat dynamicsTension; // tension
21 | CGFloat dynamicsFriction; // friction
22 | CGFloat dynamicsMass; // mass
23 |
24 | _POPSpringAnimationState(id __unsafe_unretained anim) : _POPPropertyAnimationState(anim),
25 | solver(nullptr),
26 | springSpeed(12.),
27 | springBounciness(4.),
28 | dynamicsTension(0),
29 | dynamicsFriction(0),
30 | dynamicsMass(0)
31 | {
32 | type = kPOPAnimationSpring;
33 | }
34 |
35 | bool hasConverged()
36 | {
37 | NSUInteger count = valueCount;
38 | if (shouldRound()) {
39 | return vec_equal(previous2Vec, previousVec) && vec_equal(previousVec, toVec);
40 | } else {
41 | if (!previousVec || !previous2Vec)
42 | return false;
43 |
44 | CGFloat t = dynamicsThreshold / 5;
45 |
46 | const CGFloat *toValues = toVec->data();
47 | const CGFloat *previousValues = previousVec->data();
48 | const CGFloat *previous2Values = previous2Vec->data();
49 |
50 | for (NSUInteger idx = 0; idx < count; idx++) {
51 | if ((std::abs(toValues[idx] - previousValues[idx]) >= t) || (std::abs(previous2Values[idx] - previousValues[idx]) >= t)) {
52 | return false;
53 | }
54 | }
55 | return true;
56 | }
57 | }
58 |
59 | bool isDone() {
60 | if (_POPPropertyAnimationState::isDone()) {
61 | return true;
62 | }
63 | return solver->started() && (hasConverged() || solver->hasConverged());
64 | }
65 |
66 | void updatedDynamics()
67 | {
68 | if (NULL != solver) {
69 | solver->setConstants(dynamicsTension, dynamicsFriction, dynamicsMass);
70 | }
71 | }
72 |
73 | void updatedDynamicsThreshold()
74 | {
75 | _POPPropertyAnimationState::updatedDynamicsThreshold();
76 | if (NULL != solver) {
77 | solver->setThreshold(dynamicsThreshold);
78 | }
79 | }
80 |
81 | void updatedBouncinessAndSpeed() {
82 | [POPSpringAnimation convertBounciness:springBounciness speed:springSpeed toTension:&dynamicsTension friction:&dynamicsFriction mass:&dynamicsMass];
83 | updatedDynamics();
84 | }
85 |
86 | bool advance(CFTimeInterval time, CFTimeInterval dt, id obj) {
87 | // advance past not yet initialized animations
88 | if (NULL == currentVec) {
89 | return false;
90 | }
91 |
92 | CFTimeInterval localTime = time - startTime;
93 |
94 | Vector4d value = vector4d(currentVec);
95 | Vector4d toValue = vector4d(toVec);
96 | Vector4d velocity = vector4d(velocityVec);
97 |
98 | SSState4d state;
99 | state.p = toValue - value;
100 |
101 | // the solver assumes a spring of size zero
102 | // flip the velocity from user perspective to solver perspective
103 | state.v = velocity * -1;
104 |
105 | solver->advance(state, localTime, dt);
106 | value = toValue - state.p;
107 |
108 | // flip velocity back to user perspective
109 | velocity = state.v * -1;
110 |
111 | *currentVec = value;
112 |
113 | if (velocityVec) {
114 | *velocityVec = velocity;
115 | }
116 |
117 | clampCurrentValue();
118 |
119 | return true;
120 | }
121 |
122 | virtual void reset(bool all) {
123 | _POPPropertyAnimationState::reset(all);
124 |
125 | if (solver) {
126 | solver->setConstants(dynamicsTension, dynamicsFriction, dynamicsMass);
127 | solver->reset();
128 | }
129 | }
130 | };
131 |
132 | typedef struct _POPSpringAnimationState POPSpringAnimationState;
133 |
--------------------------------------------------------------------------------
/Pods/pop/pop/POPSpringSolver.h:
--------------------------------------------------------------------------------
1 | /**
2 | Copyright (c) 2014-present, Facebook, Inc.
3 | All rights reserved.
4 |
5 | This source code is licensed under the BSD-style license found in the
6 | LICENSE file in the root directory of this source tree. An additional grant
7 | of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import
11 |
12 | #import "POPVector.h"
13 |
14 | namespace POP {
15 |
16 | template
17 | struct SSState
18 | {
19 | T p;
20 | T v;
21 | };
22 |
23 | template
24 | struct SSDerivative
25 | {
26 | T dp;
27 | T dv;
28 | };
29 |
30 | typedef SSState SSState4d;
31 | typedef SSDerivative SSDerivative4d;
32 |
33 | const CFTimeInterval solverDt = 0.001f;
34 | const CFTimeInterval maxSolverDt = 30.0f;
35 |
36 | /**
37 | Templated spring solver class.
38 | */
39 | template
40 | class SpringSolver
41 | {
42 | double _k; // stiffness
43 | double _b; // dampening
44 | double _m; // mass
45 |
46 | double _tp; // threshold
47 | double _tv; // threshold velocity
48 | double _ta; // threshold acceleration
49 |
50 | CFTimeInterval _accumulatedTime;
51 | SSState _lastState;
52 | T _lastDv;
53 | bool _started;
54 |
55 | public:
56 | SpringSolver(double k, double b, double m = 1) : _k(k), _b(b), _m(m), _started(false)
57 | {
58 | _accumulatedTime = 0;
59 | _lastState.p = T::Zero();
60 | _lastState.v = T::Zero();
61 | _lastDv = T::Zero();
62 | setThreshold(1.);
63 | }
64 |
65 | ~SpringSolver()
66 | {
67 | }
68 |
69 | bool started()
70 | {
71 | return _started;
72 | }
73 |
74 | void setConstants(double k, double b, double m)
75 | {
76 | _k = k;
77 | _b = b;
78 | _m = m;
79 | }
80 |
81 | void setThreshold(double t)
82 | {
83 | _tp = t / 2; // half a unit
84 | _tv = 25.0 * t; // 5 units per second, squared for comparison
85 | _ta = 625.0 * t * t; // 5 units per second squared, squared for comparison
86 | }
87 |
88 | T acceleration(const SSState &state, double t)
89 | {
90 | return state.p*(-_k/_m) - state.v*(_b/_m);
91 | }
92 |
93 | SSDerivative evaluate(const SSState &initial, double t)
94 | {
95 | SSDerivative output;
96 | output.dp = initial.v;
97 | output.dv = acceleration(initial, t);
98 | return output;
99 | }
100 |
101 | SSDerivative evaluate(const SSState &initial, double t, double dt, const SSDerivative &d)
102 | {
103 | SSState state;
104 | state.p = initial.p + d.dp*dt;
105 | state.v = initial.v + d.dv*dt;
106 | SSDerivative output;
107 | output.dp = state.v;
108 | output.dv = acceleration(state, t+dt);
109 | return output;
110 | }
111 |
112 | void integrate(SSState &state, double t, double dt)
113 | {
114 | SSDerivative a = evaluate(state, t);
115 | SSDerivative b = evaluate(state, t, dt*0.5, a);
116 | SSDerivative c = evaluate(state, t, dt*0.5, b);
117 | SSDerivative d = evaluate(state, t, dt, c);
118 |
119 | T dpdt = (a.dp + (b.dp + c.dp)*2.0 + d.dp) * (1.0/6.0);
120 | T dvdt = (a.dv + (b.dv + c.dv)*2.0 + d.dv) * (1.0/6.0);
121 |
122 | state.p = state.p + dpdt*dt;
123 | state.v = state.v + dvdt*dt;
124 |
125 | _lastDv = dvdt;
126 | }
127 |
128 | SSState interpolate(const SSState &previous, const SSState ¤t, double alpha)
129 | {
130 | SSState state;
131 | state.p = current.p*alpha + previous.p*(1-alpha);
132 | state.v = current.v*alpha + previous.v*(1-alpha);
133 | return state;
134 | }
135 |
136 | void advance(SSState &state, double t, double dt)
137 | {
138 | _started = true;
139 |
140 | if (dt > maxSolverDt) {
141 | // excessive time step, force shut down
142 | _lastDv = _lastState.v = _lastState.p = T::Zero();
143 | } else {
144 | _accumulatedTime += dt;
145 |
146 | SSState previousState = state, currentState = state;
147 | while (_accumulatedTime >= solverDt) {
148 | previousState = currentState;
149 | this->integrate(currentState, t, solverDt);
150 | t += solverDt;
151 | _accumulatedTime -= solverDt;
152 | }
153 | CFTimeInterval alpha = _accumulatedTime / solverDt;
154 | _lastState = state = this->interpolate(previousState, currentState, alpha);
155 | }
156 | }
157 |
158 | bool hasConverged()
159 | {
160 | if (!_started) {
161 | return false;
162 | }
163 |
164 | for (size_t idx = 0; idx < _lastState.p.size(); idx++) {
165 | if (fabs(_lastState.p(idx)) >= _tp) {
166 | return false;
167 | }
168 | }
169 |
170 | return (_lastState.v.squaredNorm() < _tv) && (_lastDv.squaredNorm() < _ta);
171 | }
172 |
173 | void reset()
174 | {
175 | _accumulatedTime = 0;
176 | _lastState.p = T::Zero();
177 | _lastState.v = T::Zero();
178 | _lastDv = T::Zero();
179 | _started = false;
180 | }
181 | };
182 |
183 | /**
184 | Convenience spring solver type definitions.
185 | */
186 | typedef SpringSolver SpringSolver2d;
187 | typedef SpringSolver SpringSolver3d;
188 | typedef SpringSolver SpringSolver4d;
189 | }
190 |
191 |
--------------------------------------------------------------------------------
/Pods/pop/pop/WebCore/FloatConversion.h:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (C) 2007 Apple Inc. All rights reserved.
3 | *
4 | * Redistribution and use in source and binary forms, with or without
5 | * modification, are permitted provided that the following conditions
6 | * are met:
7 | *
8 | * 1. Redistributions of source code must retain the above copyright
9 | * notice, this list of conditions and the following disclaimer.
10 | * 2. Redistributions in binary form must reproduce the above copyright
11 | * notice, this list of conditions and the following disclaimer in the
12 | * documentation and/or other materials provided with the distribution.
13 | * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14 | * its contributors may be used to endorse or promote products derived
15 | * from this software without specific prior written permission.
16 | *
17 | * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 | * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 | */
28 |
29 | #ifndef FloatConversion_h
30 | #define FloatConversion_h
31 |
32 | #include
33 |
34 | namespace WebCore {
35 |
36 | template
37 | float narrowPrecisionToFloat(T);
38 |
39 | template<>
40 | inline float narrowPrecisionToFloat(double number)
41 | {
42 | return static_cast(number);
43 | }
44 |
45 | template
46 | CGFloat narrowPrecisionToCGFloat(T);
47 |
48 | template<>
49 | inline CGFloat narrowPrecisionToCGFloat(double number)
50 | {
51 | return static_cast(number);
52 | }
53 |
54 | } // namespace WebCore
55 |
56 | #endif // FloatConversion_h
57 |
--------------------------------------------------------------------------------
/Pods/pop/pop/WebCore/UnitBezier.h:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (C) 2008 Apple Inc. All Rights Reserved.
3 | *
4 | * Redistribution and use in source and binary forms, with or without
5 | * modification, are permitted provided that the following conditions
6 | * are met:
7 | * 1. Redistributions of source code must retain the above copyright
8 | * notice, this list of conditions and the following disclaimer.
9 | * 2. Redistributions in binary form must reproduce the above copyright
10 | * notice, this list of conditions and the following disclaimer in the
11 | * documentation and/or other materials provided with the distribution.
12 | *
13 | * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 | * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 | * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 | * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 | * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 | * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 | */
25 |
26 | #ifndef UnitBezier_h
27 | #define UnitBezier_h
28 |
29 | #include
30 |
31 | namespace WebCore {
32 |
33 | struct UnitBezier {
34 | UnitBezier(double p1x, double p1y, double p2x, double p2y)
35 | {
36 | // Calculate the polynomial coefficients, implicit first and last control points are (0,0) and (1,1).
37 | cx = 3.0 * p1x;
38 | bx = 3.0 * (p2x - p1x) - cx;
39 | ax = 1.0 - cx -bx;
40 |
41 | cy = 3.0 * p1y;
42 | by = 3.0 * (p2y - p1y) - cy;
43 | ay = 1.0 - cy - by;
44 | }
45 |
46 | double sampleCurveX(double t)
47 | {
48 | // `ax t^3 + bx t^2 + cx t' expanded using Horner's rule.
49 | return ((ax * t + bx) * t + cx) * t;
50 | }
51 |
52 | double sampleCurveY(double t)
53 | {
54 | return ((ay * t + by) * t + cy) * t;
55 | }
56 |
57 | double sampleCurveDerivativeX(double t)
58 | {
59 | return (3.0 * ax * t + 2.0 * bx) * t + cx;
60 | }
61 |
62 | // Given an x value, find a parametric value it came from.
63 | double solveCurveX(double x, double epsilon)
64 | {
65 | double t0;
66 | double t1;
67 | double t2;
68 | double x2;
69 | double d2;
70 | int i;
71 |
72 | // First try a few iterations of Newton's method -- normally very fast.
73 | for (t2 = x, i = 0; i < 8; i++) {
74 | x2 = sampleCurveX(t2) - x;
75 | if (fabs (x2) < epsilon)
76 | return t2;
77 | d2 = sampleCurveDerivativeX(t2);
78 | if (fabs(d2) < 1e-6)
79 | break;
80 | t2 = t2 - x2 / d2;
81 | }
82 |
83 | // Fall back to the bisection method for reliability.
84 | t0 = 0.0;
85 | t1 = 1.0;
86 | t2 = x;
87 |
88 | if (t2 < t0)
89 | return t0;
90 | if (t2 > t1)
91 | return t1;
92 |
93 | while (t0 < t1) {
94 | x2 = sampleCurveX(t2);
95 | if (fabs(x2 - x) < epsilon)
96 | return t2;
97 | if (x > x2)
98 | t0 = t2;
99 | else
100 | t1 = t2;
101 | t2 = (t1 - t0) * .5 + t0;
102 | }
103 |
104 | // Failure.
105 | return t2;
106 | }
107 |
108 | double solve(double x, double epsilon)
109 | {
110 | return sampleCurveY(solveCurveX(x, epsilon));
111 | }
112 |
113 | private:
114 | double ax;
115 | double bx;
116 | double cx;
117 |
118 | double ay;
119 | double by;
120 | double cy;
121 | };
122 | }
123 | #endif
124 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # KJOverlayTutorial
2 | An convenient way to display tutorial overlay for iOS
3 |
4 | # Release
5 |
6 | ## 1.0.0
7 | + Initial release
8 | + Support Swift 3.x
9 |
10 | ## 2.0.0
11 | + Add animations
12 | + Support Swift 4.x
13 |
14 | # Preview
15 |
16 |
17 | # Usage
18 | ### Text with Icon Tutorial
19 | ```swift
20 | // tut1
21 | let focusRect1 = self.tvTut.frame
22 | let icon1 = UIImage(named: "ico_hand")!
23 | let icon1Frame = CGRect(x: self.view.bounds.width/2-72/2, y: focusRect1.maxY + 12, width: 72, height: 72)
24 | let message1 = "Hello, this is tutorial 1"
25 | let message1Center = CGPoint(x: self.view.bounds.width/2, y: icon1Frame.maxY + 24)
26 | let tut1 = KJTutorial.textWithIconTutorial(focusRectangle: focusRect1, text: message1, textPosition: message1Center, icon: icon1, iconFrame: icon1Frame)
27 |
28 | // tuts
29 | let tutorials = [tut1]
30 | self.tutorialVC.tutorials = tutorials
31 | self.tutorialVC.showInViewController(self)
32 | ```
33 |
34 |
35 | ### Multiple Tutorial
36 | ```swift
37 | // tut1
38 | let focusRect1 = self.imvTut.frame
39 | let message1 = "Hello, this is your avatar"
40 | let message1Center = CGPoint(x: self.view.bounds.width/2, y: focusRect1.maxY + 24)
41 | var tut1 = KJTutorial.textTutorial(focusRectangle: focusRect1, text: message1, textPosition: message1Center)
42 | tut1.isArrowHidden = true
43 |
44 | // tut2
45 | let focusRect2 = self.btnTut1.frame
46 | let icon2 = UIImage(named: "ico_hand1")!
47 | let icon2Frame = CGRect(x: self.view.bounds.width/2-72/2, y: focusRect2.maxY + 12, width: 72, height: 72)
48 | let message2 = "Tap to update your profile"
49 | let message2Center = CGPoint(x: self.view.bounds.width/2, y: icon2Frame.maxY + 24)
50 | let tut2 = KJTutorial.textWithIconTutorial(focusRectangle: focusRect2, text: message2, textPosition: message2Center, icon: icon2, iconFrame: icon2Frame)
51 |
52 | // tut3
53 | let focusRect3 = self.btnTut2.frame
54 | let icon3 = UIImage(named: "ico_hand1")!
55 | let icon3Frame = CGRect(x: self.view.bounds.width/2-72/2, y: focusRect3.maxY + 12, width: 72, height: 72)
56 | let message3 = "Tap to update your payments"
57 | let message3Center = CGPoint(x: self.view.bounds.width/2, y: icon3Frame.maxY + 24)
58 | let tut3 = KJTutorial.textWithIconTutorial(focusRectangle: focusRect3, text: message3, textPosition: message3Center, icon: icon3, iconFrame: icon3Frame)
59 |
60 | // tut4
61 | let focusRect4 = self.btnTut3.frame
62 | let icon4 = UIImage(named: "ico_hand1")!
63 | let icon4Frame = CGRect(x: self.view.bounds.width/2-72/2, y: focusRect4.maxY + 12, width: 72, height: 72)
64 | let message4 = "Tap to edit your settings"
65 | let message4Center = CGPoint(x: self.view.bounds.width/2, y: icon4Frame.maxY + 24)
66 | let tut4 = KJTutorial.textWithIconTutorial(focusRectangle: focusRect4, text: message4, textPosition: message4Center, icon: icon4, iconFrame: icon4Frame)
67 |
68 | // tuts
69 | let tutorials = [tut1, tut2, tut3, tut4]
70 | self.tutorialVC.tutorials = tutorials
71 | self.tutorialVC.showInViewController(self)
72 | ```
73 |
74 |
75 | ### Using SwiftFontIcon
76 |
77 | Check here for correct icon name
78 | http://astronautweb.co/snippet/font-awesome/
79 |
80 | Because FontAwesome provide icon name is not correct:
81 | https://fontawesome.com/icons?d=gallery
82 |
83 | For example: "hand-point-up", actually is "handoup"
84 |
--------------------------------------------------------------------------------
/Resource/ico_hand1@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tranquan/KJOverlayTutorial/63d05313c402aae693b02dc89148fd4750de10c9/Resource/ico_hand1@2x.png
--------------------------------------------------------------------------------
/Resource/ico_hand2@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tranquan/KJOverlayTutorial/63d05313c402aae693b02dc89148fd4750de10c9/Resource/ico_hand2@2x.png
--------------------------------------------------------------------------------
/Resource/ico_hand@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tranquan/KJOverlayTutorial/63d05313c402aae693b02dc89148fd4750de10c9/Resource/ico_hand@2x.png
--------------------------------------------------------------------------------
/Resource/ico_qr@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tranquan/KJOverlayTutorial/63d05313c402aae693b02dc89148fd4750de10c9/Resource/ico_qr@2x.png
--------------------------------------------------------------------------------
/Screenshots/demo.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tranquan/KJOverlayTutorial/63d05313c402aae693b02dc89148fd4750de10c9/Screenshots/demo.gif
--------------------------------------------------------------------------------
/Screenshots/screen1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tranquan/KJOverlayTutorial/63d05313c402aae693b02dc89148fd4750de10c9/Screenshots/screen1.png
--------------------------------------------------------------------------------
/Screenshots/screen2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tranquan/KJOverlayTutorial/63d05313c402aae693b02dc89148fd4750de10c9/Screenshots/screen2.png
--------------------------------------------------------------------------------
/Screenshots/screen3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tranquan/KJOverlayTutorial/63d05313c402aae693b02dc89148fd4750de10c9/Screenshots/screen3.png
--------------------------------------------------------------------------------