├── .DS_Store ├── LICENSE ├── README.md ├── TypewriterView.podspec ├── TypewriterView └── TypewriterView.swift ├── demo ├── .DS_Store ├── Podfile ├── Podfile.lock ├── Pods │ ├── Local Podspecs │ │ └── TypewriterView.podspec.json │ ├── Manifest.lock │ ├── Pods.xcodeproj │ │ ├── project.pbxproj │ │ └── xcuserdata │ │ │ └── pikacode.xcuserdatad │ │ │ └── xcschemes │ │ │ ├── Pods-demo.xcscheme │ │ │ ├── TypewriterView.xcscheme │ │ │ └── xcschememanagement.plist │ └── Target Support Files │ │ ├── Pods-demo │ │ ├── Info.plist │ │ ├── Pods-demo-acknowledgements.markdown │ │ ├── Pods-demo-acknowledgements.plist │ │ ├── Pods-demo-dummy.m │ │ ├── Pods-demo-frameworks.sh │ │ ├── Pods-demo-resources.sh │ │ ├── Pods-demo-umbrella.h │ │ ├── Pods-demo.debug.xcconfig │ │ ├── Pods-demo.modulemap │ │ └── Pods-demo.release.xcconfig │ │ └── TypewriterView │ │ ├── Info.plist │ │ ├── TypewriterView-dummy.m │ │ ├── TypewriterView-prefix.pch │ │ ├── TypewriterView-umbrella.h │ │ ├── TypewriterView.modulemap │ │ └── TypewriterView.xcconfig ├── demo.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ ├── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ │ └── xcuserdata │ │ │ └── pikacode.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ └── xcuserdata │ │ └── pikacode.xcuserdatad │ │ ├── xcdebugger │ │ └── Breakpoints_v2.xcbkptlist │ │ └── xcschemes │ │ └── xcschememanagement.plist ├── demo.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcshareddata │ │ └── IDEWorkspaceChecks.plist │ └── xcuserdata │ │ └── pikacode.xcuserdatad │ │ └── UserInterfaceState.xcuserstate └── demo │ ├── .DS_Store │ ├── AppDelegate.swift │ ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ └── Contents.json │ └── Contents.json │ ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard │ ├── Info.plist │ └── ViewController.swift └── src └── 1.gif /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pikacode/TypewriterView/a28e5dfa1c9996bffd840ed25ce4b03b41a52b4a/.DS_Store -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 pikacode 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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | Email:pikacode@qq.com 3 | 4 | 5 | # TypewriterView 6 | 7 | A simple but usefull typewriter view subclass of `UITextView`. 8 | 9 | 10 | 11 | 12 | ## Screenshot 13 | 14 | ![](src/1.gif) 15 | 16 | 17 | 18 | ## Installation 19 | 20 | use_frameworks! 21 | target 'YourTargetName' do 22 | pod 'TypewriterView' 23 | end 24 | 25 | 26 | 27 | ## Usage 28 | 29 | ##### Init 30 | 31 | ```swift 32 | let typewriterView = TypewriterView(frame: frame) 33 | ``` 34 | 35 | ##### Write 36 | 37 | ```swift 38 | /* Write */ 39 | typewriterView.write("some content") 40 | typewriterView.write("some content", speed: 0.05) 41 | 42 | /* Cursor Blink */ 43 | typewriterView.cursorBlink() 44 | typewriterView.cursorBlink("I", speed: 0.02, repeats: 5) 45 | 46 | /* Pause/Resume */ 47 | typewriterView.pause() 48 | typewriterView.resume() 49 | 50 | /* Unod */ 51 | typewriterView.undo(15) 52 | typewriterView.undo(20, speed: 0.02) 53 | ``` 54 | 55 | ##### Clear/Stop 56 | 57 | ```Swift 58 | /* Clear */ 59 | //clear text, but will not stop writing 60 | typewriterView.clear() 61 | 62 | /* Stop */ 63 | //stop writing right now, and discard unwrite contents 64 | typewriterView.stop() 65 | 66 | /* Discard Unwrite Contents */ 67 | //discard unwrite contents, but keeps writing current text 68 | typewriterView.discardUnwriteContents() 69 | ``` 70 | 71 | ##### Completion Block 72 | 73 | ```swift 74 | /* Completion Block */ 75 | typewriterView.completionBlock = { 76 | doSomeThing() 77 | } 78 | ``` 79 | 80 | ##### Status 81 | 82 | ```Swift 83 | /* Status */ 84 | typewriterView.isPausing 85 | typewriterView.isFinished 86 | ``` 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | -------------------------------------------------------------------------------- /TypewriterView.podspec: -------------------------------------------------------------------------------- 1 | 2 | 3 | Pod::Spec.new do |s| 4 | 5 | s.name = "TypewriterView" 6 | s.version = "1.0.0" 7 | s.summary = "A simple but usefull typewriter view subclass of UITextView." 8 | s.homepage = "https://github.com/pikacode/TypewriterView" 9 | s.license = "MIT" 10 | s.author = { "pikacode" => "pikacode@qq.com" } 11 | s.platform = :ios, "8.0" 12 | 13 | 14 | s.source = { :git => "https://github.com/pikacode/TypewriterView.git", :tag => "#{s.version}" } 15 | 16 | 17 | s.source_files = "TypewriterView/*.{swift}" 18 | 19 | # s.public_header_files = "TypewriterView/*.{swift}" 20 | 21 | 22 | 23 | s.frameworks = "UIKit", "Foundation" 24 | 25 | s.requires_arc = true 26 | 27 | s.swift_version = "3.3" 28 | 29 | end 30 | -------------------------------------------------------------------------------- /TypewriterView/TypewriterView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TypewriterView.swift 3 | // demo 4 | // 5 | // Created by pikacode@qq.com on 2018/1/17. 6 | // Copyright © 2018年 pikacode. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public class TypewriterView: UITextView { 12 | 13 | public var completionBlock = {} 14 | public var isFinished: Bool { 15 | return !(isPlaying || tasks.count > 0) 16 | } 17 | public var isPausing = false 18 | 19 | public func write(_ text: String, speed: TimeInterval = 0.02) { 20 | tasks.append(.write(text, speed)) 21 | writeNext() 22 | } 23 | 24 | //clear and keep writing 25 | public func clear() { 26 | tasks.append(.clear) 27 | writeNext() 28 | } 29 | 30 | public func cursorBlink(_ character: Character = "I", speed: TimeInterval = 0.4, repeats: Int = 4){ 31 | let rep = repeats%2 == 0 ? repeats : repeats + 1//必须是偶数次 32 | tasks.append(.cursorBlink(character, speed, rep)) 33 | writeNext() 34 | } 35 | 36 | public func pause(){ 37 | isPausing = true 38 | timer?.fireDate = Date.distantFuture 39 | } 40 | 41 | public func resume(){ 42 | isPausing = false 43 | timer?.fireDate = Date() 44 | } 45 | 46 | //stop writing right now, and discard unwrite contents 47 | public func stop(){ 48 | timer?.invalidate() 49 | timer = nil 50 | tasks.removeAll() 51 | completionBlock() 52 | } 53 | 54 | //discard unwrite contents, but keeps writing current text 55 | public func discardUnwriteContents(){ 56 | tasks.removeAll() 57 | } 58 | 59 | public func undo(_ length: Int, speed: TimeInterval = 0.02){ 60 | tasks.append(.undo(length, speed)) 61 | } 62 | 63 | 64 | /********************************************************************/ 65 | 66 | 67 | 68 | 69 | private var cursorBlinkRepeatTimeLast = 0 70 | private var tasks = [Task]() 71 | private var isPlaying : Bool { return timer != nil } 72 | private var undoLast = 0 73 | private var cursorBlinkCharacter: Character = "I" 74 | private var timer: Timer? 75 | private var currerentText = "" 76 | private var currerentTask = Task.write("", 0) 77 | 78 | private enum Task { 79 | case cursorBlink(Character, TimeInterval, Int) 80 | case clear 81 | case write(String, TimeInterval) 82 | case undo(Int, TimeInterval) 83 | var text: String { 84 | switch self { 85 | case .write(let t, _): 86 | return t 87 | default: 88 | return "" 89 | } 90 | } 91 | } 92 | 93 | private func writeNext() { 94 | if isPlaying { return } 95 | if tasks.count == 0 { 96 | completionBlock() 97 | return 98 | } 99 | currerentTask = tasks.removeFirst() 100 | 101 | var selector: Selector 102 | var timeInterval: TimeInterval = 0.02 103 | 104 | switch currerentTask { 105 | case .cursorBlink(let character, let speed, let repeats): 106 | 107 | cursorBlinkRepeatTimeLast = repeats 108 | timeInterval = speed 109 | cursorBlinkCharacter = character 110 | selector = #selector(cursorBlinkSelector) 111 | 112 | case .clear: 113 | 114 | selector = #selector(clearSelector) 115 | 116 | case .write(let text, let speed): 117 | 118 | currerentText = text 119 | timeInterval = speed 120 | selector = #selector(writeSelector) 121 | 122 | case .undo(let count, let speed): 123 | 124 | undoLast = count 125 | timeInterval = speed 126 | selector = #selector(undoSelector) 127 | 128 | } 129 | 130 | if timer == nil { 131 | timer = Timer.scheduledTimer(timeInterval: timeInterval, target: self, selector: selector, userInfo: nil, repeats: true) 132 | } 133 | } 134 | 135 | @objc private func writeSelector() { 136 | self.text = self.text?.appending(String(currerentText.removeFirst())) 137 | if currerentText.count == 0 { 138 | timer?.invalidate() 139 | timer = nil 140 | writeNext() 141 | } 142 | } 143 | 144 | @objc private func clearSelector() { 145 | self.text = "" 146 | timer?.invalidate() 147 | timer = nil 148 | writeNext() 149 | } 150 | 151 | @objc private func cursorBlinkSelector() { 152 | var temp = text ?? "" 153 | if let last = temp.last, last == cursorBlinkCharacter { 154 | temp = String(temp.dropLast()) 155 | }else{ 156 | temp.append(cursorBlinkCharacter) 157 | } 158 | text = temp 159 | cursorBlinkRepeatTimeLast = cursorBlinkRepeatTimeLast - 1 160 | if cursorBlinkRepeatTimeLast == 0 { 161 | timer?.invalidate() 162 | timer = nil 163 | writeNext() 164 | } 165 | } 166 | 167 | @objc private func undoSelector() { 168 | if undoLast > 0 && self.text.count > 0 { 169 | self.text.removeLast() 170 | undoLast = undoLast - 1 171 | } else { 172 | timer?.invalidate() 173 | timer = nil 174 | writeNext() 175 | } 176 | } 177 | 178 | } 179 | 180 | 181 | -------------------------------------------------------------------------------- /demo/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pikacode/TypewriterView/a28e5dfa1c9996bffd840ed25ce4b03b41a52b4a/demo/.DS_Store -------------------------------------------------------------------------------- /demo/Podfile: -------------------------------------------------------------------------------- 1 | 2 | use_frameworks! 3 | 4 | target 'demo’ do 5 | 6 | 7 | pod 'TypewriterView', :path => '../../TypewriterView/' 8 | 9 | 10 | end 11 | -------------------------------------------------------------------------------- /demo/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - TypewriterView (1.0.0) 3 | 4 | DEPENDENCIES: 5 | - TypewriterView (from `../../TypewriterView/`) 6 | 7 | EXTERNAL SOURCES: 8 | TypewriterView: 9 | :path: ../../TypewriterView/ 10 | 11 | SPEC CHECKSUMS: 12 | TypewriterView: f31371a5bce9662e903e702b00801a8380289878 13 | 14 | PODFILE CHECKSUM: d00bcafc286114cf9e7cbb916dbe563e41d0a374 15 | 16 | COCOAPODS: 1.4.0 17 | -------------------------------------------------------------------------------- /demo/Pods/Local Podspecs/TypewriterView.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "TypewriterView", 3 | "version": "1.0.0", 4 | "summary": "A simple but usefull typewriter view.", 5 | "homepage": "https://github.com/pikacode/TypewriterView", 6 | "license": "MIT", 7 | "authors": { 8 | "pikacode": "pikacode@qq.com" 9 | }, 10 | "platforms": { 11 | "ios": "8.0" 12 | }, 13 | "source": { 14 | "git": "https://github.com/pikacode/TypewriterView.git", 15 | "tag": "1.0.0" 16 | }, 17 | "source_files": "TypewriterView/*.{swift}", 18 | "frameworks": [ 19 | "UIKit", 20 | "Foundation" 21 | ], 22 | "requires_arc": true 23 | } 24 | -------------------------------------------------------------------------------- /demo/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - TypewriterView (1.0.0) 3 | 4 | DEPENDENCIES: 5 | - TypewriterView (from `../../TypewriterView/`) 6 | 7 | EXTERNAL SOURCES: 8 | TypewriterView: 9 | :path: ../../TypewriterView/ 10 | 11 | SPEC CHECKSUMS: 12 | TypewriterView: f31371a5bce9662e903e702b00801a8380289878 13 | 14 | PODFILE CHECKSUM: d00bcafc286114cf9e7cbb916dbe563e41d0a374 15 | 16 | COCOAPODS: 1.4.0 17 | -------------------------------------------------------------------------------- /demo/Pods/Pods.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 107A752F96B8052DBC20D1CED83FEF31 /* Pods-demo-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 85A31781D59DD3484E581E0080681652 /* Pods-demo-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 11 | 987E11DE106A2FD402AEF0216DC5E8E2 /* Pods-demo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = AE0CB17F6253870D3F3FDA71C0C86DC5 /* Pods-demo-dummy.m */; }; 12 | 9E02456E08ADD45F0B152858215BEA55 /* TypewriterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99475DA5A0A10CC6C726852830C1EB6F /* TypewriterView.swift */; }; 13 | 9FEE410966DE2CD07D4204D4F8BC72D3 /* TypewriterView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 638FF700ABBECD07E76BDD69FD7C309E /* TypewriterView-dummy.m */; }; 14 | A04E2A8CB8A4ED8D9CD9ABAF65E38834 /* TypewriterView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = EA5B7D7FF17DFC48FBE6240950A53759 /* TypewriterView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 15 | B00FDB2396B709EA54647B745629EA08 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D88AAE1F92055A60CC2FC970D7D34634 /* Foundation.framework */; }; 16 | EC947765FCBEDE6F42EBC0B9BBA934A2 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B63C6A64CF66340668996F78DA6BB482 /* UIKit.framework */; }; 17 | FC30B7A4E60641DF6BE4F31FD8CC9EEA /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D88AAE1F92055A60CC2FC970D7D34634 /* Foundation.framework */; }; 18 | /* End PBXBuildFile section */ 19 | 20 | /* Begin PBXContainerItemProxy section */ 21 | B7CE23BD965D173661190CDF0DEECBF0 /* PBXContainerItemProxy */ = { 22 | isa = PBXContainerItemProxy; 23 | containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 24 | proxyType = 1; 25 | remoteGlobalIDString = 3361852E73CF5C92340FE51ACF70ACC6; 26 | remoteInfo = TypewriterView; 27 | }; 28 | /* End PBXContainerItemProxy section */ 29 | 30 | /* Begin PBXFileReference section */ 31 | 1057EE440C526C2451DE45D757831FE5 /* Pods-demo-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-demo-acknowledgements.plist"; sourceTree = ""; }; 32 | 164C0786A85440C3F8E33F12E96C5AD2 /* Pods-demo.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-demo.modulemap"; sourceTree = ""; }; 33 | 3A6BA0B7EE76A2FFD1142690FB54888D /* TypewriterView.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; path = TypewriterView.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 34 | 41D0134D6B9E4E345BFE2CB0FD58CF96 /* Pods-demo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-demo.release.xcconfig"; sourceTree = ""; }; 35 | 534998E6FE006F71AC2E0DEA431705B5 /* Pods-demo-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-demo-acknowledgements.markdown"; sourceTree = ""; }; 36 | 5A496C2F7BBFD81B802877572B8BC6EB /* Pods-demo-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-demo-resources.sh"; sourceTree = ""; }; 37 | 5E81555C166138F90D81DC11EDF80329 /* TypewriterView.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = TypewriterView.modulemap; sourceTree = ""; }; 38 | 638FF700ABBECD07E76BDD69FD7C309E /* TypewriterView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "TypewriterView-dummy.m"; sourceTree = ""; }; 39 | 639AA7C54089B26573BCB72605407719 /* TypewriterView.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = TypewriterView.xcconfig; sourceTree = ""; }; 40 | 662F622F21D1B26178DE11B19B1B0AC9 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 41 | 6CE0DFF71F50724141C23DBB680087CF /* TypewriterView-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "TypewriterView-prefix.pch"; sourceTree = ""; }; 42 | 78D7A12AE211E664AA2CF101E2584AE6 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; 43 | 85A31781D59DD3484E581E0080681652 /* Pods-demo-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-demo-umbrella.h"; sourceTree = ""; }; 44 | 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 45 | 99475DA5A0A10CC6C726852830C1EB6F /* TypewriterView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TypewriterView.swift; path = TypewriterView/TypewriterView.swift; sourceTree = ""; }; 46 | 9E70E0BC1903EEACFEF69CA31B3E2454 /* TypewriterView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = TypewriterView.framework; path = TypewriterView.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 47 | A2B18CB0881D21E95BBEE3280ADD4A40 /* Pods_demo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_demo.framework; path = "Pods-demo.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 48 | AE0CB17F6253870D3F3FDA71C0C86DC5 /* Pods-demo-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-demo-dummy.m"; sourceTree = ""; }; 49 | B63C6A64CF66340668996F78DA6BB482 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; 50 | C52A5867B189ADB76E6CE6468E30440C /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 51 | D88AAE1F92055A60CC2FC970D7D34634 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 52 | DA221B41A5F467DF42BE19D62B402D20 /* Pods-demo-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-demo-frameworks.sh"; sourceTree = ""; }; 53 | E53B90CEC90358BD04A12F2DB45D1E51 /* Pods-demo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-demo.debug.xcconfig"; sourceTree = ""; }; 54 | EA5B7D7FF17DFC48FBE6240950A53759 /* TypewriterView-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "TypewriterView-umbrella.h"; sourceTree = ""; }; 55 | /* End PBXFileReference section */ 56 | 57 | /* Begin PBXFrameworksBuildPhase section */ 58 | A7C9FD61AE7E97B24E68B5014D2EE797 /* Frameworks */ = { 59 | isa = PBXFrameworksBuildPhase; 60 | buildActionMask = 2147483647; 61 | files = ( 62 | FC30B7A4E60641DF6BE4F31FD8CC9EEA /* Foundation.framework in Frameworks */, 63 | ); 64 | runOnlyForDeploymentPostprocessing = 0; 65 | }; 66 | DB479912042254528F54674DA90B9A22 /* Frameworks */ = { 67 | isa = PBXFrameworksBuildPhase; 68 | buildActionMask = 2147483647; 69 | files = ( 70 | B00FDB2396B709EA54647B745629EA08 /* Foundation.framework in Frameworks */, 71 | EC947765FCBEDE6F42EBC0B9BBA934A2 /* UIKit.framework in Frameworks */, 72 | ); 73 | runOnlyForDeploymentPostprocessing = 0; 74 | }; 75 | /* End PBXFrameworksBuildPhase section */ 76 | 77 | /* Begin PBXGroup section */ 78 | 355868735983BD062CFA02DEFAE8CE44 /* Products */ = { 79 | isa = PBXGroup; 80 | children = ( 81 | A2B18CB0881D21E95BBEE3280ADD4A40 /* Pods_demo.framework */, 82 | 9E70E0BC1903EEACFEF69CA31B3E2454 /* TypewriterView.framework */, 83 | ); 84 | name = Products; 85 | sourceTree = ""; 86 | }; 87 | 3F51E7C3DF15ECC1A4BF9C1B85DEBA2B /* Pods-demo */ = { 88 | isa = PBXGroup; 89 | children = ( 90 | C52A5867B189ADB76E6CE6468E30440C /* Info.plist */, 91 | 164C0786A85440C3F8E33F12E96C5AD2 /* Pods-demo.modulemap */, 92 | 534998E6FE006F71AC2E0DEA431705B5 /* Pods-demo-acknowledgements.markdown */, 93 | 1057EE440C526C2451DE45D757831FE5 /* Pods-demo-acknowledgements.plist */, 94 | AE0CB17F6253870D3F3FDA71C0C86DC5 /* Pods-demo-dummy.m */, 95 | DA221B41A5F467DF42BE19D62B402D20 /* Pods-demo-frameworks.sh */, 96 | 5A496C2F7BBFD81B802877572B8BC6EB /* Pods-demo-resources.sh */, 97 | 85A31781D59DD3484E581E0080681652 /* Pods-demo-umbrella.h */, 98 | E53B90CEC90358BD04A12F2DB45D1E51 /* Pods-demo.debug.xcconfig */, 99 | 41D0134D6B9E4E345BFE2CB0FD58CF96 /* Pods-demo.release.xcconfig */, 100 | ); 101 | name = "Pods-demo"; 102 | path = "Target Support Files/Pods-demo"; 103 | sourceTree = ""; 104 | }; 105 | 433CD3331B6C3787F473C941B61FC68F /* Frameworks */ = { 106 | isa = PBXGroup; 107 | children = ( 108 | 438B396F6B4147076630CAEFE34282C1 /* iOS */, 109 | ); 110 | name = Frameworks; 111 | sourceTree = ""; 112 | }; 113 | 438B396F6B4147076630CAEFE34282C1 /* iOS */ = { 114 | isa = PBXGroup; 115 | children = ( 116 | D88AAE1F92055A60CC2FC970D7D34634 /* Foundation.framework */, 117 | B63C6A64CF66340668996F78DA6BB482 /* UIKit.framework */, 118 | ); 119 | name = iOS; 120 | sourceTree = ""; 121 | }; 122 | 7DB346D0F39D3F0E887471402A8071AB = { 123 | isa = PBXGroup; 124 | children = ( 125 | 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, 126 | EA542B8B15FF03107DA9D8149DDB7AF3 /* Development Pods */, 127 | 433CD3331B6C3787F473C941B61FC68F /* Frameworks */, 128 | 355868735983BD062CFA02DEFAE8CE44 /* Products */, 129 | 85B8EB544857CCAF9FD9669CBDD18DBD /* Targets Support Files */, 130 | ); 131 | sourceTree = ""; 132 | }; 133 | 85B8EB544857CCAF9FD9669CBDD18DBD /* Targets Support Files */ = { 134 | isa = PBXGroup; 135 | children = ( 136 | 3F51E7C3DF15ECC1A4BF9C1B85DEBA2B /* Pods-demo */, 137 | ); 138 | name = "Targets Support Files"; 139 | sourceTree = ""; 140 | }; 141 | 9826B4D3252EBC0FF27CAE6D93E2B4FA /* TypewriterView */ = { 142 | isa = PBXGroup; 143 | children = ( 144 | 99475DA5A0A10CC6C726852830C1EB6F /* TypewriterView.swift */, 145 | BCAA6BC886A7F2B6708B875D33ECA97F /* Pod */, 146 | 9D65F773DCEF5A3FEB493916A7F541C5 /* Support Files */, 147 | ); 148 | name = TypewriterView; 149 | path = ../..; 150 | sourceTree = ""; 151 | }; 152 | 9D65F773DCEF5A3FEB493916A7F541C5 /* Support Files */ = { 153 | isa = PBXGroup; 154 | children = ( 155 | 662F622F21D1B26178DE11B19B1B0AC9 /* Info.plist */, 156 | 5E81555C166138F90D81DC11EDF80329 /* TypewriterView.modulemap */, 157 | 639AA7C54089B26573BCB72605407719 /* TypewriterView.xcconfig */, 158 | 638FF700ABBECD07E76BDD69FD7C309E /* TypewriterView-dummy.m */, 159 | 6CE0DFF71F50724141C23DBB680087CF /* TypewriterView-prefix.pch */, 160 | EA5B7D7FF17DFC48FBE6240950A53759 /* TypewriterView-umbrella.h */, 161 | ); 162 | name = "Support Files"; 163 | path = "demo/Pods/Target Support Files/TypewriterView"; 164 | sourceTree = ""; 165 | }; 166 | BCAA6BC886A7F2B6708B875D33ECA97F /* Pod */ = { 167 | isa = PBXGroup; 168 | children = ( 169 | 78D7A12AE211E664AA2CF101E2584AE6 /* README.md */, 170 | 3A6BA0B7EE76A2FFD1142690FB54888D /* TypewriterView.podspec */, 171 | ); 172 | name = Pod; 173 | sourceTree = ""; 174 | }; 175 | EA542B8B15FF03107DA9D8149DDB7AF3 /* Development Pods */ = { 176 | isa = PBXGroup; 177 | children = ( 178 | 9826B4D3252EBC0FF27CAE6D93E2B4FA /* TypewriterView */, 179 | ); 180 | name = "Development Pods"; 181 | sourceTree = ""; 182 | }; 183 | /* End PBXGroup section */ 184 | 185 | /* Begin PBXHeadersBuildPhase section */ 186 | 51117E5CE8170BB1B1C5BA107EAFC9D1 /* Headers */ = { 187 | isa = PBXHeadersBuildPhase; 188 | buildActionMask = 2147483647; 189 | files = ( 190 | A04E2A8CB8A4ED8D9CD9ABAF65E38834 /* TypewriterView-umbrella.h in Headers */, 191 | ); 192 | runOnlyForDeploymentPostprocessing = 0; 193 | }; 194 | D0E7C03ACFF8E5DFB680BFEFCA15A317 /* Headers */ = { 195 | isa = PBXHeadersBuildPhase; 196 | buildActionMask = 2147483647; 197 | files = ( 198 | 107A752F96B8052DBC20D1CED83FEF31 /* Pods-demo-umbrella.h in Headers */, 199 | ); 200 | runOnlyForDeploymentPostprocessing = 0; 201 | }; 202 | /* End PBXHeadersBuildPhase section */ 203 | 204 | /* Begin PBXNativeTarget section */ 205 | 0407BC32D1553B04D0EC17B08C45C34D /* Pods-demo */ = { 206 | isa = PBXNativeTarget; 207 | buildConfigurationList = FAE09816F7CD3A103DF849FB0B8819D6 /* Build configuration list for PBXNativeTarget "Pods-demo" */; 208 | buildPhases = ( 209 | 1FAC755045D9581B2BA021D472D09BC9 /* Sources */, 210 | A7C9FD61AE7E97B24E68B5014D2EE797 /* Frameworks */, 211 | D0E7C03ACFF8E5DFB680BFEFCA15A317 /* Headers */, 212 | ); 213 | buildRules = ( 214 | ); 215 | dependencies = ( 216 | F36143EB7103CD327C0769C6D18FCBF7 /* PBXTargetDependency */, 217 | ); 218 | name = "Pods-demo"; 219 | productName = "Pods-demo"; 220 | productReference = A2B18CB0881D21E95BBEE3280ADD4A40 /* Pods_demo.framework */; 221 | productType = "com.apple.product-type.framework"; 222 | }; 223 | 3361852E73CF5C92340FE51ACF70ACC6 /* TypewriterView */ = { 224 | isa = PBXNativeTarget; 225 | buildConfigurationList = F531B60AE3C65D498AD9F21BEA1AC4F4 /* Build configuration list for PBXNativeTarget "TypewriterView" */; 226 | buildPhases = ( 227 | C167A95481C9A79349CE4F5C615A89B9 /* Sources */, 228 | DB479912042254528F54674DA90B9A22 /* Frameworks */, 229 | 51117E5CE8170BB1B1C5BA107EAFC9D1 /* Headers */, 230 | ); 231 | buildRules = ( 232 | ); 233 | dependencies = ( 234 | ); 235 | name = TypewriterView; 236 | productName = TypewriterView; 237 | productReference = 9E70E0BC1903EEACFEF69CA31B3E2454 /* TypewriterView.framework */; 238 | productType = "com.apple.product-type.framework"; 239 | }; 240 | /* End PBXNativeTarget section */ 241 | 242 | /* Begin PBXProject section */ 243 | D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { 244 | isa = PBXProject; 245 | attributes = { 246 | LastSwiftUpdateCheck = 0930; 247 | LastUpgradeCheck = 0930; 248 | }; 249 | buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; 250 | compatibilityVersion = "Xcode 3.2"; 251 | developmentRegion = English; 252 | hasScannedForEncodings = 0; 253 | knownRegions = ( 254 | en, 255 | ); 256 | mainGroup = 7DB346D0F39D3F0E887471402A8071AB; 257 | productRefGroup = 355868735983BD062CFA02DEFAE8CE44 /* Products */; 258 | projectDirPath = ""; 259 | projectRoot = ""; 260 | targets = ( 261 | 0407BC32D1553B04D0EC17B08C45C34D /* Pods-demo */, 262 | 3361852E73CF5C92340FE51ACF70ACC6 /* TypewriterView */, 263 | ); 264 | }; 265 | /* End PBXProject section */ 266 | 267 | /* Begin PBXSourcesBuildPhase section */ 268 | 1FAC755045D9581B2BA021D472D09BC9 /* Sources */ = { 269 | isa = PBXSourcesBuildPhase; 270 | buildActionMask = 2147483647; 271 | files = ( 272 | 987E11DE106A2FD402AEF0216DC5E8E2 /* Pods-demo-dummy.m in Sources */, 273 | ); 274 | runOnlyForDeploymentPostprocessing = 0; 275 | }; 276 | C167A95481C9A79349CE4F5C615A89B9 /* Sources */ = { 277 | isa = PBXSourcesBuildPhase; 278 | buildActionMask = 2147483647; 279 | files = ( 280 | 9FEE410966DE2CD07D4204D4F8BC72D3 /* TypewriterView-dummy.m in Sources */, 281 | 9E02456E08ADD45F0B152858215BEA55 /* TypewriterView.swift in Sources */, 282 | ); 283 | runOnlyForDeploymentPostprocessing = 0; 284 | }; 285 | /* End PBXSourcesBuildPhase section */ 286 | 287 | /* Begin PBXTargetDependency section */ 288 | F36143EB7103CD327C0769C6D18FCBF7 /* PBXTargetDependency */ = { 289 | isa = PBXTargetDependency; 290 | name = TypewriterView; 291 | target = 3361852E73CF5C92340FE51ACF70ACC6 /* TypewriterView */; 292 | targetProxy = B7CE23BD965D173661190CDF0DEECBF0 /* PBXContainerItemProxy */; 293 | }; 294 | /* End PBXTargetDependency section */ 295 | 296 | /* Begin XCBuildConfiguration section */ 297 | 4357DCB1FE9616CFEC85B74987A2C994 /* Release */ = { 298 | isa = XCBuildConfiguration; 299 | baseConfigurationReference = 639AA7C54089B26573BCB72605407719 /* TypewriterView.xcconfig */; 300 | buildSettings = { 301 | CODE_SIGN_IDENTITY = ""; 302 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 303 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 304 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 305 | CURRENT_PROJECT_VERSION = 1; 306 | DEFINES_MODULE = YES; 307 | DYLIB_COMPATIBILITY_VERSION = 1; 308 | DYLIB_CURRENT_VERSION = 1; 309 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 310 | GCC_PREFIX_HEADER = "Target Support Files/TypewriterView/TypewriterView-prefix.pch"; 311 | INFOPLIST_FILE = "Target Support Files/TypewriterView/Info.plist"; 312 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 313 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 314 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 315 | MODULEMAP_FILE = "Target Support Files/TypewriterView/TypewriterView.modulemap"; 316 | PRODUCT_NAME = TypewriterView; 317 | SDKROOT = iphoneos; 318 | SKIP_INSTALL = YES; 319 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 320 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 321 | SWIFT_VERSION = 4.0; 322 | TARGETED_DEVICE_FAMILY = "1,2"; 323 | VALIDATE_PRODUCT = YES; 324 | VERSIONING_SYSTEM = "apple-generic"; 325 | VERSION_INFO_PREFIX = ""; 326 | }; 327 | name = Release; 328 | }; 329 | 675091815B46A9C397152070897B7475 /* Debug */ = { 330 | isa = XCBuildConfiguration; 331 | baseConfigurationReference = 639AA7C54089B26573BCB72605407719 /* TypewriterView.xcconfig */; 332 | buildSettings = { 333 | CODE_SIGN_IDENTITY = ""; 334 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 335 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 336 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 337 | CURRENT_PROJECT_VERSION = 1; 338 | DEFINES_MODULE = YES; 339 | DYLIB_COMPATIBILITY_VERSION = 1; 340 | DYLIB_CURRENT_VERSION = 1; 341 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 342 | GCC_PREFIX_HEADER = "Target Support Files/TypewriterView/TypewriterView-prefix.pch"; 343 | INFOPLIST_FILE = "Target Support Files/TypewriterView/Info.plist"; 344 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 345 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 346 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 347 | MODULEMAP_FILE = "Target Support Files/TypewriterView/TypewriterView.modulemap"; 348 | PRODUCT_NAME = TypewriterView; 349 | SDKROOT = iphoneos; 350 | SKIP_INSTALL = YES; 351 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 352 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 353 | SWIFT_VERSION = 4.0; 354 | TARGETED_DEVICE_FAMILY = "1,2"; 355 | VERSIONING_SYSTEM = "apple-generic"; 356 | VERSION_INFO_PREFIX = ""; 357 | }; 358 | name = Debug; 359 | }; 360 | A20B0BDFC4838E55DCAD094ED2792393 /* Release */ = { 361 | isa = XCBuildConfiguration; 362 | buildSettings = { 363 | ALWAYS_SEARCH_USER_PATHS = NO; 364 | CLANG_ANALYZER_NONNULL = YES; 365 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 366 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 367 | CLANG_CXX_LIBRARY = "libc++"; 368 | CLANG_ENABLE_MODULES = YES; 369 | CLANG_ENABLE_OBJC_ARC = YES; 370 | CLANG_ENABLE_OBJC_WEAK = YES; 371 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 372 | CLANG_WARN_BOOL_CONVERSION = YES; 373 | CLANG_WARN_COMMA = YES; 374 | CLANG_WARN_CONSTANT_CONVERSION = YES; 375 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 376 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 377 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 378 | CLANG_WARN_EMPTY_BODY = YES; 379 | CLANG_WARN_ENUM_CONVERSION = YES; 380 | CLANG_WARN_INFINITE_RECURSION = YES; 381 | CLANG_WARN_INT_CONVERSION = YES; 382 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 383 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 384 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 385 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 386 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 387 | CLANG_WARN_STRICT_PROTOTYPES = YES; 388 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 389 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 390 | CLANG_WARN_UNREACHABLE_CODE = YES; 391 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 392 | CODE_SIGNING_REQUIRED = NO; 393 | COPY_PHASE_STRIP = NO; 394 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 395 | ENABLE_NS_ASSERTIONS = NO; 396 | ENABLE_STRICT_OBJC_MSGSEND = YES; 397 | GCC_C_LANGUAGE_STANDARD = gnu11; 398 | GCC_NO_COMMON_BLOCKS = YES; 399 | GCC_PREPROCESSOR_DEFINITIONS = ( 400 | "POD_CONFIGURATION_RELEASE=1", 401 | "$(inherited)", 402 | ); 403 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 404 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 405 | GCC_WARN_UNDECLARED_SELECTOR = YES; 406 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 407 | GCC_WARN_UNUSED_FUNCTION = YES; 408 | GCC_WARN_UNUSED_VARIABLE = YES; 409 | IPHONEOS_DEPLOYMENT_TARGET = 11.3; 410 | MTL_ENABLE_DEBUG_INFO = NO; 411 | PRODUCT_NAME = "$(TARGET_NAME)"; 412 | PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; 413 | STRIP_INSTALLED_PRODUCT = NO; 414 | SYMROOT = "${SRCROOT}/../build"; 415 | }; 416 | name = Release; 417 | }; 418 | B53EDD60891CA0A99618C4BA3DEEBB79 /* Debug */ = { 419 | isa = XCBuildConfiguration; 420 | buildSettings = { 421 | ALWAYS_SEARCH_USER_PATHS = NO; 422 | CLANG_ANALYZER_NONNULL = YES; 423 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 424 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 425 | CLANG_CXX_LIBRARY = "libc++"; 426 | CLANG_ENABLE_MODULES = YES; 427 | CLANG_ENABLE_OBJC_ARC = YES; 428 | CLANG_ENABLE_OBJC_WEAK = YES; 429 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 430 | CLANG_WARN_BOOL_CONVERSION = YES; 431 | CLANG_WARN_COMMA = YES; 432 | CLANG_WARN_CONSTANT_CONVERSION = YES; 433 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 434 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 435 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 436 | CLANG_WARN_EMPTY_BODY = YES; 437 | CLANG_WARN_ENUM_CONVERSION = YES; 438 | CLANG_WARN_INFINITE_RECURSION = YES; 439 | CLANG_WARN_INT_CONVERSION = YES; 440 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 441 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 442 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 443 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 444 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 445 | CLANG_WARN_STRICT_PROTOTYPES = YES; 446 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 447 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 448 | CLANG_WARN_UNREACHABLE_CODE = YES; 449 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 450 | CODE_SIGNING_REQUIRED = NO; 451 | COPY_PHASE_STRIP = NO; 452 | DEBUG_INFORMATION_FORMAT = dwarf; 453 | ENABLE_STRICT_OBJC_MSGSEND = YES; 454 | ENABLE_TESTABILITY = YES; 455 | GCC_C_LANGUAGE_STANDARD = gnu11; 456 | GCC_DYNAMIC_NO_PIC = NO; 457 | GCC_NO_COMMON_BLOCKS = YES; 458 | GCC_OPTIMIZATION_LEVEL = 0; 459 | GCC_PREPROCESSOR_DEFINITIONS = ( 460 | "POD_CONFIGURATION_DEBUG=1", 461 | "DEBUG=1", 462 | "$(inherited)", 463 | ); 464 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 465 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 466 | GCC_WARN_UNDECLARED_SELECTOR = YES; 467 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 468 | GCC_WARN_UNUSED_FUNCTION = YES; 469 | GCC_WARN_UNUSED_VARIABLE = YES; 470 | IPHONEOS_DEPLOYMENT_TARGET = 11.3; 471 | MTL_ENABLE_DEBUG_INFO = YES; 472 | ONLY_ACTIVE_ARCH = YES; 473 | PRODUCT_NAME = "$(TARGET_NAME)"; 474 | PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; 475 | STRIP_INSTALLED_PRODUCT = NO; 476 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 477 | SYMROOT = "${SRCROOT}/../build"; 478 | }; 479 | name = Debug; 480 | }; 481 | B954AD5DCBB39E2E6FC2FB7FA1956BD8 /* Debug */ = { 482 | isa = XCBuildConfiguration; 483 | baseConfigurationReference = E53B90CEC90358BD04A12F2DB45D1E51 /* Pods-demo.debug.xcconfig */; 484 | buildSettings = { 485 | CLANG_ENABLE_OBJC_WEAK = NO; 486 | CODE_SIGN_IDENTITY = ""; 487 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 488 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 489 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 490 | CURRENT_PROJECT_VERSION = 1; 491 | DEFINES_MODULE = YES; 492 | DYLIB_COMPATIBILITY_VERSION = 1; 493 | DYLIB_CURRENT_VERSION = 1; 494 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 495 | INFOPLIST_FILE = "Target Support Files/Pods-demo/Info.plist"; 496 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 497 | IPHONEOS_DEPLOYMENT_TARGET = 11.3; 498 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 499 | MACH_O_TYPE = staticlib; 500 | MODULEMAP_FILE = "Target Support Files/Pods-demo/Pods-demo.modulemap"; 501 | OTHER_LDFLAGS = ""; 502 | OTHER_LIBTOOLFLAGS = ""; 503 | PODS_ROOT = "$(SRCROOT)"; 504 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 505 | PRODUCT_NAME = Pods_demo; 506 | SDKROOT = iphoneos; 507 | SKIP_INSTALL = YES; 508 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 509 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 510 | TARGETED_DEVICE_FAMILY = "1,2"; 511 | VERSIONING_SYSTEM = "apple-generic"; 512 | VERSION_INFO_PREFIX = ""; 513 | }; 514 | name = Debug; 515 | }; 516 | BFB37169BA89BE709FCAA478A8900F63 /* Release */ = { 517 | isa = XCBuildConfiguration; 518 | baseConfigurationReference = 41D0134D6B9E4E345BFE2CB0FD58CF96 /* Pods-demo.release.xcconfig */; 519 | buildSettings = { 520 | CLANG_ENABLE_OBJC_WEAK = NO; 521 | CODE_SIGN_IDENTITY = ""; 522 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 523 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 524 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 525 | CURRENT_PROJECT_VERSION = 1; 526 | DEFINES_MODULE = YES; 527 | DYLIB_COMPATIBILITY_VERSION = 1; 528 | DYLIB_CURRENT_VERSION = 1; 529 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 530 | INFOPLIST_FILE = "Target Support Files/Pods-demo/Info.plist"; 531 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 532 | IPHONEOS_DEPLOYMENT_TARGET = 11.3; 533 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 534 | MACH_O_TYPE = staticlib; 535 | MODULEMAP_FILE = "Target Support Files/Pods-demo/Pods-demo.modulemap"; 536 | OTHER_LDFLAGS = ""; 537 | OTHER_LIBTOOLFLAGS = ""; 538 | PODS_ROOT = "$(SRCROOT)"; 539 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 540 | PRODUCT_NAME = Pods_demo; 541 | SDKROOT = iphoneos; 542 | SKIP_INSTALL = YES; 543 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 544 | TARGETED_DEVICE_FAMILY = "1,2"; 545 | VALIDATE_PRODUCT = YES; 546 | VERSIONING_SYSTEM = "apple-generic"; 547 | VERSION_INFO_PREFIX = ""; 548 | }; 549 | name = Release; 550 | }; 551 | /* End XCBuildConfiguration section */ 552 | 553 | /* Begin XCConfigurationList section */ 554 | 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { 555 | isa = XCConfigurationList; 556 | buildConfigurations = ( 557 | B53EDD60891CA0A99618C4BA3DEEBB79 /* Debug */, 558 | A20B0BDFC4838E55DCAD094ED2792393 /* Release */, 559 | ); 560 | defaultConfigurationIsVisible = 0; 561 | defaultConfigurationName = Release; 562 | }; 563 | F531B60AE3C65D498AD9F21BEA1AC4F4 /* Build configuration list for PBXNativeTarget "TypewriterView" */ = { 564 | isa = XCConfigurationList; 565 | buildConfigurations = ( 566 | 675091815B46A9C397152070897B7475 /* Debug */, 567 | 4357DCB1FE9616CFEC85B74987A2C994 /* Release */, 568 | ); 569 | defaultConfigurationIsVisible = 0; 570 | defaultConfigurationName = Release; 571 | }; 572 | FAE09816F7CD3A103DF849FB0B8819D6 /* Build configuration list for PBXNativeTarget "Pods-demo" */ = { 573 | isa = XCConfigurationList; 574 | buildConfigurations = ( 575 | B954AD5DCBB39E2E6FC2FB7FA1956BD8 /* Debug */, 576 | BFB37169BA89BE709FCAA478A8900F63 /* Release */, 577 | ); 578 | defaultConfigurationIsVisible = 0; 579 | defaultConfigurationName = Release; 580 | }; 581 | /* End XCConfigurationList section */ 582 | }; 583 | rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 584 | } 585 | -------------------------------------------------------------------------------- /demo/Pods/Pods.xcodeproj/xcuserdata/pikacode.xcuserdatad/xcschemes/Pods-demo.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 66 | 67 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /demo/Pods/Pods.xcodeproj/xcuserdata/pikacode.xcuserdatad/xcschemes/TypewriterView.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 44 | 45 | 46 | 52 | 53 | 55 | 56 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /demo/Pods/Pods.xcodeproj/xcuserdata/pikacode.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Pods-demo.xcscheme 8 | 9 | isShown 10 | 11 | orderHint 12 | 0 13 | 14 | TypewriterView.xcscheme 15 | 16 | isShown 17 | 18 | orderHint 19 | 1 20 | 21 | 22 | SuppressBuildableAutocreation 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /demo/Pods/Target Support Files/Pods-demo/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 | -------------------------------------------------------------------------------- /demo/Pods/Target Support Files/Pods-demo/Pods-demo-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | Generated by CocoaPods - https://cocoapods.org 4 | -------------------------------------------------------------------------------- /demo/Pods/Target Support Files/Pods-demo/Pods-demo-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 | Generated by CocoaPods - https://cocoapods.org 18 | Title 19 | 20 | Type 21 | PSGroupSpecifier 22 | 23 | 24 | StringsTable 25 | Acknowledgements 26 | Title 27 | Acknowledgements 28 | 29 | 30 | -------------------------------------------------------------------------------- /demo/Pods/Target Support Files/Pods-demo/Pods-demo-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_demo : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_demo 5 | @end 6 | -------------------------------------------------------------------------------- /demo/Pods/Target Support Files/Pods-demo/Pods-demo-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 | # Used as a return value for each invocation of `strip_invalid_archs` function. 10 | STRIP_BINARY_RETVAL=0 11 | 12 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 13 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 14 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 15 | 16 | # Copies and strips a vendored framework 17 | install_framework() 18 | { 19 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 20 | local source="${BUILT_PRODUCTS_DIR}/$1" 21 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 22 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 23 | elif [ -r "$1" ]; then 24 | local source="$1" 25 | fi 26 | 27 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 28 | 29 | if [ -L "${source}" ]; then 30 | echo "Symlinked..." 31 | source="$(readlink "${source}")" 32 | fi 33 | 34 | # Use filter instead of exclude so missing patterns don't throw errors. 35 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 36 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 37 | 38 | local basename 39 | basename="$(basename -s .framework "$1")" 40 | binary="${destination}/${basename}.framework/${basename}" 41 | if ! [ -r "$binary" ]; then 42 | binary="${destination}/${basename}" 43 | fi 44 | 45 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 46 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 47 | strip_invalid_archs "$binary" 48 | fi 49 | 50 | # Resign the code if required by the build settings to avoid unstable apps 51 | code_sign_if_enabled "${destination}/$(basename "$1")" 52 | 53 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 54 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 55 | local swift_runtime_libs 56 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) 57 | for lib in $swift_runtime_libs; do 58 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 59 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 60 | code_sign_if_enabled "${destination}/${lib}" 61 | done 62 | fi 63 | } 64 | 65 | # Copies and strips a vendored dSYM 66 | install_dsym() { 67 | local source="$1" 68 | if [ -r "$source" ]; then 69 | # Copy the dSYM into a the targets temp dir. 70 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" 71 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" 72 | 73 | local basename 74 | basename="$(basename -s .framework.dSYM "$source")" 75 | binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" 76 | 77 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 78 | if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then 79 | strip_invalid_archs "$binary" 80 | fi 81 | 82 | if [[ $STRIP_BINARY_RETVAL == 1 ]]; then 83 | # Move the stripped file into its final destination. 84 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" 85 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}" 86 | else 87 | # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. 88 | touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" 89 | fi 90 | fi 91 | } 92 | 93 | # Signs a framework with the provided identity 94 | code_sign_if_enabled() { 95 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 96 | # Use the current code_sign_identitiy 97 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 98 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements '$1'" 99 | 100 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 101 | code_sign_cmd="$code_sign_cmd &" 102 | fi 103 | echo "$code_sign_cmd" 104 | eval "$code_sign_cmd" 105 | fi 106 | } 107 | 108 | # Strip invalid architectures 109 | strip_invalid_archs() { 110 | binary="$1" 111 | # Get architectures for current target binary 112 | binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" 113 | # Intersect them with the architectures we are building for 114 | intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" 115 | # If there are no archs supported by this binary then warn the user 116 | if [[ -z "$intersected_archs" ]]; then 117 | echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." 118 | STRIP_BINARY_RETVAL=0 119 | return 120 | fi 121 | stripped="" 122 | for arch in $binary_archs; do 123 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then 124 | # Strip non-valid architectures in-place 125 | lipo -remove "$arch" -output "$binary" "$binary" || exit 1 126 | stripped="$stripped $arch" 127 | fi 128 | done 129 | if [[ "$stripped" ]]; then 130 | echo "Stripped $binary of architectures:$stripped" 131 | fi 132 | STRIP_BINARY_RETVAL=1 133 | } 134 | 135 | 136 | if [[ "$CONFIGURATION" == "Debug" ]]; then 137 | install_framework "${BUILT_PRODUCTS_DIR}/TypewriterView/TypewriterView.framework" 138 | fi 139 | if [[ "$CONFIGURATION" == "Release" ]]; then 140 | install_framework "${BUILT_PRODUCTS_DIR}/TypewriterView/TypewriterView.framework" 141 | fi 142 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 143 | wait 144 | fi 145 | -------------------------------------------------------------------------------- /demo/Pods/Target Support Files/Pods-demo/Pods-demo-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 | -------------------------------------------------------------------------------- /demo/Pods/Target Support Files/Pods-demo/Pods-demo-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_demoVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_demoVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /demo/Pods/Target Support Files/Pods-demo/Pods-demo.debug.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/TypewriterView" 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}/TypewriterView/TypewriterView.framework/Headers" 6 | OTHER_LDFLAGS = $(inherited) -framework "TypewriterView" 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 | -------------------------------------------------------------------------------- /demo/Pods/Target Support Files/Pods-demo/Pods-demo.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_demo { 2 | umbrella header "Pods-demo-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /demo/Pods/Target Support Files/Pods-demo/Pods-demo.release.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/TypewriterView" 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}/TypewriterView/TypewriterView.framework/Headers" 6 | OTHER_LDFLAGS = $(inherited) -framework "TypewriterView" 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 | -------------------------------------------------------------------------------- /demo/Pods/Target Support Files/TypewriterView/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 | -------------------------------------------------------------------------------- /demo/Pods/Target Support Files/TypewriterView/TypewriterView-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_TypewriterView : NSObject 3 | @end 4 | @implementation PodsDummy_TypewriterView 5 | @end 6 | -------------------------------------------------------------------------------- /demo/Pods/Target Support Files/TypewriterView/TypewriterView-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 | -------------------------------------------------------------------------------- /demo/Pods/Target Support Files/TypewriterView/TypewriterView-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 TypewriterViewVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char TypewriterViewVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /demo/Pods/Target Support Files/TypewriterView/TypewriterView.modulemap: -------------------------------------------------------------------------------- 1 | framework module TypewriterView { 2 | umbrella header "TypewriterView-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /demo/Pods/Target Support Files/TypewriterView/TypewriterView.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/TypewriterView 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" 4 | OTHER_LDFLAGS = -framework "Foundation" -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}/../.. 10 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 11 | SKIP_INSTALL = YES 12 | -------------------------------------------------------------------------------- /demo/demo.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | DFF55512649F187708BC504B /* Pods_demo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 175F1408079F26EFF70CBE65 /* Pods_demo.framework */; }; 11 | FAC3D278207E016F00F36052 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAC3D277207E016F00F36052 /* AppDelegate.swift */; }; 12 | FAC3D27A207E016F00F36052 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAC3D279207E016F00F36052 /* ViewController.swift */; }; 13 | FAC3D27D207E016F00F36052 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FAC3D27B207E016F00F36052 /* Main.storyboard */; }; 14 | FAC3D27F207E017200F36052 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FAC3D27E207E017200F36052 /* Assets.xcassets */; }; 15 | FAC3D282207E017200F36052 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FAC3D280207E017200F36052 /* LaunchScreen.storyboard */; }; 16 | /* End PBXBuildFile section */ 17 | 18 | /* Begin PBXFileReference section */ 19 | 06A340DDF6002A3D25BD56FD /* Pods-demo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo.release.xcconfig"; path = "Pods/Target Support Files/Pods-demo/Pods-demo.release.xcconfig"; sourceTree = ""; }; 20 | 175F1408079F26EFF70CBE65 /* Pods_demo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_demo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 21 | 8A43CDC1248B1DB716A48311 /* Pods-demo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo.debug.xcconfig"; path = "Pods/Target Support Files/Pods-demo/Pods-demo.debug.xcconfig"; sourceTree = ""; }; 22 | FAC3D274207E016F00F36052 /* demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = demo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 23 | FAC3D277207E016F00F36052 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 24 | FAC3D279207E016F00F36052 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 25 | FAC3D27C207E016F00F36052 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 26 | FAC3D27E207E017200F36052 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 27 | FAC3D281207E017200F36052 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 28 | FAC3D283207E017200F36052 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 29 | /* End PBXFileReference section */ 30 | 31 | /* Begin PBXFrameworksBuildPhase section */ 32 | FAC3D271207E016F00F36052 /* Frameworks */ = { 33 | isa = PBXFrameworksBuildPhase; 34 | buildActionMask = 2147483647; 35 | files = ( 36 | DFF55512649F187708BC504B /* Pods_demo.framework in Frameworks */, 37 | ); 38 | runOnlyForDeploymentPostprocessing = 0; 39 | }; 40 | /* End PBXFrameworksBuildPhase section */ 41 | 42 | /* Begin PBXGroup section */ 43 | 82DAE2CD095A625F3861E8B7 /* Frameworks */ = { 44 | isa = PBXGroup; 45 | children = ( 46 | 175F1408079F26EFF70CBE65 /* Pods_demo.framework */, 47 | ); 48 | name = Frameworks; 49 | sourceTree = ""; 50 | }; 51 | AD109816348A95DDAB71F273 /* Pods */ = { 52 | isa = PBXGroup; 53 | children = ( 54 | 8A43CDC1248B1DB716A48311 /* Pods-demo.debug.xcconfig */, 55 | 06A340DDF6002A3D25BD56FD /* Pods-demo.release.xcconfig */, 56 | ); 57 | name = Pods; 58 | sourceTree = ""; 59 | }; 60 | FAC3D26B207E016F00F36052 = { 61 | isa = PBXGroup; 62 | children = ( 63 | FAC3D276207E016F00F36052 /* demo */, 64 | FAC3D275207E016F00F36052 /* Products */, 65 | AD109816348A95DDAB71F273 /* Pods */, 66 | 82DAE2CD095A625F3861E8B7 /* Frameworks */, 67 | ); 68 | sourceTree = ""; 69 | }; 70 | FAC3D275207E016F00F36052 /* Products */ = { 71 | isa = PBXGroup; 72 | children = ( 73 | FAC3D274207E016F00F36052 /* demo.app */, 74 | ); 75 | name = Products; 76 | sourceTree = ""; 77 | }; 78 | FAC3D276207E016F00F36052 /* demo */ = { 79 | isa = PBXGroup; 80 | children = ( 81 | FAC3D277207E016F00F36052 /* AppDelegate.swift */, 82 | FAC3D279207E016F00F36052 /* ViewController.swift */, 83 | FAC3D27B207E016F00F36052 /* Main.storyboard */, 84 | FAC3D27E207E017200F36052 /* Assets.xcassets */, 85 | FAC3D280207E017200F36052 /* LaunchScreen.storyboard */, 86 | FAC3D283207E017200F36052 /* Info.plist */, 87 | ); 88 | path = demo; 89 | sourceTree = ""; 90 | }; 91 | /* End PBXGroup section */ 92 | 93 | /* Begin PBXNativeTarget section */ 94 | FAC3D273207E016F00F36052 /* demo */ = { 95 | isa = PBXNativeTarget; 96 | buildConfigurationList = FAC3D286207E017200F36052 /* Build configuration list for PBXNativeTarget "demo" */; 97 | buildPhases = ( 98 | FADC0E4544ADF8076CEEF443 /* [CP] Check Pods Manifest.lock */, 99 | FAC3D270207E016F00F36052 /* Sources */, 100 | FAC3D271207E016F00F36052 /* Frameworks */, 101 | FAC3D272207E016F00F36052 /* Resources */, 102 | 64A76D31A5DC364EEA055A6A /* [CP] Embed Pods Frameworks */, 103 | 34450FA92314FB2142C6DCB6 /* [CP] Copy Pods Resources */, 104 | ); 105 | buildRules = ( 106 | ); 107 | dependencies = ( 108 | ); 109 | name = demo; 110 | productName = demo; 111 | productReference = FAC3D274207E016F00F36052 /* demo.app */; 112 | productType = "com.apple.product-type.application"; 113 | }; 114 | /* End PBXNativeTarget section */ 115 | 116 | /* Begin PBXProject section */ 117 | FAC3D26C207E016F00F36052 /* Project object */ = { 118 | isa = PBXProject; 119 | attributes = { 120 | LastSwiftUpdateCheck = 0930; 121 | LastUpgradeCheck = 0930; 122 | ORGANIZATIONNAME = pikacode; 123 | TargetAttributes = { 124 | FAC3D273207E016F00F36052 = { 125 | CreatedOnToolsVersion = 9.3; 126 | }; 127 | }; 128 | }; 129 | buildConfigurationList = FAC3D26F207E016F00F36052 /* Build configuration list for PBXProject "demo" */; 130 | compatibilityVersion = "Xcode 9.3"; 131 | developmentRegion = en; 132 | hasScannedForEncodings = 0; 133 | knownRegions = ( 134 | en, 135 | Base, 136 | ); 137 | mainGroup = FAC3D26B207E016F00F36052; 138 | productRefGroup = FAC3D275207E016F00F36052 /* Products */; 139 | projectDirPath = ""; 140 | projectRoot = ""; 141 | targets = ( 142 | FAC3D273207E016F00F36052 /* demo */, 143 | ); 144 | }; 145 | /* End PBXProject section */ 146 | 147 | /* Begin PBXResourcesBuildPhase section */ 148 | FAC3D272207E016F00F36052 /* Resources */ = { 149 | isa = PBXResourcesBuildPhase; 150 | buildActionMask = 2147483647; 151 | files = ( 152 | FAC3D282207E017200F36052 /* LaunchScreen.storyboard in Resources */, 153 | FAC3D27F207E017200F36052 /* Assets.xcassets in Resources */, 154 | FAC3D27D207E016F00F36052 /* Main.storyboard in Resources */, 155 | ); 156 | runOnlyForDeploymentPostprocessing = 0; 157 | }; 158 | /* End PBXResourcesBuildPhase section */ 159 | 160 | /* Begin PBXShellScriptBuildPhase section */ 161 | 34450FA92314FB2142C6DCB6 /* [CP] Copy Pods Resources */ = { 162 | isa = PBXShellScriptBuildPhase; 163 | buildActionMask = 2147483647; 164 | files = ( 165 | ); 166 | inputPaths = ( 167 | ); 168 | name = "[CP] Copy Pods Resources"; 169 | outputPaths = ( 170 | ); 171 | runOnlyForDeploymentPostprocessing = 0; 172 | shellPath = /bin/sh; 173 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-demo/Pods-demo-resources.sh\"\n"; 174 | showEnvVarsInLog = 0; 175 | }; 176 | 64A76D31A5DC364EEA055A6A /* [CP] Embed Pods Frameworks */ = { 177 | isa = PBXShellScriptBuildPhase; 178 | buildActionMask = 2147483647; 179 | files = ( 180 | ); 181 | inputPaths = ( 182 | "${SRCROOT}/Pods/Target Support Files/Pods-demo/Pods-demo-frameworks.sh", 183 | "${BUILT_PRODUCTS_DIR}/TypewriterView/TypewriterView.framework", 184 | ); 185 | name = "[CP] Embed Pods Frameworks"; 186 | outputPaths = ( 187 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/TypewriterView.framework", 188 | ); 189 | runOnlyForDeploymentPostprocessing = 0; 190 | shellPath = /bin/sh; 191 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-demo/Pods-demo-frameworks.sh\"\n"; 192 | showEnvVarsInLog = 0; 193 | }; 194 | FADC0E4544ADF8076CEEF443 /* [CP] Check Pods Manifest.lock */ = { 195 | isa = PBXShellScriptBuildPhase; 196 | buildActionMask = 2147483647; 197 | files = ( 198 | ); 199 | inputPaths = ( 200 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 201 | "${PODS_ROOT}/Manifest.lock", 202 | ); 203 | name = "[CP] Check Pods Manifest.lock"; 204 | outputPaths = ( 205 | "$(DERIVED_FILE_DIR)/Pods-demo-checkManifestLockResult.txt", 206 | ); 207 | runOnlyForDeploymentPostprocessing = 0; 208 | shellPath = /bin/sh; 209 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 210 | showEnvVarsInLog = 0; 211 | }; 212 | /* End PBXShellScriptBuildPhase section */ 213 | 214 | /* Begin PBXSourcesBuildPhase section */ 215 | FAC3D270207E016F00F36052 /* Sources */ = { 216 | isa = PBXSourcesBuildPhase; 217 | buildActionMask = 2147483647; 218 | files = ( 219 | FAC3D27A207E016F00F36052 /* ViewController.swift in Sources */, 220 | FAC3D278207E016F00F36052 /* AppDelegate.swift in Sources */, 221 | ); 222 | runOnlyForDeploymentPostprocessing = 0; 223 | }; 224 | /* End PBXSourcesBuildPhase section */ 225 | 226 | /* Begin PBXVariantGroup section */ 227 | FAC3D27B207E016F00F36052 /* Main.storyboard */ = { 228 | isa = PBXVariantGroup; 229 | children = ( 230 | FAC3D27C207E016F00F36052 /* Base */, 231 | ); 232 | name = Main.storyboard; 233 | sourceTree = ""; 234 | }; 235 | FAC3D280207E017200F36052 /* LaunchScreen.storyboard */ = { 236 | isa = PBXVariantGroup; 237 | children = ( 238 | FAC3D281207E017200F36052 /* Base */, 239 | ); 240 | name = LaunchScreen.storyboard; 241 | sourceTree = ""; 242 | }; 243 | /* End PBXVariantGroup section */ 244 | 245 | /* Begin XCBuildConfiguration section */ 246 | FAC3D284207E017200F36052 /* Debug */ = { 247 | isa = XCBuildConfiguration; 248 | buildSettings = { 249 | ALWAYS_SEARCH_USER_PATHS = NO; 250 | CLANG_ANALYZER_NONNULL = YES; 251 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 252 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 253 | CLANG_CXX_LIBRARY = "libc++"; 254 | CLANG_ENABLE_MODULES = YES; 255 | CLANG_ENABLE_OBJC_ARC = YES; 256 | CLANG_ENABLE_OBJC_WEAK = YES; 257 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 258 | CLANG_WARN_BOOL_CONVERSION = YES; 259 | CLANG_WARN_COMMA = YES; 260 | CLANG_WARN_CONSTANT_CONVERSION = YES; 261 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 262 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 263 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 264 | CLANG_WARN_EMPTY_BODY = YES; 265 | CLANG_WARN_ENUM_CONVERSION = YES; 266 | CLANG_WARN_INFINITE_RECURSION = YES; 267 | CLANG_WARN_INT_CONVERSION = YES; 268 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 269 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 270 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 271 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 272 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 273 | CLANG_WARN_STRICT_PROTOTYPES = YES; 274 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 275 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 276 | CLANG_WARN_UNREACHABLE_CODE = YES; 277 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 278 | CODE_SIGN_IDENTITY = "iPhone Developer"; 279 | COPY_PHASE_STRIP = NO; 280 | DEBUG_INFORMATION_FORMAT = dwarf; 281 | ENABLE_STRICT_OBJC_MSGSEND = YES; 282 | ENABLE_TESTABILITY = YES; 283 | GCC_C_LANGUAGE_STANDARD = gnu11; 284 | GCC_DYNAMIC_NO_PIC = NO; 285 | GCC_NO_COMMON_BLOCKS = YES; 286 | GCC_OPTIMIZATION_LEVEL = 0; 287 | GCC_PREPROCESSOR_DEFINITIONS = ( 288 | "DEBUG=1", 289 | "$(inherited)", 290 | ); 291 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 292 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 293 | GCC_WARN_UNDECLARED_SELECTOR = YES; 294 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 295 | GCC_WARN_UNUSED_FUNCTION = YES; 296 | GCC_WARN_UNUSED_VARIABLE = YES; 297 | IPHONEOS_DEPLOYMENT_TARGET = 11.3; 298 | MTL_ENABLE_DEBUG_INFO = YES; 299 | ONLY_ACTIVE_ARCH = YES; 300 | SDKROOT = iphoneos; 301 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 302 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 303 | }; 304 | name = Debug; 305 | }; 306 | FAC3D285207E017200F36052 /* Release */ = { 307 | isa = XCBuildConfiguration; 308 | buildSettings = { 309 | ALWAYS_SEARCH_USER_PATHS = NO; 310 | CLANG_ANALYZER_NONNULL = YES; 311 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 312 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 313 | CLANG_CXX_LIBRARY = "libc++"; 314 | CLANG_ENABLE_MODULES = YES; 315 | CLANG_ENABLE_OBJC_ARC = YES; 316 | CLANG_ENABLE_OBJC_WEAK = YES; 317 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 318 | CLANG_WARN_BOOL_CONVERSION = YES; 319 | CLANG_WARN_COMMA = YES; 320 | CLANG_WARN_CONSTANT_CONVERSION = YES; 321 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 322 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 323 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 324 | CLANG_WARN_EMPTY_BODY = YES; 325 | CLANG_WARN_ENUM_CONVERSION = YES; 326 | CLANG_WARN_INFINITE_RECURSION = YES; 327 | CLANG_WARN_INT_CONVERSION = YES; 328 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 329 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 330 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 331 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 332 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 333 | CLANG_WARN_STRICT_PROTOTYPES = YES; 334 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 335 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 336 | CLANG_WARN_UNREACHABLE_CODE = YES; 337 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 338 | CODE_SIGN_IDENTITY = "iPhone Developer"; 339 | COPY_PHASE_STRIP = NO; 340 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 341 | ENABLE_NS_ASSERTIONS = NO; 342 | ENABLE_STRICT_OBJC_MSGSEND = YES; 343 | GCC_C_LANGUAGE_STANDARD = gnu11; 344 | GCC_NO_COMMON_BLOCKS = YES; 345 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 346 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 347 | GCC_WARN_UNDECLARED_SELECTOR = YES; 348 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 349 | GCC_WARN_UNUSED_FUNCTION = YES; 350 | GCC_WARN_UNUSED_VARIABLE = YES; 351 | IPHONEOS_DEPLOYMENT_TARGET = 11.3; 352 | MTL_ENABLE_DEBUG_INFO = NO; 353 | SDKROOT = iphoneos; 354 | SWIFT_COMPILATION_MODE = wholemodule; 355 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 356 | VALIDATE_PRODUCT = YES; 357 | }; 358 | name = Release; 359 | }; 360 | FAC3D287207E017200F36052 /* Debug */ = { 361 | isa = XCBuildConfiguration; 362 | baseConfigurationReference = 8A43CDC1248B1DB716A48311 /* Pods-demo.debug.xcconfig */; 363 | buildSettings = { 364 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 365 | CODE_SIGN_STYLE = Automatic; 366 | INFOPLIST_FILE = demo/Info.plist; 367 | LD_RUNPATH_SEARCH_PATHS = ( 368 | "$(inherited)", 369 | "@executable_path/Frameworks", 370 | ); 371 | PRODUCT_BUNDLE_IDENTIFIER = "-.demo"; 372 | PRODUCT_NAME = "$(TARGET_NAME)"; 373 | SWIFT_VERSION = 3.0; 374 | TARGETED_DEVICE_FAMILY = "1,2"; 375 | }; 376 | name = Debug; 377 | }; 378 | FAC3D288207E017200F36052 /* Release */ = { 379 | isa = XCBuildConfiguration; 380 | baseConfigurationReference = 06A340DDF6002A3D25BD56FD /* Pods-demo.release.xcconfig */; 381 | buildSettings = { 382 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 383 | CODE_SIGN_STYLE = Automatic; 384 | INFOPLIST_FILE = demo/Info.plist; 385 | LD_RUNPATH_SEARCH_PATHS = ( 386 | "$(inherited)", 387 | "@executable_path/Frameworks", 388 | ); 389 | PRODUCT_BUNDLE_IDENTIFIER = "-.demo"; 390 | PRODUCT_NAME = "$(TARGET_NAME)"; 391 | SWIFT_VERSION = 3.0; 392 | TARGETED_DEVICE_FAMILY = "1,2"; 393 | }; 394 | name = Release; 395 | }; 396 | /* End XCBuildConfiguration section */ 397 | 398 | /* Begin XCConfigurationList section */ 399 | FAC3D26F207E016F00F36052 /* Build configuration list for PBXProject "demo" */ = { 400 | isa = XCConfigurationList; 401 | buildConfigurations = ( 402 | FAC3D284207E017200F36052 /* Debug */, 403 | FAC3D285207E017200F36052 /* Release */, 404 | ); 405 | defaultConfigurationIsVisible = 0; 406 | defaultConfigurationName = Release; 407 | }; 408 | FAC3D286207E017200F36052 /* Build configuration list for PBXNativeTarget "demo" */ = { 409 | isa = XCConfigurationList; 410 | buildConfigurations = ( 411 | FAC3D287207E017200F36052 /* Debug */, 412 | FAC3D288207E017200F36052 /* Release */, 413 | ); 414 | defaultConfigurationIsVisible = 0; 415 | defaultConfigurationName = Release; 416 | }; 417 | /* End XCConfigurationList section */ 418 | }; 419 | rootObject = FAC3D26C207E016F00F36052 /* Project object */; 420 | } 421 | -------------------------------------------------------------------------------- /demo/demo.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /demo/demo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /demo/demo.xcodeproj/project.xcworkspace/xcuserdata/pikacode.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pikacode/TypewriterView/a28e5dfa1c9996bffd840ed25ce4b03b41a52b4a/demo/demo.xcodeproj/project.xcworkspace/xcuserdata/pikacode.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /demo/demo.xcodeproj/xcuserdata/pikacode.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /demo/demo.xcodeproj/xcuserdata/pikacode.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | demo.xcscheme 8 | 9 | orderHint 10 | 2 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /demo/demo.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /demo/demo.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /demo/demo.xcworkspace/xcuserdata/pikacode.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pikacode/TypewriterView/a28e5dfa1c9996bffd840ed25ce4b03b41a52b4a/demo/demo.xcworkspace/xcuserdata/pikacode.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /demo/demo/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pikacode/TypewriterView/a28e5dfa1c9996bffd840ed25ce4b03b41a52b4a/demo/demo/.DS_Store -------------------------------------------------------------------------------- /demo/demo/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // demo 4 | // 5 | // Created by pikacode on 2018/4/11. 6 | // Copyright © 2018年 pikacode. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | } 17 | 18 | -------------------------------------------------------------------------------- /demo/demo/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 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "size" : "1024x1024", 91 | "scale" : "1x" 92 | } 93 | ], 94 | "info" : { 95 | "version" : 1, 96 | "author" : "xcode" 97 | } 98 | } -------------------------------------------------------------------------------- /demo/demo/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /demo/demo/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 | -------------------------------------------------------------------------------- /demo/demo/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /demo/demo/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 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 | UISupportedInterfaceOrientations~ipad 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationPortraitUpsideDown 39 | UIInterfaceOrientationLandscapeLeft 40 | UIInterfaceOrientationLandscapeRight 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /demo/demo/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // demo 4 | // 5 | // Created by pikacode on 2018/4/11. 6 | // Copyright © 2018年 pikacode. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import TypewriterView 11 | 12 | class ViewController: UIViewController { 13 | 14 | @IBOutlet weak var typewriterView: TypewriterView! 15 | @IBOutlet weak var button: UIButton! 16 | 17 | @IBAction func btnAction(_ sender: Any) { 18 | 19 | if !typewriterView.isFinished && !typewriterView.isPausing { 20 | typewriterView.pause() 21 | button.setTitle("Resume", for: .normal) 22 | return 23 | } else if !typewriterView.isFinished && typewriterView.isPausing { 24 | typewriterView.resume() 25 | button.setTitle("Pause", for: .normal) 26 | return 27 | } 28 | 29 | button.setTitle("Pause", for: .normal) 30 | 31 | typewriterView.completionBlock = { [weak self] in 32 | self?.button.setTitle("Replay", for: .normal) 33 | } 34 | 35 | typewriterView.clear() 36 | 37 | typewriterView.write("《Snow White》", speed: 0.2) 38 | typewriterView.write("\n\n") 39 | typewriterView.cursorBlink("⬜️", speed: 0.3, repeats: 5) 40 | 41 | typewriterView.write("Long long ago...\n", speed: 0.1) 42 | typewriterView.cursorBlink("I") 43 | 44 | typewriterView.write("There was 1️⃣ Queen and 9️⃣ Dwarfs.\n\n", speed: 0.005) 45 | typewriterView.cursorBlink() 46 | 47 | typewriterView.write("( Ouch!!! )") 48 | typewriterView.cursorBlink("🙀") 49 | typewriterView.undo(12, speed: 0.02) 50 | typewriterView.undo(5, speed: 0.08) 51 | typewriterView.undo(4, speed: 0.15) 52 | typewriterView.cursorBlink("❌") 53 | typewriterView.undo(5, speed: 0.3) 54 | 55 | typewriterView.cursorBlink() 56 | typewriterView.write("and 7️⃣ Dwarfs.\n\n", speed: 0.2) 57 | 58 | typewriterView.cursorBlink() 59 | typewriterView.write("The Queen was sitting at the window. There was snow outside in the garden--snow on the hill and in the lane, snow on the huts and on the trees: all things were white with snow.\n\n") 60 | 61 | typewriterView.cursorBlink() 62 | typewriterView.write("She had some cloth in her hand and a needle. The cloth in her hand was as white as the snow......") 63 | 64 | } 65 | 66 | } 67 | 68 | -------------------------------------------------------------------------------- /src/1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pikacode/TypewriterView/a28e5dfa1c9996bffd840ed25ce4b03b41a52b4a/src/1.gif --------------------------------------------------------------------------------