├── resource ├── ScrollableImageMask.gif └── LabelNumbersAnimation.gif ├── ScrollableImageMask ├── ScrollableImageMask │ ├── Assets.xcassets │ │ ├── Contents.json │ │ ├── bar.imageset │ │ │ ├── bar.png │ │ │ └── Contents.json │ │ ├── jump-1.imageset │ │ │ ├── jump-1.jpeg │ │ │ └── Contents.json │ │ ├── jump-2.imageset │ │ │ ├── jump-2.jpeg │ │ │ └── Contents.json │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── Info.plist │ ├── ViewController │ │ ├── HomeViewController.swift │ │ └── HomeViewController.xib │ ├── Base.lproj │ │ ├── Main.storyboard │ │ └── LaunchScreen.storyboard │ └── AppDelegate.swift └── ScrollableImageMask.xcodeproj │ ├── project.xcworkspace │ └── contents.xcworkspacedata │ └── project.pbxproj ├── LabelNumbersAnimation ├── LabelNumbersAnimation.xcodeproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ └── project.pbxproj └── LabelNumbersAnimation │ ├── View │ ├── HomeFooterCell.swift │ ├── HomeMainCell.swift │ ├── HomeClearCell.swift │ ├── HomeBuyCell.swift │ ├── AnimationLabel.swift │ ├── HomeFooterCell.xib │ ├── HomeClearCell.xib │ ├── HomeMainCell.xib │ └── HomeBuyCell.xib │ ├── Assets.xcassets │ └── AppIcon.appiconset │ │ └── Contents.json │ ├── Info.plist │ ├── Base.lproj │ ├── Main.storyboard │ └── LaunchScreen.storyboard │ ├── AppDelegate.swift │ └── ViewController │ ├── HomeViewController.xib │ └── HomeViewController.swift ├── README.md └── .gitignore /resource/ScrollableImageMask.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slamdon/Swift-Interesting/HEAD/resource/ScrollableImageMask.gif -------------------------------------------------------------------------------- /resource/LabelNumbersAnimation.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slamdon/Swift-Interesting/HEAD/resource/LabelNumbersAnimation.gif -------------------------------------------------------------------------------- /ScrollableImageMask/ScrollableImageMask/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /ScrollableImageMask/ScrollableImageMask/Assets.xcassets/bar.imageset/bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slamdon/Swift-Interesting/HEAD/ScrollableImageMask/ScrollableImageMask/Assets.xcassets/bar.imageset/bar.png -------------------------------------------------------------------------------- /ScrollableImageMask/ScrollableImageMask/Assets.xcassets/jump-1.imageset/jump-1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slamdon/Swift-Interesting/HEAD/ScrollableImageMask/ScrollableImageMask/Assets.xcassets/jump-1.imageset/jump-1.jpeg -------------------------------------------------------------------------------- /ScrollableImageMask/ScrollableImageMask/Assets.xcassets/jump-2.imageset/jump-2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slamdon/Swift-Interesting/HEAD/ScrollableImageMask/ScrollableImageMask/Assets.xcassets/jump-2.imageset/jump-2.jpeg -------------------------------------------------------------------------------- /ScrollableImageMask/ScrollableImageMask.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /LabelNumbersAnimation/LabelNumbersAnimation.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ScrollableImageMask/ScrollableImageMask/Assets.xcassets/bar.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "bar.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /ScrollableImageMask/ScrollableImageMask/Assets.xcassets/jump-1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "jump-1.jpeg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /ScrollableImageMask/ScrollableImageMask/Assets.xcassets/jump-2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "jump-2.jpeg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /LabelNumbersAnimation/LabelNumbersAnimation/View/HomeFooterCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HomeFooterCell.swift 3 | // LabelNumbersAnimation 4 | // 5 | // Created by don chen on 2017/3/9. 6 | // Copyright © 2017年 Don Chen. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class HomeFooterCell: UITableViewCell { 12 | 13 | override func awakeFromNib() { 14 | super.awakeFromNib() 15 | // Initialization code 16 | } 17 | 18 | override func setSelected(_ selected: Bool, animated: Bool) { 19 | super.setSelected(selected, animated: animated) 20 | 21 | // Configure the view for the selected state 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /LabelNumbersAnimation/LabelNumbersAnimation/View/HomeMainCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HomeMainCell.swift 3 | // LabelNumbersAnimation 4 | // 5 | // Created by don chen on 2017/3/9. 6 | // Copyright © 2017年 Don Chen. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class HomeMainCell: UITableViewCell { 12 | 13 | @IBOutlet var aLabel: AnimationLabel! 14 | override func awakeFromNib() { 15 | super.awakeFromNib() 16 | // Initialization code 17 | } 18 | 19 | override func setSelected(_ selected: Bool, animated: Bool) { 20 | super.setSelected(selected, animated: animated) 21 | 22 | // Configure the view for the selected state 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /LabelNumbersAnimation/LabelNumbersAnimation/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | } 33 | ], 34 | "info" : { 35 | "version" : 1, 36 | "author" : "xcode" 37 | } 38 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Swift Interesting Example 2 | 平時會常常下載各行業的App來試用,發現有趣的內容都會做個紀錄,找機會來實作分享。 3 | 4 | ## 可拖動式遮罩層(Mask) 5 | ![mask](resource/ScrollableImageMask.gif) 6 | 7 | - Blog介紹 - [Swift實現可拖動式遮罩層](https://ios.devdon.com/archives/483) 8 | - [Source Code](https://github.com/slamdon/Swift-Interesting/tree/master/ScrollableImageMask) 9 | 10 | ## UILabel數字動畫 11 | ![UILabel-Animation](resource/LabelNumbersAnimation.gif) 12 | 13 | - Blog介紹 - [Swift實現UILabel數字動畫](https://ios.devdon.com/archives/507) - 14 | - [Source Code](https://github.com/slamdon/Swift-Interesting/tree/master/LabelNumbersAnimation) 15 | 16 | ## 相關內容 17 | - [Swift Transition Example](https://github.com/slamdon/Swift-Transition-Example) - 轉場動畫例子 18 | - [Swift Interesting Example](https://github.com/slamdon/Swift-Interesting) - 有趣的例子 19 | - [Swift Layout Example](https://github.com/slamdon/Swift-Layout-Example) - 佈局例子 -------------------------------------------------------------------------------- /LabelNumbersAnimation/LabelNumbersAnimation/View/HomeClearCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HomeClearCell.swift 3 | // LabelNumbersAnimation 4 | // 5 | // Created by don chen on 2017/3/9. 6 | // Copyright © 2017年 Don Chen. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | protocol HomeClearCellDelegate { 12 | func didTapClear() 13 | } 14 | 15 | class HomeClearCell: UITableViewCell { 16 | 17 | @IBOutlet var clearButton: UIButton! 18 | 19 | var delegate:HomeClearCellDelegate? 20 | 21 | override func awakeFromNib() { 22 | super.awakeFromNib() 23 | clearButton.layer.cornerRadius = 17.5 24 | } 25 | 26 | override func setSelected(_ selected: Bool, animated: Bool) { 27 | super.setSelected(selected, animated: animated) 28 | } 29 | 30 | @IBAction func didTapClear(_ sender: Any) { 31 | delegate?.didTapClear() 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /ScrollableImageMask/ScrollableImageMask/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 | } -------------------------------------------------------------------------------- /LabelNumbersAnimation/LabelNumbersAnimation/View/HomeBuyCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HomeBuyCell.swift 3 | // LabelNumbersAnimation 4 | // 5 | // Created by don chen on 2017/3/9. 6 | // Copyright © 2017年 Don Chen. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | protocol HomeBuyCellDelegate { 12 | func didTapBuy(at:IndexPath) 13 | } 14 | 15 | class HomeBuyCell: UITableViewCell { 16 | 17 | @IBOutlet var priceLabel: UILabel! 18 | @IBOutlet var buyButton: UIButton! 19 | 20 | var delegate:HomeBuyCellDelegate? 21 | var cellIndexPath:IndexPath? 22 | 23 | override func awakeFromNib() { 24 | super.awakeFromNib() 25 | buyButton.layer.cornerRadius = 17.5 26 | } 27 | 28 | override func setSelected(_ selected: Bool, animated: Bool) { 29 | super.setSelected(selected, animated: animated) 30 | } 31 | 32 | @IBAction func didTapBuy(_ sender: Any) { 33 | if cellIndexPath != nil { 34 | delegate?.didTapBuy(at: cellIndexPath!) 35 | } 36 | } 37 | 38 | func setupCell(price:Float) { 39 | priceLabel.text = "$ \(price)" 40 | } 41 | 42 | 43 | } 44 | -------------------------------------------------------------------------------- /ScrollableImageMask/ScrollableImageMask/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | 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 | -------------------------------------------------------------------------------- /LabelNumbersAnimation/LabelNumbersAnimation/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | 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 | -------------------------------------------------------------------------------- /ScrollableImageMask/ScrollableImageMask/ViewController/HomeViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HomeViewController.swift 3 | // ScrollableImageMask 4 | // 5 | // Created by don chen on 2017/3/7. 6 | // Copyright © 2017年 Don Chen. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class HomeViewController: UIViewController { 12 | 13 | @IBOutlet var imageView2: UIImageView! 14 | @IBOutlet var maskView: UIView! 15 | 16 | @IBOutlet var barImageView: UIImageView! 17 | 18 | override func viewDidLoad() { 19 | super.viewDidLoad() 20 | 21 | imageView2.mask = maskView 22 | 23 | setupGesture() 24 | } 25 | 26 | func setupGesture() { 27 | barImageView.isUserInteractionEnabled = true 28 | 29 | let panGesture = UIPanGestureRecognizer(target: self, action: #selector(barDidSwipe(gesture:))) 30 | barImageView.addGestureRecognizer(panGesture) 31 | } 32 | 33 | func barDidSwipe(gesture:UIGestureRecognizer) { 34 | if let panGesture = gesture as? UIPanGestureRecognizer { 35 | let point = panGesture.location(in: view) 36 | 37 | 38 | let halfBarWidth = CGFloat(12.5) 39 | barImageView.frame.origin.x = point.x - halfBarWidth 40 | 41 | let newMaskViewFrame = CGRect(x: point.x, 42 | y: maskView.frame.origin.y, 43 | width: view.frame.width - point.x, 44 | height: maskView.frame.height) 45 | maskView.frame = newMaskViewFrame 46 | 47 | } 48 | 49 | } 50 | 51 | 52 | } 53 | -------------------------------------------------------------------------------- /ScrollableImageMask/ScrollableImageMask/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /LabelNumbersAnimation/LabelNumbersAnimation/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ScrollableImageMask/ScrollableImageMask/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 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.gitignore.io/api/swift 3 | 4 | ### Swift ### 5 | # Xcode 6 | # 7 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 8 | 9 | .DS_Store 10 | 11 | ## Build generated 12 | build/ 13 | DerivedData/ 14 | 15 | ## Various settings 16 | *.pbxuser 17 | !default.pbxuser 18 | *.mode1v3 19 | !default.mode1v3 20 | *.mode2v3 21 | !default.mode2v3 22 | *.perspectivev3 23 | !default.perspectivev3 24 | xcuserdata/ 25 | 26 | ## Other 27 | *.moved-aside 28 | *.xccheckout 29 | *.xcscmblueprint 30 | 31 | ## Obj-C/Swift specific 32 | *.hmap 33 | *.ipa 34 | *.dSYM.zip 35 | *.dSYM 36 | 37 | ## Playgrounds 38 | timeline.xctimeline 39 | playground.xcworkspace 40 | 41 | # Swift Package Manager 42 | # 43 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 44 | # Packages/ 45 | # Package.pins 46 | .build/ 47 | 48 | # CocoaPods 49 | # 50 | # We recommend against adding the Pods directory to your .gitignore. However 51 | # you should judge for yourself, the pros and cons are mentioned at: 52 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 53 | # 54 | # Pods/ 55 | 56 | # Carthage 57 | # 58 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 59 | # Carthage/Checkouts 60 | 61 | Carthage/Build 62 | 63 | # fastlane 64 | # 65 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 66 | # screenshots whenever they are needed. 67 | # For more information about the recommended setup visit: 68 | # https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md 69 | 70 | fastlane/report.xml 71 | fastlane/Preview.html 72 | fastlane/screenshots 73 | fastlane/test_output 74 | 75 | # End of https://www.gitignore.io/api/swift 76 | -------------------------------------------------------------------------------- /LabelNumbersAnimation/LabelNumbersAnimation/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 | -------------------------------------------------------------------------------- /ScrollableImageMask/ScrollableImageMask/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // ScrollableImageMask 4 | // 5 | // Created by don chen on 2017/3/7. 6 | // Copyright © 2017年 Don Chen. 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 | let homeVC = HomeViewController(nibName: "HomeViewController", bundle: nil) 19 | window?.rootViewController = homeVC 20 | 21 | return true 22 | } 23 | 24 | func applicationWillResignActive(_ application: UIApplication) { 25 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 26 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. 27 | } 28 | 29 | func applicationDidEnterBackground(_ application: UIApplication) { 30 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 31 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 32 | } 33 | 34 | func applicationWillEnterForeground(_ application: UIApplication) { 35 | // 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. 36 | } 37 | 38 | func applicationDidBecomeActive(_ application: UIApplication) { 39 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 40 | } 41 | 42 | func applicationWillTerminate(_ application: UIApplication) { 43 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 44 | } 45 | 46 | 47 | } 48 | 49 | -------------------------------------------------------------------------------- /LabelNumbersAnimation/LabelNumbersAnimation/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // LabelNumbersAnimation 4 | // 5 | // Created by don chen on 2017/3/9. 6 | // Copyright © 2017年 Don Chen. 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 | 19 | let VC = HomeViewController(nibName: "HomeViewController", bundle: nil) 20 | let NC = UINavigationController(rootViewController: VC) 21 | NC.navigationBar.isTranslucent = false 22 | window?.rootViewController = NC 23 | 24 | return true 25 | } 26 | 27 | func applicationWillResignActive(_ application: UIApplication) { 28 | // 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. 29 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. 30 | } 31 | 32 | func applicationDidEnterBackground(_ application: UIApplication) { 33 | // 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. 34 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 35 | } 36 | 37 | func applicationWillEnterForeground(_ application: UIApplication) { 38 | // 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. 39 | } 40 | 41 | func applicationDidBecomeActive(_ application: UIApplication) { 42 | // 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. 43 | } 44 | 45 | func applicationWillTerminate(_ application: UIApplication) { 46 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 47 | } 48 | 49 | 50 | } 51 | 52 | -------------------------------------------------------------------------------- /LabelNumbersAnimation/LabelNumbersAnimation/View/AnimationLabel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AnimationLabel.swift 3 | // LabelNumbersAnimation 4 | // 5 | // Created by don chen on 2017/3/9. 6 | // Copyright © 2017年 Don Chen. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class AnimationLabel: UILabel { 12 | 13 | fileprivate var animationDuration = 2.0 14 | 15 | fileprivate var startingValue: Float = 0 16 | fileprivate var destinationValue: Float = 0 17 | fileprivate var progress: TimeInterval = 0 18 | 19 | fileprivate var lastUpdateTime: TimeInterval = 0 20 | fileprivate var totalTime: TimeInterval = 0 21 | 22 | fileprivate var timer: CADisplayLink? 23 | 24 | fileprivate var currentValue: Float { 25 | if progress >= totalTime { return destinationValue } 26 | return startingValue + Float(progress / totalTime) * (destinationValue - startingValue) 27 | } 28 | 29 | fileprivate func addDisplayLink() { 30 | timer = CADisplayLink(target: self, selector: #selector(self.updateValue(timer:))) 31 | timer?.add(to: .main, forMode: .defaultRunLoopMode) 32 | timer?.add(to: .main, forMode: .UITrackingRunLoopMode) 33 | } 34 | 35 | @objc fileprivate func updateValue(timer: Timer) { 36 | let now: TimeInterval = Date.timeIntervalSinceReferenceDate 37 | progress += now - lastUpdateTime 38 | lastUpdateTime = now 39 | 40 | if progress >= totalTime { 41 | self.timer?.invalidate() 42 | self.timer = nil 43 | progress = totalTime 44 | } 45 | 46 | setTextValue(value: currentValue) 47 | } 48 | 49 | // update UILabel.text 50 | fileprivate func setTextValue(value: Float) { 51 | text = String(format: "$ %.1f", value) 52 | } 53 | 54 | 55 | 56 | } 57 | 58 | // MARK: Counting Method 59 | extension AnimationLabel { 60 | func count(from: Float, to: Float, duration: TimeInterval? = nil) { 61 | startingValue = from 62 | destinationValue = to 63 | 64 | timer?.invalidate() 65 | timer = nil 66 | 67 | if (duration == 0.0) { 68 | // No animation 69 | setTextValue(value: to) 70 | return 71 | } 72 | 73 | progress = 0.0 74 | totalTime = duration ?? animationDuration 75 | lastUpdateTime = Date.timeIntervalSinceReferenceDate 76 | 77 | addDisplayLink() 78 | } 79 | 80 | func countFromCurrent(to: Float, duration: TimeInterval? = nil) { 81 | count(from: currentValue, to: to, duration: duration ?? nil) 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /LabelNumbersAnimation/LabelNumbersAnimation/View/HomeFooterCell.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /LabelNumbersAnimation/LabelNumbersAnimation/ViewController/HomeViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /LabelNumbersAnimation/LabelNumbersAnimation/View/HomeClearCell.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /LabelNumbersAnimation/LabelNumbersAnimation/View/HomeMainCell.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /LabelNumbersAnimation/LabelNumbersAnimation/ViewController/HomeViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HomeViewController.swift 3 | // LabelNumbersAnimation 4 | // 5 | // Created by don chen on 2017/3/9. 6 | // Copyright © 2017年 Don Chen. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class HomeViewController: UIViewController { 12 | 13 | @IBOutlet var aTableView: UITableView! 14 | @IBOutlet var currentMoneyLabel: AnimationLabel! 15 | 16 | let prices:[Float] = [6.0, 64.0 , 128.0, 256.0, 512.0, 1024.0, 2048.0] 17 | var currentMoney:Float = 0.0 18 | 19 | var mainCell:HomeMainCell? 20 | 21 | override func viewDidLoad() { 22 | super.viewDidLoad() 23 | title = "帳戶餘額" 24 | 25 | setupView() 26 | } 27 | 28 | fileprivate func setupView() { 29 | let mainNib = UINib(nibName: "HomeMainCell", bundle: nil) 30 | aTableView.register(mainNib, forCellReuseIdentifier: "mainCell") 31 | 32 | let buyNib = UINib(nibName: "HomeBuyCell", bundle: nil) 33 | aTableView.register(buyNib, forCellReuseIdentifier: "buyCell") 34 | 35 | let clearNib = UINib(nibName: "HomeClearCell", bundle: nil) 36 | aTableView.register(clearNib, forCellReuseIdentifier: "clearCell") 37 | 38 | let footerNib = UINib(nibName: "HomeFooterCell", bundle: nil) 39 | aTableView.register(footerNib, forCellReuseIdentifier: "footerCell") 40 | 41 | 42 | // remove extra cell seprator 43 | aTableView.tableFooterView = UIView() 44 | } 45 | 46 | } 47 | 48 | // MARK: UITableViewDataSource 49 | extension HomeViewController: UITableViewDataSource { 50 | 51 | func numberOfSections(in tableView: UITableView) -> Int { 52 | return 3 53 | } 54 | 55 | func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 56 | 57 | if section == 0 { 58 | return 1 59 | 60 | } else if section == 1{ 61 | // section - buy cell 62 | return prices.count 63 | 64 | } else { 65 | // section - clear cell / footer cell 66 | return 2 67 | } 68 | 69 | } 70 | 71 | 72 | func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 73 | let section = indexPath.section 74 | let row = indexPath.row 75 | 76 | if section == 0 { 77 | mainCell = tableView.dequeueReusableCell(withIdentifier: "mainCell", for: indexPath) as? HomeMainCell 78 | mainCell?.aLabel.text = "$ \(currentMoney)" 79 | mainCell!.selectionStyle = .none 80 | return mainCell! 81 | 82 | } else if section == 1{ 83 | let aCell = tableView.dequeueReusableCell(withIdentifier: "buyCell", for: indexPath) as! HomeBuyCell 84 | aCell.delegate = self 85 | aCell.cellIndexPath = indexPath 86 | if row <= prices.count { 87 | aCell.setupCell(price: prices[row]) 88 | } 89 | aCell.selectionStyle = .none 90 | return aCell 91 | 92 | } else { 93 | if row == 0 { 94 | let aCell = tableView.dequeueReusableCell(withIdentifier: "clearCell", for: indexPath) as! HomeClearCell 95 | aCell.delegate = self 96 | aCell.selectionStyle = .none 97 | return aCell 98 | } else { 99 | let aCell = tableView.dequeueReusableCell(withIdentifier: "footerCell", for: indexPath) as! HomeFooterCell 100 | return aCell 101 | } 102 | 103 | } 104 | } 105 | 106 | 107 | } 108 | 109 | // MARK: UITableViewDelegate 110 | extension HomeViewController: UITableViewDelegate { 111 | func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 112 | if indexPath.section == 0 { 113 | return 140 114 | } else { 115 | return 50 116 | } 117 | 118 | } 119 | 120 | } 121 | 122 | // MARK: Cell Delegates 123 | extension HomeViewController: HomeBuyCellDelegate, HomeClearCellDelegate { 124 | 125 | // HomeBuyCellDelegate 126 | func didTapBuy(at: IndexPath) { 127 | if at.row <= prices.count { 128 | currentMoney += prices[at.row] 129 | mainCell?.aLabel.countFromCurrent(to: currentMoney, duration: 1) 130 | } 131 | 132 | } 133 | // HomeClearCellDelegate 134 | func didTapClear() { 135 | currentMoney = 0 136 | mainCell?.aLabel.countFromCurrent(to: 0, duration: 1) 137 | } 138 | } 139 | -------------------------------------------------------------------------------- /LabelNumbersAnimation/LabelNumbersAnimation/View/HomeBuyCell.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 28 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /ScrollableImageMask/ScrollableImageMask/ViewController/HomeViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 47 | 53 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | -------------------------------------------------------------------------------- /ScrollableImageMask/ScrollableImageMask.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1A10A36E1E6E3A0800837EBD /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A10A36D1E6E3A0800837EBD /* AppDelegate.swift */; }; 11 | 1A10A3731E6E3A0800837EBD /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1A10A3711E6E3A0800837EBD /* Main.storyboard */; }; 12 | 1A10A3751E6E3A0800837EBD /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1A10A3741E6E3A0800837EBD /* Assets.xcassets */; }; 13 | 1A10A3781E6E3A0800837EBD /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1A10A3761E6E3A0800837EBD /* LaunchScreen.storyboard */; }; 14 | 1A10A3831E6E3F0800837EBD /* HomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A10A3811E6E3F0800837EBD /* HomeViewController.swift */; }; 15 | 1A10A3841E6E3F0800837EBD /* HomeViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1A10A3821E6E3F0800837EBD /* HomeViewController.xib */; }; 16 | /* End PBXBuildFile section */ 17 | 18 | /* Begin PBXFileReference section */ 19 | 1A10A36A1E6E3A0800837EBD /* ScrollableImageMask.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ScrollableImageMask.app; sourceTree = BUILT_PRODUCTS_DIR; }; 20 | 1A10A36D1E6E3A0800837EBD /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 21 | 1A10A3721E6E3A0800837EBD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 22 | 1A10A3741E6E3A0800837EBD /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = ../Assets.xcassets; sourceTree = ""; }; 23 | 1A10A3771E6E3A0800837EBD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 24 | 1A10A3791E6E3A0800837EBD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = ../Info.plist; sourceTree = ""; }; 25 | 1A10A3811E6E3F0800837EBD /* HomeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HomeViewController.swift; sourceTree = ""; }; 26 | 1A10A3821E6E3F0800837EBD /* HomeViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = HomeViewController.xib; sourceTree = ""; }; 27 | /* End PBXFileReference section */ 28 | 29 | /* Begin PBXFrameworksBuildPhase section */ 30 | 1A10A3671E6E3A0800837EBD /* Frameworks */ = { 31 | isa = PBXFrameworksBuildPhase; 32 | buildActionMask = 2147483647; 33 | files = ( 34 | ); 35 | runOnlyForDeploymentPostprocessing = 0; 36 | }; 37 | /* End PBXFrameworksBuildPhase section */ 38 | 39 | /* Begin PBXGroup section */ 40 | 1A10A3611E6E3A0800837EBD = { 41 | isa = PBXGroup; 42 | children = ( 43 | 1A10A36C1E6E3A0800837EBD /* ScrollableImageMask */, 44 | 1A10A36B1E6E3A0800837EBD /* Products */, 45 | ); 46 | sourceTree = ""; 47 | }; 48 | 1A10A36B1E6E3A0800837EBD /* Products */ = { 49 | isa = PBXGroup; 50 | children = ( 51 | 1A10A36A1E6E3A0800837EBD /* ScrollableImageMask.app */, 52 | ); 53 | name = Products; 54 | sourceTree = ""; 55 | }; 56 | 1A10A36C1E6E3A0800837EBD /* ScrollableImageMask */ = { 57 | isa = PBXGroup; 58 | children = ( 59 | 1A10A36D1E6E3A0800837EBD /* AppDelegate.swift */, 60 | 1A10A3801E6E3A3300837EBD /* ViewController */, 61 | 1A10A37F1E6E3A3300837EBD /* Support */, 62 | ); 63 | path = ScrollableImageMask; 64 | sourceTree = ""; 65 | }; 66 | 1A10A37F1E6E3A3300837EBD /* Support */ = { 67 | isa = PBXGroup; 68 | children = ( 69 | 1A10A3711E6E3A0800837EBD /* Main.storyboard */, 70 | 1A10A3741E6E3A0800837EBD /* Assets.xcassets */, 71 | 1A10A3761E6E3A0800837EBD /* LaunchScreen.storyboard */, 72 | 1A10A3791E6E3A0800837EBD /* Info.plist */, 73 | ); 74 | path = Support; 75 | sourceTree = ""; 76 | }; 77 | 1A10A3801E6E3A3300837EBD /* ViewController */ = { 78 | isa = PBXGroup; 79 | children = ( 80 | 1A10A3811E6E3F0800837EBD /* HomeViewController.swift */, 81 | 1A10A3821E6E3F0800837EBD /* HomeViewController.xib */, 82 | ); 83 | path = ViewController; 84 | sourceTree = ""; 85 | }; 86 | /* End PBXGroup section */ 87 | 88 | /* Begin PBXNativeTarget section */ 89 | 1A10A3691E6E3A0800837EBD /* ScrollableImageMask */ = { 90 | isa = PBXNativeTarget; 91 | buildConfigurationList = 1A10A37C1E6E3A0800837EBD /* Build configuration list for PBXNativeTarget "ScrollableImageMask" */; 92 | buildPhases = ( 93 | 1A10A3661E6E3A0800837EBD /* Sources */, 94 | 1A10A3671E6E3A0800837EBD /* Frameworks */, 95 | 1A10A3681E6E3A0800837EBD /* Resources */, 96 | ); 97 | buildRules = ( 98 | ); 99 | dependencies = ( 100 | ); 101 | name = ScrollableImageMask; 102 | productName = ScrollableImageMask; 103 | productReference = 1A10A36A1E6E3A0800837EBD /* ScrollableImageMask.app */; 104 | productType = "com.apple.product-type.application"; 105 | }; 106 | /* End PBXNativeTarget section */ 107 | 108 | /* Begin PBXProject section */ 109 | 1A10A3621E6E3A0800837EBD /* Project object */ = { 110 | isa = PBXProject; 111 | attributes = { 112 | LastSwiftUpdateCheck = 0820; 113 | LastUpgradeCheck = 0820; 114 | ORGANIZATIONNAME = "Don Chen"; 115 | TargetAttributes = { 116 | 1A10A3691E6E3A0800837EBD = { 117 | CreatedOnToolsVersion = 8.2.1; 118 | DevelopmentTeam = DT8726CBX4; 119 | ProvisioningStyle = Automatic; 120 | }; 121 | }; 122 | }; 123 | buildConfigurationList = 1A10A3651E6E3A0800837EBD /* Build configuration list for PBXProject "ScrollableImageMask" */; 124 | compatibilityVersion = "Xcode 3.2"; 125 | developmentRegion = English; 126 | hasScannedForEncodings = 0; 127 | knownRegions = ( 128 | en, 129 | Base, 130 | ); 131 | mainGroup = 1A10A3611E6E3A0800837EBD; 132 | productRefGroup = 1A10A36B1E6E3A0800837EBD /* Products */; 133 | projectDirPath = ""; 134 | projectRoot = ""; 135 | targets = ( 136 | 1A10A3691E6E3A0800837EBD /* ScrollableImageMask */, 137 | ); 138 | }; 139 | /* End PBXProject section */ 140 | 141 | /* Begin PBXResourcesBuildPhase section */ 142 | 1A10A3681E6E3A0800837EBD /* Resources */ = { 143 | isa = PBXResourcesBuildPhase; 144 | buildActionMask = 2147483647; 145 | files = ( 146 | 1A10A3781E6E3A0800837EBD /* LaunchScreen.storyboard in Resources */, 147 | 1A10A3751E6E3A0800837EBD /* Assets.xcassets in Resources */, 148 | 1A10A3731E6E3A0800837EBD /* Main.storyboard in Resources */, 149 | 1A10A3841E6E3F0800837EBD /* HomeViewController.xib in Resources */, 150 | ); 151 | runOnlyForDeploymentPostprocessing = 0; 152 | }; 153 | /* End PBXResourcesBuildPhase section */ 154 | 155 | /* Begin PBXSourcesBuildPhase section */ 156 | 1A10A3661E6E3A0800837EBD /* Sources */ = { 157 | isa = PBXSourcesBuildPhase; 158 | buildActionMask = 2147483647; 159 | files = ( 160 | 1A10A36E1E6E3A0800837EBD /* AppDelegate.swift in Sources */, 161 | 1A10A3831E6E3F0800837EBD /* HomeViewController.swift in Sources */, 162 | ); 163 | runOnlyForDeploymentPostprocessing = 0; 164 | }; 165 | /* End PBXSourcesBuildPhase section */ 166 | 167 | /* Begin PBXVariantGroup section */ 168 | 1A10A3711E6E3A0800837EBD /* Main.storyboard */ = { 169 | isa = PBXVariantGroup; 170 | children = ( 171 | 1A10A3721E6E3A0800837EBD /* Base */, 172 | ); 173 | name = Main.storyboard; 174 | path = ..; 175 | sourceTree = ""; 176 | }; 177 | 1A10A3761E6E3A0800837EBD /* LaunchScreen.storyboard */ = { 178 | isa = PBXVariantGroup; 179 | children = ( 180 | 1A10A3771E6E3A0800837EBD /* Base */, 181 | ); 182 | name = LaunchScreen.storyboard; 183 | path = ..; 184 | sourceTree = ""; 185 | }; 186 | /* End PBXVariantGroup section */ 187 | 188 | /* Begin XCBuildConfiguration section */ 189 | 1A10A37A1E6E3A0800837EBD /* Debug */ = { 190 | isa = XCBuildConfiguration; 191 | buildSettings = { 192 | ALWAYS_SEARCH_USER_PATHS = NO; 193 | CLANG_ANALYZER_NONNULL = YES; 194 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 195 | CLANG_CXX_LIBRARY = "libc++"; 196 | CLANG_ENABLE_MODULES = YES; 197 | CLANG_ENABLE_OBJC_ARC = YES; 198 | CLANG_WARN_BOOL_CONVERSION = YES; 199 | CLANG_WARN_CONSTANT_CONVERSION = YES; 200 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 201 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 202 | CLANG_WARN_EMPTY_BODY = YES; 203 | CLANG_WARN_ENUM_CONVERSION = YES; 204 | CLANG_WARN_INFINITE_RECURSION = YES; 205 | CLANG_WARN_INT_CONVERSION = YES; 206 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 207 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 208 | CLANG_WARN_UNREACHABLE_CODE = YES; 209 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 210 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 211 | COPY_PHASE_STRIP = NO; 212 | DEBUG_INFORMATION_FORMAT = dwarf; 213 | ENABLE_STRICT_OBJC_MSGSEND = YES; 214 | ENABLE_TESTABILITY = YES; 215 | GCC_C_LANGUAGE_STANDARD = gnu99; 216 | GCC_DYNAMIC_NO_PIC = NO; 217 | GCC_NO_COMMON_BLOCKS = YES; 218 | GCC_OPTIMIZATION_LEVEL = 0; 219 | GCC_PREPROCESSOR_DEFINITIONS = ( 220 | "DEBUG=1", 221 | "$(inherited)", 222 | ); 223 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 224 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 225 | GCC_WARN_UNDECLARED_SELECTOR = YES; 226 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 227 | GCC_WARN_UNUSED_FUNCTION = YES; 228 | GCC_WARN_UNUSED_VARIABLE = YES; 229 | IPHONEOS_DEPLOYMENT_TARGET = 10.2; 230 | MTL_ENABLE_DEBUG_INFO = YES; 231 | ONLY_ACTIVE_ARCH = YES; 232 | SDKROOT = iphoneos; 233 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 234 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 235 | }; 236 | name = Debug; 237 | }; 238 | 1A10A37B1E6E3A0800837EBD /* Release */ = { 239 | isa = XCBuildConfiguration; 240 | buildSettings = { 241 | ALWAYS_SEARCH_USER_PATHS = NO; 242 | CLANG_ANALYZER_NONNULL = YES; 243 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 244 | CLANG_CXX_LIBRARY = "libc++"; 245 | CLANG_ENABLE_MODULES = YES; 246 | CLANG_ENABLE_OBJC_ARC = YES; 247 | CLANG_WARN_BOOL_CONVERSION = YES; 248 | CLANG_WARN_CONSTANT_CONVERSION = YES; 249 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 250 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 251 | CLANG_WARN_EMPTY_BODY = YES; 252 | CLANG_WARN_ENUM_CONVERSION = YES; 253 | CLANG_WARN_INFINITE_RECURSION = YES; 254 | CLANG_WARN_INT_CONVERSION = YES; 255 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 256 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 257 | CLANG_WARN_UNREACHABLE_CODE = YES; 258 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 259 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 260 | COPY_PHASE_STRIP = NO; 261 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 262 | ENABLE_NS_ASSERTIONS = NO; 263 | ENABLE_STRICT_OBJC_MSGSEND = YES; 264 | GCC_C_LANGUAGE_STANDARD = gnu99; 265 | GCC_NO_COMMON_BLOCKS = YES; 266 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 267 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 268 | GCC_WARN_UNDECLARED_SELECTOR = YES; 269 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 270 | GCC_WARN_UNUSED_FUNCTION = YES; 271 | GCC_WARN_UNUSED_VARIABLE = YES; 272 | IPHONEOS_DEPLOYMENT_TARGET = 10.2; 273 | MTL_ENABLE_DEBUG_INFO = NO; 274 | SDKROOT = iphoneos; 275 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 276 | VALIDATE_PRODUCT = YES; 277 | }; 278 | name = Release; 279 | }; 280 | 1A10A37D1E6E3A0800837EBD /* Debug */ = { 281 | isa = XCBuildConfiguration; 282 | buildSettings = { 283 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 284 | DEVELOPMENT_TEAM = DT8726CBX4; 285 | INFOPLIST_FILE = ScrollableImageMask/Info.plist; 286 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 287 | PRODUCT_BUNDLE_IDENTIFIER = code4idea.com.ScrollableImageMask; 288 | PRODUCT_NAME = "$(TARGET_NAME)"; 289 | SWIFT_VERSION = 3.0; 290 | }; 291 | name = Debug; 292 | }; 293 | 1A10A37E1E6E3A0800837EBD /* Release */ = { 294 | isa = XCBuildConfiguration; 295 | buildSettings = { 296 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 297 | DEVELOPMENT_TEAM = DT8726CBX4; 298 | INFOPLIST_FILE = ScrollableImageMask/Info.plist; 299 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 300 | PRODUCT_BUNDLE_IDENTIFIER = code4idea.com.ScrollableImageMask; 301 | PRODUCT_NAME = "$(TARGET_NAME)"; 302 | SWIFT_VERSION = 3.0; 303 | }; 304 | name = Release; 305 | }; 306 | /* End XCBuildConfiguration section */ 307 | 308 | /* Begin XCConfigurationList section */ 309 | 1A10A3651E6E3A0800837EBD /* Build configuration list for PBXProject "ScrollableImageMask" */ = { 310 | isa = XCConfigurationList; 311 | buildConfigurations = ( 312 | 1A10A37A1E6E3A0800837EBD /* Debug */, 313 | 1A10A37B1E6E3A0800837EBD /* Release */, 314 | ); 315 | defaultConfigurationIsVisible = 0; 316 | defaultConfigurationName = Release; 317 | }; 318 | 1A10A37C1E6E3A0800837EBD /* Build configuration list for PBXNativeTarget "ScrollableImageMask" */ = { 319 | isa = XCConfigurationList; 320 | buildConfigurations = ( 321 | 1A10A37D1E6E3A0800837EBD /* Debug */, 322 | 1A10A37E1E6E3A0800837EBD /* Release */, 323 | ); 324 | defaultConfigurationIsVisible = 0; 325 | defaultConfigurationName = Release; 326 | }; 327 | /* End XCConfigurationList section */ 328 | }; 329 | rootObject = 1A10A3621E6E3A0800837EBD /* Project object */; 330 | } 331 | -------------------------------------------------------------------------------- /LabelNumbersAnimation/LabelNumbersAnimation.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1AEC87A61E70E5C300E3B348 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AEC87A51E70E5C300E3B348 /* AppDelegate.swift */; }; 11 | 1AEC87AB1E70E5C300E3B348 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1AEC87A91E70E5C300E3B348 /* Main.storyboard */; }; 12 | 1AEC87AD1E70E5C300E3B348 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1AEC87AC1E70E5C300E3B348 /* Assets.xcassets */; }; 13 | 1AEC87B01E70E5C300E3B348 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1AEC87AE1E70E5C300E3B348 /* LaunchScreen.storyboard */; }; 14 | 1AEC87BB1E70E60C00E3B348 /* HomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AEC87B91E70E60C00E3B348 /* HomeViewController.swift */; }; 15 | 1AEC87BC1E70E60C00E3B348 /* HomeViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1AEC87BA1E70E60C00E3B348 /* HomeViewController.xib */; }; 16 | 1AEC87C01E70E7A500E3B348 /* HomeBuyCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AEC87BE1E70E7A500E3B348 /* HomeBuyCell.swift */; }; 17 | 1AEC87C11E70E7A500E3B348 /* HomeBuyCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1AEC87BF1E70E7A500E3B348 /* HomeBuyCell.xib */; }; 18 | 1AEC87C41E70E7B100E3B348 /* HomeClearCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AEC87C21E70E7B100E3B348 /* HomeClearCell.swift */; }; 19 | 1AEC87C51E70E7B100E3B348 /* HomeClearCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1AEC87C31E70E7B100E3B348 /* HomeClearCell.xib */; }; 20 | 1AEC87C71E70EDBF00E3B348 /* AnimationLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AEC87C61E70EDBF00E3B348 /* AnimationLabel.swift */; }; 21 | 1AEC87CF1E70F0C700E3B348 /* HomeMainCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AEC87CD1E70F0C700E3B348 /* HomeMainCell.swift */; }; 22 | 1AEC87D01E70F0C700E3B348 /* HomeMainCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1AEC87CE1E70F0C700E3B348 /* HomeMainCell.xib */; }; 23 | 1AEC87D71E710BE000E3B348 /* HomeFooterCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AEC87D51E710BE000E3B348 /* HomeFooterCell.swift */; }; 24 | 1AEC87D81E710BE000E3B348 /* HomeFooterCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1AEC87D61E710BE000E3B348 /* HomeFooterCell.xib */; }; 25 | /* End PBXBuildFile section */ 26 | 27 | /* Begin PBXFileReference section */ 28 | 1AEC87A21E70E5C300E3B348 /* LabelNumbersAnimation.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LabelNumbersAnimation.app; sourceTree = BUILT_PRODUCTS_DIR; }; 29 | 1AEC87A51E70E5C300E3B348 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 30 | 1AEC87AA1E70E5C300E3B348 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 31 | 1AEC87AC1E70E5C300E3B348 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = ../Assets.xcassets; sourceTree = ""; }; 32 | 1AEC87AF1E70E5C300E3B348 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 33 | 1AEC87B11E70E5C300E3B348 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = ../Info.plist; sourceTree = ""; }; 34 | 1AEC87B91E70E60C00E3B348 /* HomeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HomeViewController.swift; sourceTree = ""; }; 35 | 1AEC87BA1E70E60C00E3B348 /* HomeViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = HomeViewController.xib; sourceTree = ""; }; 36 | 1AEC87BE1E70E7A500E3B348 /* HomeBuyCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HomeBuyCell.swift; sourceTree = ""; }; 37 | 1AEC87BF1E70E7A500E3B348 /* HomeBuyCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = HomeBuyCell.xib; sourceTree = ""; }; 38 | 1AEC87C21E70E7B100E3B348 /* HomeClearCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HomeClearCell.swift; sourceTree = ""; }; 39 | 1AEC87C31E70E7B100E3B348 /* HomeClearCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = HomeClearCell.xib; sourceTree = ""; }; 40 | 1AEC87C61E70EDBF00E3B348 /* AnimationLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnimationLabel.swift; sourceTree = ""; }; 41 | 1AEC87CD1E70F0C700E3B348 /* HomeMainCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HomeMainCell.swift; sourceTree = ""; }; 42 | 1AEC87CE1E70F0C700E3B348 /* HomeMainCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = HomeMainCell.xib; sourceTree = ""; }; 43 | 1AEC87D51E710BE000E3B348 /* HomeFooterCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HomeFooterCell.swift; sourceTree = ""; }; 44 | 1AEC87D61E710BE000E3B348 /* HomeFooterCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = HomeFooterCell.xib; sourceTree = ""; }; 45 | /* End PBXFileReference section */ 46 | 47 | /* Begin PBXFrameworksBuildPhase section */ 48 | 1AEC879F1E70E5C300E3B348 /* Frameworks */ = { 49 | isa = PBXFrameworksBuildPhase; 50 | buildActionMask = 2147483647; 51 | files = ( 52 | ); 53 | runOnlyForDeploymentPostprocessing = 0; 54 | }; 55 | /* End PBXFrameworksBuildPhase section */ 56 | 57 | /* Begin PBXGroup section */ 58 | 1AEC87991E70E5C300E3B348 = { 59 | isa = PBXGroup; 60 | children = ( 61 | 1AEC87A41E70E5C300E3B348 /* LabelNumbersAnimation */, 62 | 1AEC87A31E70E5C300E3B348 /* Products */, 63 | ); 64 | sourceTree = ""; 65 | }; 66 | 1AEC87A31E70E5C300E3B348 /* Products */ = { 67 | isa = PBXGroup; 68 | children = ( 69 | 1AEC87A21E70E5C300E3B348 /* LabelNumbersAnimation.app */, 70 | ); 71 | name = Products; 72 | sourceTree = ""; 73 | }; 74 | 1AEC87A41E70E5C300E3B348 /* LabelNumbersAnimation */ = { 75 | isa = PBXGroup; 76 | children = ( 77 | 1AEC87A51E70E5C300E3B348 /* AppDelegate.swift */, 78 | 1AEC87B81E70E5F500E3B348 /* ViewController */, 79 | 1AEC87BD1E70E73300E3B348 /* View */, 80 | 1AEC87B71E70E5F500E3B348 /* Support */, 81 | ); 82 | path = LabelNumbersAnimation; 83 | sourceTree = ""; 84 | }; 85 | 1AEC87B71E70E5F500E3B348 /* Support */ = { 86 | isa = PBXGroup; 87 | children = ( 88 | 1AEC87A91E70E5C300E3B348 /* Main.storyboard */, 89 | 1AEC87AC1E70E5C300E3B348 /* Assets.xcassets */, 90 | 1AEC87AE1E70E5C300E3B348 /* LaunchScreen.storyboard */, 91 | 1AEC87B11E70E5C300E3B348 /* Info.plist */, 92 | ); 93 | path = Support; 94 | sourceTree = ""; 95 | }; 96 | 1AEC87B81E70E5F500E3B348 /* ViewController */ = { 97 | isa = PBXGroup; 98 | children = ( 99 | 1AEC87B91E70E60C00E3B348 /* HomeViewController.swift */, 100 | 1AEC87BA1E70E60C00E3B348 /* HomeViewController.xib */, 101 | ); 102 | path = ViewController; 103 | sourceTree = ""; 104 | }; 105 | 1AEC87BD1E70E73300E3B348 /* View */ = { 106 | isa = PBXGroup; 107 | children = ( 108 | 1AEC87C61E70EDBF00E3B348 /* AnimationLabel.swift */, 109 | 1AEC87C81E70EED200E3B348 /* Cell */, 110 | ); 111 | path = View; 112 | sourceTree = ""; 113 | }; 114 | 1AEC87C81E70EED200E3B348 /* Cell */ = { 115 | isa = PBXGroup; 116 | children = ( 117 | 1AEC87CD1E70F0C700E3B348 /* HomeMainCell.swift */, 118 | 1AEC87CE1E70F0C700E3B348 /* HomeMainCell.xib */, 119 | 1AEC87BE1E70E7A500E3B348 /* HomeBuyCell.swift */, 120 | 1AEC87BF1E70E7A500E3B348 /* HomeBuyCell.xib */, 121 | 1AEC87C21E70E7B100E3B348 /* HomeClearCell.swift */, 122 | 1AEC87C31E70E7B100E3B348 /* HomeClearCell.xib */, 123 | 1AEC87D51E710BE000E3B348 /* HomeFooterCell.swift */, 124 | 1AEC87D61E710BE000E3B348 /* HomeFooterCell.xib */, 125 | ); 126 | name = Cell; 127 | sourceTree = ""; 128 | }; 129 | /* End PBXGroup section */ 130 | 131 | /* Begin PBXNativeTarget section */ 132 | 1AEC87A11E70E5C300E3B348 /* LabelNumbersAnimation */ = { 133 | isa = PBXNativeTarget; 134 | buildConfigurationList = 1AEC87B41E70E5C300E3B348 /* Build configuration list for PBXNativeTarget "LabelNumbersAnimation" */; 135 | buildPhases = ( 136 | 1AEC879E1E70E5C300E3B348 /* Sources */, 137 | 1AEC879F1E70E5C300E3B348 /* Frameworks */, 138 | 1AEC87A01E70E5C300E3B348 /* Resources */, 139 | ); 140 | buildRules = ( 141 | ); 142 | dependencies = ( 143 | ); 144 | name = LabelNumbersAnimation; 145 | productName = LabelNumbersAnimation; 146 | productReference = 1AEC87A21E70E5C300E3B348 /* LabelNumbersAnimation.app */; 147 | productType = "com.apple.product-type.application"; 148 | }; 149 | /* End PBXNativeTarget section */ 150 | 151 | /* Begin PBXProject section */ 152 | 1AEC879A1E70E5C300E3B348 /* Project object */ = { 153 | isa = PBXProject; 154 | attributes = { 155 | LastSwiftUpdateCheck = 0820; 156 | LastUpgradeCheck = 0820; 157 | ORGANIZATIONNAME = "Don Chen"; 158 | TargetAttributes = { 159 | 1AEC87A11E70E5C300E3B348 = { 160 | CreatedOnToolsVersion = 8.2.1; 161 | DevelopmentTeam = DT8726CBX4; 162 | ProvisioningStyle = Automatic; 163 | }; 164 | }; 165 | }; 166 | buildConfigurationList = 1AEC879D1E70E5C300E3B348 /* Build configuration list for PBXProject "LabelNumbersAnimation" */; 167 | compatibilityVersion = "Xcode 3.2"; 168 | developmentRegion = English; 169 | hasScannedForEncodings = 0; 170 | knownRegions = ( 171 | en, 172 | Base, 173 | ); 174 | mainGroup = 1AEC87991E70E5C300E3B348; 175 | productRefGroup = 1AEC87A31E70E5C300E3B348 /* Products */; 176 | projectDirPath = ""; 177 | projectRoot = ""; 178 | targets = ( 179 | 1AEC87A11E70E5C300E3B348 /* LabelNumbersAnimation */, 180 | ); 181 | }; 182 | /* End PBXProject section */ 183 | 184 | /* Begin PBXResourcesBuildPhase section */ 185 | 1AEC87A01E70E5C300E3B348 /* Resources */ = { 186 | isa = PBXResourcesBuildPhase; 187 | buildActionMask = 2147483647; 188 | files = ( 189 | 1AEC87C51E70E7B100E3B348 /* HomeClearCell.xib in Resources */, 190 | 1AEC87B01E70E5C300E3B348 /* LaunchScreen.storyboard in Resources */, 191 | 1AEC87AD1E70E5C300E3B348 /* Assets.xcassets in Resources */, 192 | 1AEC87D81E710BE000E3B348 /* HomeFooterCell.xib in Resources */, 193 | 1AEC87AB1E70E5C300E3B348 /* Main.storyboard in Resources */, 194 | 1AEC87C11E70E7A500E3B348 /* HomeBuyCell.xib in Resources */, 195 | 1AEC87BC1E70E60C00E3B348 /* HomeViewController.xib in Resources */, 196 | 1AEC87D01E70F0C700E3B348 /* HomeMainCell.xib in Resources */, 197 | ); 198 | runOnlyForDeploymentPostprocessing = 0; 199 | }; 200 | /* End PBXResourcesBuildPhase section */ 201 | 202 | /* Begin PBXSourcesBuildPhase section */ 203 | 1AEC879E1E70E5C300E3B348 /* Sources */ = { 204 | isa = PBXSourcesBuildPhase; 205 | buildActionMask = 2147483647; 206 | files = ( 207 | 1AEC87CF1E70F0C700E3B348 /* HomeMainCell.swift in Sources */, 208 | 1AEC87D71E710BE000E3B348 /* HomeFooterCell.swift in Sources */, 209 | 1AEC87A61E70E5C300E3B348 /* AppDelegate.swift in Sources */, 210 | 1AEC87C01E70E7A500E3B348 /* HomeBuyCell.swift in Sources */, 211 | 1AEC87C71E70EDBF00E3B348 /* AnimationLabel.swift in Sources */, 212 | 1AEC87C41E70E7B100E3B348 /* HomeClearCell.swift in Sources */, 213 | 1AEC87BB1E70E60C00E3B348 /* HomeViewController.swift in Sources */, 214 | ); 215 | runOnlyForDeploymentPostprocessing = 0; 216 | }; 217 | /* End PBXSourcesBuildPhase section */ 218 | 219 | /* Begin PBXVariantGroup section */ 220 | 1AEC87A91E70E5C300E3B348 /* Main.storyboard */ = { 221 | isa = PBXVariantGroup; 222 | children = ( 223 | 1AEC87AA1E70E5C300E3B348 /* Base */, 224 | ); 225 | name = Main.storyboard; 226 | path = ..; 227 | sourceTree = ""; 228 | }; 229 | 1AEC87AE1E70E5C300E3B348 /* LaunchScreen.storyboard */ = { 230 | isa = PBXVariantGroup; 231 | children = ( 232 | 1AEC87AF1E70E5C300E3B348 /* Base */, 233 | ); 234 | name = LaunchScreen.storyboard; 235 | path = ..; 236 | sourceTree = ""; 237 | }; 238 | /* End PBXVariantGroup section */ 239 | 240 | /* Begin XCBuildConfiguration section */ 241 | 1AEC87B21E70E5C300E3B348 /* Debug */ = { 242 | isa = XCBuildConfiguration; 243 | buildSettings = { 244 | ALWAYS_SEARCH_USER_PATHS = NO; 245 | CLANG_ANALYZER_NONNULL = YES; 246 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 247 | CLANG_CXX_LIBRARY = "libc++"; 248 | CLANG_ENABLE_MODULES = YES; 249 | CLANG_ENABLE_OBJC_ARC = YES; 250 | CLANG_WARN_BOOL_CONVERSION = YES; 251 | CLANG_WARN_CONSTANT_CONVERSION = YES; 252 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 253 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 254 | CLANG_WARN_EMPTY_BODY = YES; 255 | CLANG_WARN_ENUM_CONVERSION = YES; 256 | CLANG_WARN_INFINITE_RECURSION = YES; 257 | CLANG_WARN_INT_CONVERSION = YES; 258 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 259 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 260 | CLANG_WARN_UNREACHABLE_CODE = YES; 261 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 262 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 263 | COPY_PHASE_STRIP = NO; 264 | DEBUG_INFORMATION_FORMAT = dwarf; 265 | ENABLE_STRICT_OBJC_MSGSEND = YES; 266 | ENABLE_TESTABILITY = YES; 267 | GCC_C_LANGUAGE_STANDARD = gnu99; 268 | GCC_DYNAMIC_NO_PIC = NO; 269 | GCC_NO_COMMON_BLOCKS = YES; 270 | GCC_OPTIMIZATION_LEVEL = 0; 271 | GCC_PREPROCESSOR_DEFINITIONS = ( 272 | "DEBUG=1", 273 | "$(inherited)", 274 | ); 275 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 276 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 277 | GCC_WARN_UNDECLARED_SELECTOR = YES; 278 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 279 | GCC_WARN_UNUSED_FUNCTION = YES; 280 | GCC_WARN_UNUSED_VARIABLE = YES; 281 | IPHONEOS_DEPLOYMENT_TARGET = 10.2; 282 | MTL_ENABLE_DEBUG_INFO = YES; 283 | ONLY_ACTIVE_ARCH = YES; 284 | SDKROOT = iphoneos; 285 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 286 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 287 | }; 288 | name = Debug; 289 | }; 290 | 1AEC87B31E70E5C300E3B348 /* Release */ = { 291 | isa = XCBuildConfiguration; 292 | buildSettings = { 293 | ALWAYS_SEARCH_USER_PATHS = NO; 294 | CLANG_ANALYZER_NONNULL = YES; 295 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 296 | CLANG_CXX_LIBRARY = "libc++"; 297 | CLANG_ENABLE_MODULES = YES; 298 | CLANG_ENABLE_OBJC_ARC = YES; 299 | CLANG_WARN_BOOL_CONVERSION = YES; 300 | CLANG_WARN_CONSTANT_CONVERSION = YES; 301 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 302 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 303 | CLANG_WARN_EMPTY_BODY = YES; 304 | CLANG_WARN_ENUM_CONVERSION = YES; 305 | CLANG_WARN_INFINITE_RECURSION = YES; 306 | CLANG_WARN_INT_CONVERSION = YES; 307 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 308 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 309 | CLANG_WARN_UNREACHABLE_CODE = YES; 310 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 311 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 312 | COPY_PHASE_STRIP = NO; 313 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 314 | ENABLE_NS_ASSERTIONS = NO; 315 | ENABLE_STRICT_OBJC_MSGSEND = YES; 316 | GCC_C_LANGUAGE_STANDARD = gnu99; 317 | GCC_NO_COMMON_BLOCKS = YES; 318 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 319 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 320 | GCC_WARN_UNDECLARED_SELECTOR = YES; 321 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 322 | GCC_WARN_UNUSED_FUNCTION = YES; 323 | GCC_WARN_UNUSED_VARIABLE = YES; 324 | IPHONEOS_DEPLOYMENT_TARGET = 10.2; 325 | MTL_ENABLE_DEBUG_INFO = NO; 326 | SDKROOT = iphoneos; 327 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 328 | VALIDATE_PRODUCT = YES; 329 | }; 330 | name = Release; 331 | }; 332 | 1AEC87B51E70E5C300E3B348 /* Debug */ = { 333 | isa = XCBuildConfiguration; 334 | buildSettings = { 335 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 336 | DEVELOPMENT_TEAM = DT8726CBX4; 337 | INFOPLIST_FILE = LabelNumbersAnimation/Info.plist; 338 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 339 | PRODUCT_BUNDLE_IDENTIFIER = code4idea.com.LabelNumbersAnimation; 340 | PRODUCT_NAME = "$(TARGET_NAME)"; 341 | SWIFT_VERSION = 3.0; 342 | }; 343 | name = Debug; 344 | }; 345 | 1AEC87B61E70E5C300E3B348 /* Release */ = { 346 | isa = XCBuildConfiguration; 347 | buildSettings = { 348 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 349 | DEVELOPMENT_TEAM = DT8726CBX4; 350 | INFOPLIST_FILE = LabelNumbersAnimation/Info.plist; 351 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 352 | PRODUCT_BUNDLE_IDENTIFIER = code4idea.com.LabelNumbersAnimation; 353 | PRODUCT_NAME = "$(TARGET_NAME)"; 354 | SWIFT_VERSION = 3.0; 355 | }; 356 | name = Release; 357 | }; 358 | /* End XCBuildConfiguration section */ 359 | 360 | /* Begin XCConfigurationList section */ 361 | 1AEC879D1E70E5C300E3B348 /* Build configuration list for PBXProject "LabelNumbersAnimation" */ = { 362 | isa = XCConfigurationList; 363 | buildConfigurations = ( 364 | 1AEC87B21E70E5C300E3B348 /* Debug */, 365 | 1AEC87B31E70E5C300E3B348 /* Release */, 366 | ); 367 | defaultConfigurationIsVisible = 0; 368 | defaultConfigurationName = Release; 369 | }; 370 | 1AEC87B41E70E5C300E3B348 /* Build configuration list for PBXNativeTarget "LabelNumbersAnimation" */ = { 371 | isa = XCConfigurationList; 372 | buildConfigurations = ( 373 | 1AEC87B51E70E5C300E3B348 /* Debug */, 374 | 1AEC87B61E70E5C300E3B348 /* Release */, 375 | ); 376 | defaultConfigurationIsVisible = 0; 377 | }; 378 | /* End XCConfigurationList section */ 379 | }; 380 | rootObject = 1AEC879A1E70E5C300E3B348 /* Project object */; 381 | } 382 | --------------------------------------------------------------------------------