├── screenshot.png
├── Demo
├── LineNumber.xcodeproj
│ ├── project.xcworkspace
│ │ └── contents.xcworkspacedata
│ └── project.pbxproj
├── LineNumberTests
│ ├── Info.plist
│ └── LineNumberTests.swift
└── LineNumber
│ ├── Images.xcassets
│ └── AppIcon.appiconset
│ │ └── Contents.json
│ ├── AppDelegate.swift
│ ├── ViewController.swift
│ ├── Info.plist
│ ├── Document.swift
│ └── Base.lproj
│ └── Main.storyboard
├── .gitignore
├── README.md
├── LICENSE
└── Source
└── LineNumberRulerView.swift
/screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yichizhang/NSTextView-LineNumberView/HEAD/screenshot.png
--------------------------------------------------------------------------------
/Demo/LineNumber.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Xcode
2 | #
3 | build/
4 | *.pbxuser
5 | !default.pbxuser
6 | *.mode1v3
7 | !default.mode1v3
8 | *.mode2v3
9 | !default.mode2v3
10 | *.perspectivev3
11 | !default.perspectivev3
12 | xcuserdata
13 | *.xccheckout
14 | *.moved-aside
15 | DerivedData
16 | *.hmap
17 | *.ipa
18 | *.xcuserstate
19 |
20 | # CocoaPods
21 | #
22 | # We recommend against adding the Pods directory to your .gitignore. However
23 | # you should judge for yourself, the pros and cons are mentioned at:
24 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control
25 | #
26 | Pods/
27 | ._*
28 | .DS_Store
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | NSTextView+LineNumberView
2 | =========================
3 |
4 | Add line numbers to an instance of NSTextView.
5 |
6 | 
7 |
8 | Example
9 | ========
10 |
11 | ```swift
12 |
13 | import Cocoa
14 |
15 | // Your view controller
16 | class ViewController: NSViewController {
17 |
18 | // The text view you wish to add line number view to
19 | @IBOutlet var mainTextView: NSTextView!
20 |
21 | override func viewDidLoad() {
22 | super.viewDidLoad()
23 |
24 | mainTextView.lnv_setUpLineNumberView()
25 | }
26 | }
27 |
28 | ```
--------------------------------------------------------------------------------
/Demo/LineNumberTests/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 | BNDL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1
23 |
24 |
25 |
--------------------------------------------------------------------------------
/Demo/LineNumberTests/LineNumberTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // LineNumberTests.swift
3 | // LineNumberTests
4 | //
5 | // Created by Yichi on 31/05/2015.
6 | // Copyright (c) 2015 Yichi. All rights reserved.
7 | //
8 |
9 | import Cocoa
10 | import XCTest
11 |
12 | class LineNumberTests: XCTestCase {
13 |
14 | override func setUp() {
15 | super.setUp()
16 | // Put setup code here. This method is called before the invocation of each test method in the class.
17 | }
18 |
19 | override func tearDown() {
20 | // Put teardown code here. This method is called after the invocation of each test method in the class.
21 | super.tearDown()
22 | }
23 |
24 | func testExample() {
25 | // This is an example of a functional test case.
26 | XCTAssert(true, "Pass")
27 | }
28 |
29 | func testPerformanceExample() {
30 | // This is an example of a performance test case.
31 | self.measure() {
32 | // Put the code you want to measure the time of here.
33 | }
34 | }
35 |
36 | }
37 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015 Yichi Zhang
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 |
23 |
--------------------------------------------------------------------------------
/Demo/LineNumber/Images.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "mac",
5 | "size" : "16x16",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "mac",
10 | "size" : "16x16",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "mac",
15 | "size" : "32x32",
16 | "scale" : "1x"
17 | },
18 | {
19 | "idiom" : "mac",
20 | "size" : "32x32",
21 | "scale" : "2x"
22 | },
23 | {
24 | "idiom" : "mac",
25 | "size" : "128x128",
26 | "scale" : "1x"
27 | },
28 | {
29 | "idiom" : "mac",
30 | "size" : "128x128",
31 | "scale" : "2x"
32 | },
33 | {
34 | "idiom" : "mac",
35 | "size" : "256x256",
36 | "scale" : "1x"
37 | },
38 | {
39 | "idiom" : "mac",
40 | "size" : "256x256",
41 | "scale" : "2x"
42 | },
43 | {
44 | "idiom" : "mac",
45 | "size" : "512x512",
46 | "scale" : "1x"
47 | },
48 | {
49 | "idiom" : "mac",
50 | "size" : "512x512",
51 | "scale" : "2x"
52 | }
53 | ],
54 | "info" : {
55 | "version" : 1,
56 | "author" : "xcode"
57 | }
58 | }
--------------------------------------------------------------------------------
/Demo/LineNumber/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // LineNumber
4 | //
5 | // Copyright (c) 2015 Yichi Zhang. All rights reserved.
6 | //
7 | // Permission is hereby granted, free of charge, to any person obtaining a
8 | // copy of this software and associated documentation files (the "Software"),
9 | // to deal in the Software without restriction, including without limitation
10 | // the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 | // and/or sell copies of the Software, and to permit persons to whom the
12 | // Software is furnished to do so, subject to the following conditions:
13 | //
14 | // The above copyright notice and this permission notice shall be included in
15 | // all copies or substantial portions of the Software.
16 | //
17 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 | // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23 | // DEALINGS IN THE SOFTWARE.
24 | //
25 |
26 | import Cocoa
27 |
28 | @NSApplicationMain
29 | class AppDelegate: NSObject, NSApplicationDelegate {
30 |
31 | func applicationDidFinishLaunching(_ aNotification: Notification) {
32 | // Insert code here to initialize your application
33 | }
34 |
35 | func applicationWillTerminate(_ aNotification: Notification) {
36 | // Insert code here to tear down your application
37 | }
38 |
39 | }
40 |
41 |
--------------------------------------------------------------------------------
/Demo/LineNumber/ViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ViewController.swift
3 | // LineNumber
4 | //
5 | // Copyright (c) 2015 Yichi Zhang. All rights reserved.
6 | //
7 | // Permission is hereby granted, free of charge, to any person obtaining a
8 | // copy of this software and associated documentation files (the "Software"),
9 | // to deal in the Software without restriction, including without limitation
10 | // the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 | // and/or sell copies of the Software, and to permit persons to whom the
12 | // Software is furnished to do so, subject to the following conditions:
13 | //
14 | // The above copyright notice and this permission notice shall be included in
15 | // all copies or substantial portions of the Software.
16 | //
17 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 | // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23 | // DEALINGS IN THE SOFTWARE.
24 | //
25 |
26 | import Cocoa
27 |
28 | class ViewController: NSViewController {
29 |
30 | @IBOutlet var mainTextView: NSTextView!
31 |
32 | override func viewDidLoad() {
33 | super.viewDidLoad()
34 |
35 | // Do any additional setup after loading the view.
36 | mainTextView.lnv_setUpLineNumberView()
37 | }
38 |
39 | override var representedObject: Any? {
40 | didSet {
41 | // Update the view, if already loaded.
42 |
43 | }
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/Demo/LineNumber/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleDocumentTypes
8 |
9 |
10 | CFBundleTypeExtensions
11 |
12 | txt
13 |
14 | CFBundleTypeIconFile
15 |
16 | CFBundleTypeName
17 | DocumentType
18 | CFBundleTypeOSTypes
19 |
20 | ????
21 |
22 | CFBundleTypeRole
23 | Editor
24 | NSDocumentClass
25 | $(PRODUCT_MODULE_NAME).Document
26 |
27 |
28 | CFBundleExecutable
29 | $(EXECUTABLE_NAME)
30 | CFBundleIconFile
31 |
32 | CFBundleIdentifier
33 | $(PRODUCT_BUNDLE_IDENTIFIER)
34 | CFBundleInfoDictionaryVersion
35 | 6.0
36 | CFBundleName
37 | $(PRODUCT_NAME)
38 | CFBundlePackageType
39 | APPL
40 | CFBundleShortVersionString
41 | 1.0
42 | CFBundleSignature
43 | ????
44 | CFBundleVersion
45 | 1
46 | LSMinimumSystemVersion
47 | $(MACOSX_DEPLOYMENT_TARGET)
48 | NSHumanReadableCopyright
49 | Copyright © 2015 Yichi. All rights reserved.
50 | NSMainStoryboardFile
51 | Main
52 | NSPrincipalClass
53 | NSApplication
54 |
55 |
56 |
--------------------------------------------------------------------------------
/Demo/LineNumber/Document.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Document.swift
3 | // LineNumber
4 | //
5 | // Copyright (c) 2015 Yichi Zhang. All rights reserved.
6 | //
7 | // Permission is hereby granted, free of charge, to any person obtaining a
8 | // copy of this software and associated documentation files (the "Software"),
9 | // to deal in the Software without restriction, including without limitation
10 | // the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 | // and/or sell copies of the Software, and to permit persons to whom the
12 | // Software is furnished to do so, subject to the following conditions:
13 | //
14 | // The above copyright notice and this permission notice shall be included in
15 | // all copies or substantial portions of the Software.
16 | //
17 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 | // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23 | // DEALINGS IN THE SOFTWARE.
24 | //
25 |
26 | import Cocoa
27 |
28 | class Document: NSDocument {
29 |
30 | override init() {
31 | super.init()
32 | // Add your subclass-specific initialization here.
33 | }
34 |
35 | override func windowControllerDidLoadNib(_ aController: NSWindowController) {
36 | super.windowControllerDidLoadNib(aController)
37 | // Add any code here that needs to be executed once the windowController has loaded the document's window.
38 | }
39 |
40 | override class var autosavesInPlace: Bool {
41 | get {
42 | return true
43 | }
44 | }
45 |
46 | override func makeWindowControllers() {
47 | // Returns the Storyboard that contains your Document window.
48 | let storyboard = NSStoryboard(name: NSStoryboard.Name(rawValue: "Main"), bundle: nil)
49 | let windowController = storyboard.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier(rawValue: "Document Window Controller")) as! NSWindowController
50 | self.addWindowController(windowController)
51 | }
52 |
53 | override func data(ofType typeName: String) throws -> Data {
54 | // Insert code here to write your document to data of the specified type. If outError != nil, ensure that you create and set an appropriate error when returning nil.
55 | // You can also choose to override fileWrapperOfType:error:, writeToURL:ofType:error:, or writeToURL:ofType:forSaveOperation:originalContentsURL:error: instead.
56 | throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil)
57 | }
58 |
59 | override func read(from data: Data, ofType typeName: String) throws {
60 | // Insert code here to read your document from the given data of the specified type. If outError != nil, ensure that you create and set an appropriate error when returning false.
61 | // You can also choose to override readFromFileWrapper:ofType:error: or readFromURL:ofType:error: instead.
62 | // If you override either of these, you should also override -isEntireFileLoaded to return NO if the contents are lazily loaded.
63 | throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil)
64 | }
65 |
66 |
67 | }
68 |
69 |
--------------------------------------------------------------------------------
/Source/LineNumberRulerView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // LineNumberRulerView.swift
3 | // LineNumber
4 | //
5 | // Copyright (c) 2015 Yichi Zhang. All rights reserved.
6 | //
7 | // Permission is hereby granted, free of charge, to any person obtaining a
8 | // copy of this software and associated documentation files (the "Software"),
9 | // to deal in the Software without restriction, including without limitation
10 | // the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 | // and/or sell copies of the Software, and to permit persons to whom the
12 | // Software is furnished to do so, subject to the following conditions:
13 | //
14 | // The above copyright notice and this permission notice shall be included in
15 | // all copies or substantial portions of the Software.
16 | //
17 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 | // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23 | // DEALINGS IN THE SOFTWARE.
24 | //
25 |
26 | import AppKit
27 | import Foundation
28 | import ObjectiveC
29 |
30 | var LineNumberViewAssocObjKey: UInt8 = 0
31 |
32 | extension NSTextView {
33 | var lineNumberView:LineNumberRulerView {
34 | get {
35 | return objc_getAssociatedObject(self, &LineNumberViewAssocObjKey) as! LineNumberRulerView
36 | }
37 | set {
38 | objc_setAssociatedObject(self, &LineNumberViewAssocObjKey, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
39 | }
40 | }
41 |
42 | func lnv_setUpLineNumberView() {
43 | if font == nil {
44 | font = NSFont.systemFont(ofSize: 16)
45 | }
46 |
47 | if let scrollView = enclosingScrollView {
48 | lineNumberView = LineNumberRulerView(textView: self)
49 |
50 | scrollView.verticalRulerView = lineNumberView
51 | scrollView.hasVerticalRuler = true
52 | scrollView.rulersVisible = true
53 | }
54 |
55 | postsFrameChangedNotifications = true
56 | NotificationCenter.default.addObserver(self, selector: #selector(lnv_framDidChange), name: NSView.frameDidChangeNotification, object: self)
57 |
58 | NotificationCenter.default.addObserver(self, selector: #selector(lnv_textDidChange), name: NSText.didChangeNotification, object: self)
59 | }
60 |
61 | @objc func lnv_framDidChange(notification: NSNotification) {
62 |
63 | lineNumberView.needsDisplay = true
64 | }
65 |
66 | @objc func lnv_textDidChange(notification: NSNotification) {
67 |
68 | lineNumberView.needsDisplay = true
69 | }
70 | }
71 |
72 | class LineNumberRulerView: NSRulerView {
73 |
74 | var font: NSFont! {
75 | didSet {
76 | self.needsDisplay = true
77 | }
78 | }
79 |
80 | init(textView: NSTextView) {
81 | super.init(scrollView: textView.enclosingScrollView!, orientation: NSRulerView.Orientation.verticalRuler)
82 | self.font = textView.font ?? NSFont.systemFont(ofSize: NSFont.smallSystemFontSize)
83 | self.clientView = textView
84 |
85 | self.ruleThickness = 40
86 | }
87 |
88 | required init(coder: NSCoder) {
89 | fatalError("init(coder:) has not been implemented")
90 | }
91 |
92 |
93 | override func drawHashMarksAndLabels(in rect: NSRect) {
94 |
95 | if let textView = self.clientView as? NSTextView {
96 | if let layoutManager = textView.layoutManager {
97 |
98 | let relativePoint = self.convert(NSZeroPoint, from: textView)
99 | let lineNumberAttributes = [NSAttributedStringKey.font: textView.font!, NSAttributedStringKey.foregroundColor: NSColor.gray] as [NSAttributedStringKey : Any]
100 |
101 | let drawLineNumber = { (lineNumberString:String, y:CGFloat) -> Void in
102 | let attString = NSAttributedString(string: lineNumberString, attributes: lineNumberAttributes)
103 | let x = 35 - attString.size().width
104 | attString.draw(at: NSPoint(x: x, y: relativePoint.y + y))
105 | }
106 |
107 | let visibleGlyphRange = layoutManager.glyphRange(forBoundingRect: textView.visibleRect, in: textView.textContainer!)
108 | let firstVisibleGlyphCharacterIndex = layoutManager.characterIndexForGlyph(at: visibleGlyphRange.location)
109 |
110 | let newLineRegex = try! NSRegularExpression(pattern: "\n", options: [])
111 | // The line number for the first visible line
112 | var lineNumber = newLineRegex.numberOfMatches(in: textView.string, options: [], range: NSMakeRange(0, firstVisibleGlyphCharacterIndex)) + 1
113 |
114 | var glyphIndexForStringLine = visibleGlyphRange.location
115 |
116 | // Go through each line in the string.
117 | while glyphIndexForStringLine < NSMaxRange(visibleGlyphRange) {
118 |
119 | // Range of current line in the string.
120 | let characterRangeForStringLine = (textView.string as NSString).lineRange(
121 | for: NSMakeRange( layoutManager.characterIndexForGlyph(at: glyphIndexForStringLine), 0 )
122 | )
123 | let glyphRangeForStringLine = layoutManager.glyphRange(forCharacterRange: characterRangeForStringLine, actualCharacterRange: nil)
124 |
125 | var glyphIndexForGlyphLine = glyphIndexForStringLine
126 | var glyphLineCount = 0
127 |
128 | while ( glyphIndexForGlyphLine < NSMaxRange(glyphRangeForStringLine) ) {
129 |
130 | // See if the current line in the string spread across
131 | // several lines of glyphs
132 | var effectiveRange = NSMakeRange(0, 0)
133 |
134 | // Range of current "line of glyphs". If a line is wrapped,
135 | // then it will have more than one "line of glyphs"
136 | let lineRect = layoutManager.lineFragmentRect(forGlyphAt: glyphIndexForGlyphLine, effectiveRange: &effectiveRange, withoutAdditionalLayout: true)
137 |
138 | if glyphLineCount > 0 {
139 | drawLineNumber("-", lineRect.minY)
140 | } else {
141 | drawLineNumber("\(lineNumber)", lineRect.minY)
142 | }
143 |
144 | // Move to next glyph line
145 | glyphLineCount += 1
146 | glyphIndexForGlyphLine = NSMaxRange(effectiveRange)
147 | }
148 |
149 | glyphIndexForStringLine = NSMaxRange(glyphRangeForStringLine)
150 | lineNumber += 1
151 | }
152 |
153 | // Draw line number for the extra line at the end of the text
154 | if layoutManager.extraLineFragmentTextContainer != nil {
155 | drawLineNumber("\(lineNumber)", layoutManager.extraLineFragmentRect.minY)
156 | }
157 | }
158 | }
159 | }
160 | }
161 |
--------------------------------------------------------------------------------
/Demo/LineNumber.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 1291DF8F1B1B356400A0D977 /* LineNumberRulerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1291DF8E1B1B356400A0D977 /* LineNumberRulerView.swift */; };
11 | 12CBEE1E1B1AB4D600FDDE49 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12CBEE1D1B1AB4D600FDDE49 /* AppDelegate.swift */; };
12 | 12CBEE201B1AB4D600FDDE49 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12CBEE1F1B1AB4D600FDDE49 /* ViewController.swift */; };
13 | 12CBEE221B1AB4D600FDDE49 /* Document.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12CBEE211B1AB4D600FDDE49 /* Document.swift */; };
14 | 12CBEE241B1AB4D600FDDE49 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 12CBEE231B1AB4D600FDDE49 /* Images.xcassets */; };
15 | 12CBEE271B1AB4D600FDDE49 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 12CBEE251B1AB4D600FDDE49 /* Main.storyboard */; };
16 | 12CBEE331B1AB4D600FDDE49 /* LineNumberTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12CBEE321B1AB4D600FDDE49 /* LineNumberTests.swift */; };
17 | /* End PBXBuildFile section */
18 |
19 | /* Begin PBXContainerItemProxy section */
20 | 12CBEE2D1B1AB4D600FDDE49 /* PBXContainerItemProxy */ = {
21 | isa = PBXContainerItemProxy;
22 | containerPortal = 12CBEE101B1AB4D600FDDE49 /* Project object */;
23 | proxyType = 1;
24 | remoteGlobalIDString = 12CBEE171B1AB4D600FDDE49;
25 | remoteInfo = LineNumber;
26 | };
27 | /* End PBXContainerItemProxy section */
28 |
29 | /* Begin PBXFileReference section */
30 | 1291DF8E1B1B356400A0D977 /* LineNumberRulerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LineNumberRulerView.swift; sourceTree = ""; };
31 | 12CBEE181B1AB4D600FDDE49 /* LineNumber.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LineNumber.app; sourceTree = BUILT_PRODUCTS_DIR; };
32 | 12CBEE1C1B1AB4D600FDDE49 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
33 | 12CBEE1D1B1AB4D600FDDE49 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
34 | 12CBEE1F1B1AB4D600FDDE49 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; };
35 | 12CBEE211B1AB4D600FDDE49 /* Document.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Document.swift; sourceTree = ""; };
36 | 12CBEE231B1AB4D600FDDE49 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; };
37 | 12CBEE261B1AB4D600FDDE49 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
38 | 12CBEE2C1B1AB4D600FDDE49 /* LineNumberTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LineNumberTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
39 | 12CBEE311B1AB4D600FDDE49 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
40 | 12CBEE321B1AB4D600FDDE49 /* LineNumberTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LineNumberTests.swift; sourceTree = ""; };
41 | /* End PBXFileReference section */
42 |
43 | /* Begin PBXFrameworksBuildPhase section */
44 | 12CBEE151B1AB4D600FDDE49 /* Frameworks */ = {
45 | isa = PBXFrameworksBuildPhase;
46 | buildActionMask = 2147483647;
47 | files = (
48 | );
49 | runOnlyForDeploymentPostprocessing = 0;
50 | };
51 | 12CBEE291B1AB4D600FDDE49 /* Frameworks */ = {
52 | isa = PBXFrameworksBuildPhase;
53 | buildActionMask = 2147483647;
54 | files = (
55 | );
56 | runOnlyForDeploymentPostprocessing = 0;
57 | };
58 | /* End PBXFrameworksBuildPhase section */
59 |
60 | /* Begin PBXGroup section */
61 | 1291DF8D1B1B356400A0D977 /* Source */ = {
62 | isa = PBXGroup;
63 | children = (
64 | 1291DF8E1B1B356400A0D977 /* LineNumberRulerView.swift */,
65 | );
66 | name = Source;
67 | path = ../../Source;
68 | sourceTree = "";
69 | };
70 | 12CBEE0F1B1AB4D600FDDE49 = {
71 | isa = PBXGroup;
72 | children = (
73 | 12CBEE1A1B1AB4D600FDDE49 /* LineNumber */,
74 | 12CBEE2F1B1AB4D600FDDE49 /* LineNumberTests */,
75 | 12CBEE191B1AB4D600FDDE49 /* Products */,
76 | );
77 | sourceTree = "";
78 | };
79 | 12CBEE191B1AB4D600FDDE49 /* Products */ = {
80 | isa = PBXGroup;
81 | children = (
82 | 12CBEE181B1AB4D600FDDE49 /* LineNumber.app */,
83 | 12CBEE2C1B1AB4D600FDDE49 /* LineNumberTests.xctest */,
84 | );
85 | name = Products;
86 | sourceTree = "";
87 | };
88 | 12CBEE1A1B1AB4D600FDDE49 /* LineNumber */ = {
89 | isa = PBXGroup;
90 | children = (
91 | 1291DF8D1B1B356400A0D977 /* Source */,
92 | 12CBEE1D1B1AB4D600FDDE49 /* AppDelegate.swift */,
93 | 12CBEE1F1B1AB4D600FDDE49 /* ViewController.swift */,
94 | 12CBEE211B1AB4D600FDDE49 /* Document.swift */,
95 | 12CBEE231B1AB4D600FDDE49 /* Images.xcassets */,
96 | 12CBEE251B1AB4D600FDDE49 /* Main.storyboard */,
97 | 12CBEE1B1B1AB4D600FDDE49 /* Supporting Files */,
98 | );
99 | path = LineNumber;
100 | sourceTree = "";
101 | };
102 | 12CBEE1B1B1AB4D600FDDE49 /* Supporting Files */ = {
103 | isa = PBXGroup;
104 | children = (
105 | 12CBEE1C1B1AB4D600FDDE49 /* Info.plist */,
106 | );
107 | name = "Supporting Files";
108 | sourceTree = "";
109 | };
110 | 12CBEE2F1B1AB4D600FDDE49 /* LineNumberTests */ = {
111 | isa = PBXGroup;
112 | children = (
113 | 12CBEE321B1AB4D600FDDE49 /* LineNumberTests.swift */,
114 | 12CBEE301B1AB4D600FDDE49 /* Supporting Files */,
115 | );
116 | path = LineNumberTests;
117 | sourceTree = "";
118 | };
119 | 12CBEE301B1AB4D600FDDE49 /* Supporting Files */ = {
120 | isa = PBXGroup;
121 | children = (
122 | 12CBEE311B1AB4D600FDDE49 /* Info.plist */,
123 | );
124 | name = "Supporting Files";
125 | sourceTree = "";
126 | };
127 | /* End PBXGroup section */
128 |
129 | /* Begin PBXNativeTarget section */
130 | 12CBEE171B1AB4D600FDDE49 /* LineNumber */ = {
131 | isa = PBXNativeTarget;
132 | buildConfigurationList = 12CBEE361B1AB4D600FDDE49 /* Build configuration list for PBXNativeTarget "LineNumber" */;
133 | buildPhases = (
134 | 12CBEE141B1AB4D600FDDE49 /* Sources */,
135 | 12CBEE151B1AB4D600FDDE49 /* Frameworks */,
136 | 12CBEE161B1AB4D600FDDE49 /* Resources */,
137 | );
138 | buildRules = (
139 | );
140 | dependencies = (
141 | );
142 | name = LineNumber;
143 | productName = LineNumber;
144 | productReference = 12CBEE181B1AB4D600FDDE49 /* LineNumber.app */;
145 | productType = "com.apple.product-type.application";
146 | };
147 | 12CBEE2B1B1AB4D600FDDE49 /* LineNumberTests */ = {
148 | isa = PBXNativeTarget;
149 | buildConfigurationList = 12CBEE391B1AB4D600FDDE49 /* Build configuration list for PBXNativeTarget "LineNumberTests" */;
150 | buildPhases = (
151 | 12CBEE281B1AB4D600FDDE49 /* Sources */,
152 | 12CBEE291B1AB4D600FDDE49 /* Frameworks */,
153 | 12CBEE2A1B1AB4D600FDDE49 /* Resources */,
154 | );
155 | buildRules = (
156 | );
157 | dependencies = (
158 | 12CBEE2E1B1AB4D600FDDE49 /* PBXTargetDependency */,
159 | );
160 | name = LineNumberTests;
161 | productName = LineNumberTests;
162 | productReference = 12CBEE2C1B1AB4D600FDDE49 /* LineNumberTests.xctest */;
163 | productType = "com.apple.product-type.bundle.unit-test";
164 | };
165 | /* End PBXNativeTarget section */
166 |
167 | /* Begin PBXProject section */
168 | 12CBEE101B1AB4D600FDDE49 /* Project object */ = {
169 | isa = PBXProject;
170 | attributes = {
171 | LastSwiftMigration = 0700;
172 | LastSwiftUpdateCheck = 0700;
173 | LastUpgradeCheck = 0800;
174 | ORGANIZATIONNAME = Yichi;
175 | TargetAttributes = {
176 | 12CBEE171B1AB4D600FDDE49 = {
177 | CreatedOnToolsVersion = 6.3;
178 | LastSwiftMigration = 0800;
179 | };
180 | 12CBEE2B1B1AB4D600FDDE49 = {
181 | CreatedOnToolsVersion = 6.3;
182 | LastSwiftMigration = 0800;
183 | TestTargetID = 12CBEE171B1AB4D600FDDE49;
184 | };
185 | };
186 | };
187 | buildConfigurationList = 12CBEE131B1AB4D600FDDE49 /* Build configuration list for PBXProject "LineNumber" */;
188 | compatibilityVersion = "Xcode 3.2";
189 | developmentRegion = English;
190 | hasScannedForEncodings = 0;
191 | knownRegions = (
192 | en,
193 | Base,
194 | );
195 | mainGroup = 12CBEE0F1B1AB4D600FDDE49;
196 | productRefGroup = 12CBEE191B1AB4D600FDDE49 /* Products */;
197 | projectDirPath = "";
198 | projectRoot = "";
199 | targets = (
200 | 12CBEE171B1AB4D600FDDE49 /* LineNumber */,
201 | 12CBEE2B1B1AB4D600FDDE49 /* LineNumberTests */,
202 | );
203 | };
204 | /* End PBXProject section */
205 |
206 | /* Begin PBXResourcesBuildPhase section */
207 | 12CBEE161B1AB4D600FDDE49 /* Resources */ = {
208 | isa = PBXResourcesBuildPhase;
209 | buildActionMask = 2147483647;
210 | files = (
211 | 12CBEE241B1AB4D600FDDE49 /* Images.xcassets in Resources */,
212 | 12CBEE271B1AB4D600FDDE49 /* Main.storyboard in Resources */,
213 | );
214 | runOnlyForDeploymentPostprocessing = 0;
215 | };
216 | 12CBEE2A1B1AB4D600FDDE49 /* Resources */ = {
217 | isa = PBXResourcesBuildPhase;
218 | buildActionMask = 2147483647;
219 | files = (
220 | );
221 | runOnlyForDeploymentPostprocessing = 0;
222 | };
223 | /* End PBXResourcesBuildPhase section */
224 |
225 | /* Begin PBXSourcesBuildPhase section */
226 | 12CBEE141B1AB4D600FDDE49 /* Sources */ = {
227 | isa = PBXSourcesBuildPhase;
228 | buildActionMask = 2147483647;
229 | files = (
230 | 12CBEE201B1AB4D600FDDE49 /* ViewController.swift in Sources */,
231 | 12CBEE1E1B1AB4D600FDDE49 /* AppDelegate.swift in Sources */,
232 | 1291DF8F1B1B356400A0D977 /* LineNumberRulerView.swift in Sources */,
233 | 12CBEE221B1AB4D600FDDE49 /* Document.swift in Sources */,
234 | );
235 | runOnlyForDeploymentPostprocessing = 0;
236 | };
237 | 12CBEE281B1AB4D600FDDE49 /* Sources */ = {
238 | isa = PBXSourcesBuildPhase;
239 | buildActionMask = 2147483647;
240 | files = (
241 | 12CBEE331B1AB4D600FDDE49 /* LineNumberTests.swift in Sources */,
242 | );
243 | runOnlyForDeploymentPostprocessing = 0;
244 | };
245 | /* End PBXSourcesBuildPhase section */
246 |
247 | /* Begin PBXTargetDependency section */
248 | 12CBEE2E1B1AB4D600FDDE49 /* PBXTargetDependency */ = {
249 | isa = PBXTargetDependency;
250 | target = 12CBEE171B1AB4D600FDDE49 /* LineNumber */;
251 | targetProxy = 12CBEE2D1B1AB4D600FDDE49 /* PBXContainerItemProxy */;
252 | };
253 | /* End PBXTargetDependency section */
254 |
255 | /* Begin PBXVariantGroup section */
256 | 12CBEE251B1AB4D600FDDE49 /* Main.storyboard */ = {
257 | isa = PBXVariantGroup;
258 | children = (
259 | 12CBEE261B1AB4D600FDDE49 /* Base */,
260 | );
261 | name = Main.storyboard;
262 | sourceTree = "";
263 | };
264 | /* End PBXVariantGroup section */
265 |
266 | /* Begin XCBuildConfiguration section */
267 | 12CBEE341B1AB4D600FDDE49 /* Debug */ = {
268 | isa = XCBuildConfiguration;
269 | buildSettings = {
270 | ALWAYS_SEARCH_USER_PATHS = NO;
271 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
272 | CLANG_CXX_LIBRARY = "libc++";
273 | CLANG_ENABLE_MODULES = YES;
274 | CLANG_ENABLE_OBJC_ARC = YES;
275 | CLANG_WARN_BOOL_CONVERSION = YES;
276 | CLANG_WARN_CONSTANT_CONVERSION = YES;
277 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
278 | CLANG_WARN_EMPTY_BODY = YES;
279 | CLANG_WARN_ENUM_CONVERSION = YES;
280 | CLANG_WARN_INFINITE_RECURSION = YES;
281 | CLANG_WARN_INT_CONVERSION = YES;
282 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
283 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
284 | CLANG_WARN_UNREACHABLE_CODE = YES;
285 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
286 | CODE_SIGN_IDENTITY = "-";
287 | COPY_PHASE_STRIP = NO;
288 | DEBUG_INFORMATION_FORMAT = dwarf;
289 | ENABLE_STRICT_OBJC_MSGSEND = YES;
290 | ENABLE_TESTABILITY = YES;
291 | GCC_C_LANGUAGE_STANDARD = gnu99;
292 | GCC_DYNAMIC_NO_PIC = NO;
293 | GCC_NO_COMMON_BLOCKS = YES;
294 | GCC_OPTIMIZATION_LEVEL = 0;
295 | GCC_PREPROCESSOR_DEFINITIONS = (
296 | "DEBUG=1",
297 | "$(inherited)",
298 | );
299 | GCC_SYMBOLS_PRIVATE_EXTERN = NO;
300 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
301 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
302 | GCC_WARN_UNDECLARED_SELECTOR = YES;
303 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
304 | GCC_WARN_UNUSED_FUNCTION = YES;
305 | GCC_WARN_UNUSED_VARIABLE = YES;
306 | MACOSX_DEPLOYMENT_TARGET = 10.10;
307 | MTL_ENABLE_DEBUG_INFO = YES;
308 | ONLY_ACTIVE_ARCH = YES;
309 | SDKROOT = macosx;
310 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
311 | };
312 | name = Debug;
313 | };
314 | 12CBEE351B1AB4D600FDDE49 /* Release */ = {
315 | isa = XCBuildConfiguration;
316 | buildSettings = {
317 | ALWAYS_SEARCH_USER_PATHS = NO;
318 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
319 | CLANG_CXX_LIBRARY = "libc++";
320 | CLANG_ENABLE_MODULES = YES;
321 | CLANG_ENABLE_OBJC_ARC = YES;
322 | CLANG_WARN_BOOL_CONVERSION = YES;
323 | CLANG_WARN_CONSTANT_CONVERSION = YES;
324 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
325 | CLANG_WARN_EMPTY_BODY = YES;
326 | CLANG_WARN_ENUM_CONVERSION = YES;
327 | CLANG_WARN_INFINITE_RECURSION = YES;
328 | CLANG_WARN_INT_CONVERSION = YES;
329 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
330 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
331 | CLANG_WARN_UNREACHABLE_CODE = YES;
332 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
333 | CODE_SIGN_IDENTITY = "-";
334 | COPY_PHASE_STRIP = NO;
335 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
336 | ENABLE_NS_ASSERTIONS = NO;
337 | ENABLE_STRICT_OBJC_MSGSEND = YES;
338 | GCC_C_LANGUAGE_STANDARD = gnu99;
339 | GCC_NO_COMMON_BLOCKS = YES;
340 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
341 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
342 | GCC_WARN_UNDECLARED_SELECTOR = YES;
343 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
344 | GCC_WARN_UNUSED_FUNCTION = YES;
345 | GCC_WARN_UNUSED_VARIABLE = YES;
346 | MACOSX_DEPLOYMENT_TARGET = 10.10;
347 | MTL_ENABLE_DEBUG_INFO = NO;
348 | SDKROOT = macosx;
349 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
350 | };
351 | name = Release;
352 | };
353 | 12CBEE371B1AB4D600FDDE49 /* Debug */ = {
354 | isa = XCBuildConfiguration;
355 | buildSettings = {
356 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
357 | COMBINE_HIDPI_IMAGES = YES;
358 | INFOPLIST_FILE = LineNumber/Info.plist;
359 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
360 | PRODUCT_BUNDLE_IDENTIFIER = "com.yichizhang.$(PRODUCT_NAME:rfc1034identifier)";
361 | PRODUCT_NAME = "$(TARGET_NAME)";
362 | SWIFT_VERSION = 4.0;
363 | };
364 | name = Debug;
365 | };
366 | 12CBEE381B1AB4D600FDDE49 /* Release */ = {
367 | isa = XCBuildConfiguration;
368 | buildSettings = {
369 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
370 | COMBINE_HIDPI_IMAGES = YES;
371 | INFOPLIST_FILE = LineNumber/Info.plist;
372 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
373 | PRODUCT_BUNDLE_IDENTIFIER = "com.yichizhang.$(PRODUCT_NAME:rfc1034identifier)";
374 | PRODUCT_NAME = "$(TARGET_NAME)";
375 | SWIFT_VERSION = 4.0;
376 | };
377 | name = Release;
378 | };
379 | 12CBEE3A1B1AB4D600FDDE49 /* Debug */ = {
380 | isa = XCBuildConfiguration;
381 | buildSettings = {
382 | BUNDLE_LOADER = "$(TEST_HOST)";
383 | COMBINE_HIDPI_IMAGES = YES;
384 | FRAMEWORK_SEARCH_PATHS = (
385 | "$(DEVELOPER_FRAMEWORKS_DIR)",
386 | "$(inherited)",
387 | );
388 | GCC_PREPROCESSOR_DEFINITIONS = (
389 | "DEBUG=1",
390 | "$(inherited)",
391 | );
392 | INFOPLIST_FILE = LineNumberTests/Info.plist;
393 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
394 | PRODUCT_BUNDLE_IDENTIFIER = "com.yichizhang.$(PRODUCT_NAME:rfc1034identifier)";
395 | PRODUCT_NAME = "$(TARGET_NAME)";
396 | SWIFT_VERSION = 3.0;
397 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/LineNumber.app/Contents/MacOS/LineNumber";
398 | };
399 | name = Debug;
400 | };
401 | 12CBEE3B1B1AB4D600FDDE49 /* Release */ = {
402 | isa = XCBuildConfiguration;
403 | buildSettings = {
404 | BUNDLE_LOADER = "$(TEST_HOST)";
405 | COMBINE_HIDPI_IMAGES = YES;
406 | FRAMEWORK_SEARCH_PATHS = (
407 | "$(DEVELOPER_FRAMEWORKS_DIR)",
408 | "$(inherited)",
409 | );
410 | INFOPLIST_FILE = LineNumberTests/Info.plist;
411 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
412 | PRODUCT_BUNDLE_IDENTIFIER = "com.yichizhang.$(PRODUCT_NAME:rfc1034identifier)";
413 | PRODUCT_NAME = "$(TARGET_NAME)";
414 | SWIFT_VERSION = 3.0;
415 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/LineNumber.app/Contents/MacOS/LineNumber";
416 | };
417 | name = Release;
418 | };
419 | /* End XCBuildConfiguration section */
420 |
421 | /* Begin XCConfigurationList section */
422 | 12CBEE131B1AB4D600FDDE49 /* Build configuration list for PBXProject "LineNumber" */ = {
423 | isa = XCConfigurationList;
424 | buildConfigurations = (
425 | 12CBEE341B1AB4D600FDDE49 /* Debug */,
426 | 12CBEE351B1AB4D600FDDE49 /* Release */,
427 | );
428 | defaultConfigurationIsVisible = 0;
429 | defaultConfigurationName = Release;
430 | };
431 | 12CBEE361B1AB4D600FDDE49 /* Build configuration list for PBXNativeTarget "LineNumber" */ = {
432 | isa = XCConfigurationList;
433 | buildConfigurations = (
434 | 12CBEE371B1AB4D600FDDE49 /* Debug */,
435 | 12CBEE381B1AB4D600FDDE49 /* Release */,
436 | );
437 | defaultConfigurationIsVisible = 0;
438 | defaultConfigurationName = Release;
439 | };
440 | 12CBEE391B1AB4D600FDDE49 /* Build configuration list for PBXNativeTarget "LineNumberTests" */ = {
441 | isa = XCConfigurationList;
442 | buildConfigurations = (
443 | 12CBEE3A1B1AB4D600FDDE49 /* Debug */,
444 | 12CBEE3B1B1AB4D600FDDE49 /* Release */,
445 | );
446 | defaultConfigurationIsVisible = 0;
447 | defaultConfigurationName = Release;
448 | };
449 | /* End XCConfigurationList section */
450 | };
451 | rootObject = 12CBEE101B1AB4D600FDDE49 /* Project object */;
452 | }
453 |
--------------------------------------------------------------------------------
/Demo/LineNumber/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
640 |
641 |
642 |
643 |
644 |
645 |
646 |
647 |
648 |
649 |
650 |
651 |
652 |
653 |
654 |
655 |
656 |
657 |
658 |
659 |
660 |
661 |
662 |
663 |
664 |
665 |
666 |
667 |
668 |
669 |
670 |
671 |
672 |
673 |
674 |
675 |
676 |
677 |
678 |
679 |
680 |
681 |
682 |
683 |
684 |
685 |
686 |
687 |
688 |
689 |
690 |
691 |
692 |
693 |
694 |
695 |
696 |
697 |
698 |
699 |
700 |
701 |
702 |
703 |
704 |
705 |
706 |
707 |
708 |
709 |
710 |
711 |
712 |
713 |
714 |
715 |
716 |
717 |
718 |
719 |
720 |
721 |
722 |
723 |
724 |
725 |
726 |
727 |
728 |
729 |
730 |
731 |
--------------------------------------------------------------------------------