├── .swift-version
├── images
├── demo.png
└── logo.png
├── AttributedStringWrapper.xcodeproj
├── project.xcworkspace
│ └── contents.xcworkspacedata
├── xcshareddata
│ └── xcschemes
│ │ └── AttributedStringWrapper.xcscheme
└── project.pbxproj
├── AttributedStringWrapper.xcworkspace
└── contents.xcworkspacedata
├── Podfile.lock
├── Sources
├── AttributedStringWrapper.h
├── Info.plist
└── AttributedStringWrapper.swift
├── Podfile
├── Tests
├── Info.plist
└── AttributedStringWrapperTests.swift
├── Demo
├── Assets.xcassets
│ └── AppIcon.appiconset
│ │ └── Contents.json
├── Info.plist
├── Base.lproj
│ ├── LaunchScreen.storyboard
│ └── Main.storyboard
├── AppDelegate.swift
└── ViewController.swift
├── AttributedStringWrapper.podspec
├── LICENSE
├── .gitignore
└── README.md
/.swift-version:
--------------------------------------------------------------------------------
1 | 4.0
2 |
--------------------------------------------------------------------------------
/images/demo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopeer/AttributedStringWrapper/HEAD/images/demo.png
--------------------------------------------------------------------------------
/images/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopeer/AttributedStringWrapper/HEAD/images/logo.png
--------------------------------------------------------------------------------
/AttributedStringWrapper.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/AttributedStringWrapper.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/Podfile.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - AttributedStringWrapper (1.0.2)
3 |
4 | DEPENDENCIES:
5 | - AttributedStringWrapper (from `.`)
6 |
7 | EXTERNAL SOURCES:
8 | AttributedStringWrapper:
9 | :path: .
10 |
11 | SPEC CHECKSUMS:
12 | AttributedStringWrapper: b6ceaec3b0c24e7efa8076671d2fd4ed84972b0b
13 |
14 | PODFILE CHECKSUM: 6a32f415201e8b4448b70222d662ed98efb484da
15 |
16 | COCOAPODS: 1.3.1
17 |
--------------------------------------------------------------------------------
/Sources/AttributedStringWrapper.h:
--------------------------------------------------------------------------------
1 | //
2 | // AttributedStringWrapper.h
3 | // AttributedStringWrapper
4 | //
5 | // Created by 郜宇 on 2017/6/13.
6 | // Copyright © 2017年 Loopeer. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | //! Project version number for AttributedStringWrapper.
12 | FOUNDATION_EXPORT double AttributedStringWrapperVersionNumber;
13 |
14 | //! Project version string for AttributedStringWrapper.
15 | FOUNDATION_EXPORT const unsigned char AttributedStringWrapperVersionString[];
16 |
17 | // In this header, you should import all the public headers of your framework using statements like #import
18 |
19 |
20 |
--------------------------------------------------------------------------------
/Podfile:
--------------------------------------------------------------------------------
1 | # Uncomment the next line to define a global platform for your project
2 | platform :ios, ‘8.0’
3 |
4 | target 'AttributedStringWrapper' do
5 | # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
6 | use_frameworks!
7 |
8 | # Pods for AttributedStringWrapper
9 |
10 | target 'AttributedStringWrapperTests' do
11 | inherit! :search_paths
12 | # Pods for testing
13 | end
14 |
15 | end
16 |
17 |
18 |
19 |
20 | target 'Demo' do
21 | # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
22 | use_frameworks!
23 |
24 | pod 'AttributedStringWrapper', path: '.'
25 |
26 |
27 | # Pods for Demo
28 |
29 | end
30 |
--------------------------------------------------------------------------------
/Tests/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 | CFBundleVersion
20 | 1
21 |
22 |
23 |
--------------------------------------------------------------------------------
/Demo/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "29x29",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "29x29",
11 | "scale" : "3x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "40x40",
16 | "scale" : "2x"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "size" : "40x40",
21 | "scale" : "3x"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "size" : "60x60",
26 | "scale" : "2x"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "size" : "60x60",
31 | "scale" : "3x"
32 | }
33 | ],
34 | "info" : {
35 | "version" : 1,
36 | "author" : "xcode"
37 | }
38 | }
--------------------------------------------------------------------------------
/Sources/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
19 | CFBundleVersion
20 | $(CURRENT_PROJECT_VERSION)
21 | NSPrincipalClass
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/AttributedStringWrapper.podspec:
--------------------------------------------------------------------------------
1 | Pod::Spec.new do |s|
2 |
3 | s.name = "AttributedStringWrapper"
4 | s.version = "1.0.3"
5 | s.summary = "A simple packaging for NSAttributedString to make the developers easy to use"
6 |
7 | s.homepage = "https://github.com/loopeer/AttributedStringWrapper"
8 | s.license = { :type => "MIT", :file => "LICENSE" }
9 |
10 | s.authors = { "gaoyu" => "gaoyu@loopeer.com" }
11 | s.social_media_url = "http://www.jianshu.com/u/c4a4505bef4f"
12 | s.source = { :git => "https://github.com/loopeer/AttributedStringWrapper.git", :tag => s.version }
13 |
14 | s.source_files = ["Sources/*.swift", "Sources/AttributedStringWrapper.h"]
15 | s.public_header_files = ["Sources/AttributedStringWrapper.h"]
16 |
17 |
18 | s.ios.deployment_target = "8.0"
19 | s.requires_arc = true
20 |
21 | s.pod_target_xcconfig = { 'SWIFT_VERSION' => '4.0' }
22 |
23 | end
24 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2017 Loopeer
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 |
--------------------------------------------------------------------------------
/Tests/AttributedStringWrapperTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AttributedStringWrapperTests.swift
3 | // AttributedStringWrapperTests
4 | //
5 | // Created by 郜宇 on 2017/6/13.
6 | // Copyright © 2017年 Loopeer. All rights reserved.
7 | //
8 |
9 | import XCTest
10 | @testable import AttributedStringWrapper
11 |
12 | class AttributedStringWrapperTests: 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 | // Use XCTAssert and related functions to verify your tests produce the correct results.
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 |
--------------------------------------------------------------------------------
/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 | 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 | UIInterfaceOrientationLandscapeLeft
35 | UIInterfaceOrientationLandscapeRight
36 |
37 |
38 |
39 |
--------------------------------------------------------------------------------
/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 |
27 |
28 |
--------------------------------------------------------------------------------
/Demo/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // Demo
4 | //
5 | // Created by 郜宇 on 2017/6/13.
6 | // Copyright © 2017年 Loopeer. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @UIApplicationMain
12 | class AppDelegate: UIResponder, UIApplicationDelegate {
13 |
14 | var window: UIWindow?
15 |
16 |
17 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
18 | // Override point for customization after application launch.
19 | return true
20 | }
21 |
22 | func applicationWillResignActive(_ application: UIApplication) {
23 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
24 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
25 | }
26 |
27 | func applicationDidEnterBackground(_ application: UIApplication) {
28 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
29 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
30 | }
31 |
32 | func applicationWillEnterForeground(_ application: UIApplication) {
33 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
34 | }
35 |
36 | func applicationDidBecomeActive(_ application: UIApplication) {
37 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
38 | }
39 |
40 | func applicationWillTerminate(_ application: UIApplication) {
41 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
42 | }
43 |
44 |
45 | }
46 |
47 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | # Created by https://www.gitignore.io/api/macos,swift
3 |
4 | ### macOS ###
5 | *.DS_Store
6 | .AppleDouble
7 | .LSOverride
8 |
9 | # Icon must end with two \r
10 | Icon
11 |
12 | # Thumbnails
13 | ._*
14 |
15 | # Files that might appear in the root of a volume
16 | .DocumentRevisions-V100
17 | .fseventsd
18 | .Spotlight-V100
19 | .TemporaryItems
20 | .Trashes
21 | .VolumeIcon.icns
22 | .com.apple.timemachine.donotpresent
23 |
24 | # Directories potentially created on remote AFP share
25 | .AppleDB
26 | .AppleDesktop
27 | Network Trash Folder
28 | Temporary Items
29 | .apdisk
30 |
31 | ### Swift ###
32 | # Xcode
33 | #
34 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
35 |
36 | ## Build generated
37 | build/
38 | DerivedData/
39 |
40 | ## Various settings
41 | *.pbxuser
42 | !default.pbxuser
43 | *.mode1v3
44 | !default.mode1v3
45 | *.mode2v3
46 | !default.mode2v3
47 | *.perspectivev3
48 | !default.perspectivev3
49 | xcuserdata/
50 |
51 | ## Other
52 | *.moved-aside
53 | *.xccheckout
54 | *.xcscmblueprint
55 |
56 | ## Obj-C/Swift specific
57 | *.hmap
58 | *.ipa
59 | *.dSYM.zip
60 | *.dSYM
61 |
62 | ## Playgrounds
63 | timeline.xctimeline
64 | playground.xcworkspace
65 |
66 | # Swift Package Manager
67 | #
68 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
69 | # Packages/
70 | # Package.pins
71 | .build/
72 |
73 | # CocoaPods - Refactored to standalone file
74 |
75 | # Carthage - Refactored to standalone file
76 |
77 | # fastlane
78 | #
79 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
80 | # screenshots whenever they are needed.
81 | # For more information about the recommended setup visit:
82 | # https://docs.fastlane.tools/best-practices/source-control/#source-control
83 |
84 | fastlane/report.xml
85 | fastlane/Preview.html
86 | fastlane/screenshots
87 | fastlane/test_output
88 |
89 | ### Swift.Carthage Stack ###
90 | # Carthage
91 | #
92 | # Add this line if you want to avoid checking in source code from Carthage dependencies.
93 | # Carthage/Checkouts
94 |
95 | Carthage/Build
96 |
97 | ### Swift.CocoaPods Stack ###
98 | ## CocoaPods GitIgnore Template
99 |
100 | # CocoaPods - Only use to conserve bandwidth / Save time on Pushing
101 | # - Also handy if you have a lage number of dependant pods
102 | # - AS PER https://guides.cocoapods.org/using/using-cocoapods.html NEVER IGONRE THE LOCK FILE
103 | Pods/
104 |
105 | # End of https://www.gitignore.io/api/macos,swift
--------------------------------------------------------------------------------
/Demo/ViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ViewController.swift
3 | // Demo
4 | //
5 | // Created by 郜宇 on 2017/6/13.
6 | // Copyright © 2017年 Loopeer. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import AttributedStringWrapper
11 |
12 | let screenW = UIScreen.main.bounds.width
13 |
14 |
15 | class ViewController: UIViewController {
16 |
17 | @IBOutlet weak var label1: UILabel!
18 | @IBOutlet weak var label2: UILabel!
19 | @IBOutlet weak var label3: UILabel!
20 | @IBOutlet weak var label4: UILabel!
21 | @IBOutlet weak var label5: UILabel!
22 | @IBOutlet weak var label6: UILabel!
23 | @IBOutlet weak var label7: UILabel!
24 |
25 | override func viewDidLoad() {
26 | super.viewDidLoad()
27 |
28 | let content = "A view controller is tightly bound to the views it manages and takes part in the responder chain used to handle events."
29 |
30 |
31 | // 1. shadow: you can set range, default allRange
32 | let attrText1 = content.toAttributed.shadow {
33 | $0.shadowColor = UIColor.red
34 | $0.shadowOffset = CGSize(width: 3, height: 3)
35 | $0.shadowBlurRadius = 2.0
36 | }.font(UIFont.systemFont(ofSize: 15))
37 |
38 | label1.attributedText = attrText1.rawValue
39 | // Add the shadow offset
40 | print(attrText1.getHeight(by: screenW - 20) + 3)
41 |
42 |
43 |
44 | // 2. paragraphStyle: you can set range, default allRange
45 | let attrText2 = content.toAttributed.paragraph {
46 | $0.alignment = .center
47 | $0.lineSpacing = 8.0
48 | }.font(UIFont.systemFont(ofSize: 15))
49 | label2.attributedText = attrText2.rawValue
50 | print(attrText2.getHeight(by: screenW - 20))
51 |
52 |
53 |
54 | // 3. underLine: you can set range, default allRange
55 | label3.attributedText = content.toAttributed.underLine(style: [.styleDouble, .patternDot], color: UIColor.red).rawValue
56 |
57 |
58 |
59 | // 4. strikethrough: you can set range, default allRange
60 | label4.attributedText = content.toAttributed.strikethrough(style: [.styleDouble, .patternDot], color: UIColor.red, range: NSMakeRange(0, 10)).rawValue
61 |
62 |
63 |
64 | // 5. strokeStyle:
65 | label5.attributedText = content.toAttributed.stroke(color: UIColor.blue, width: 2.5).rawValue
66 |
67 |
68 | // 6. all:
69 | label6.attributedText = content.toAttributed
70 | .underLine(style: [.styleSingle, .patternDot], color: .red, range: NSMakeRange(0, 5))
71 | .font(.systemFont(ofSize: 18), range: NSMakeRange(5, 5))
72 | .backgroundColor(.blue, range: NSMakeRange(10, 5))
73 | .foregroundColor(.purple, range: NSMakeRange(15, 5))
74 | .baselineOffset(value: 5, range: NSMakeRange(20, 5))
75 | .obliqueness(angle: 0.5, range: NSMakeRange(25, 5))
76 | .kern(padding: 0.3, range: NSMakeRange(30, 5))
77 | .expansion(value: 0.3, range: NSMakeRange(35, 5))
78 | .stroke(color: .green, width: 3, range: NSMakeRange(40, 5))
79 | .textEffect(range: NSMakeRange(50, 5))
80 | .shadow{
81 | $0.shadowColor = UIColor.red
82 | $0.shadowOffset = CGSize(width: 3, height: 3)
83 | $0.shadowBlurRadius = 2.0
84 | }.rawValue
85 |
86 | label7.attributedText = ("昵称: ".toAttributed.font(UIFont.systemFont(ofSize: 18)).foregroundColor(UIColor.red) +
87 | "loopeer".toAttributed.font(UIFont.systemFont(ofSize: 13)).underLine(style: [.styleSingle])).rawValue
88 |
89 | }
90 |
91 | override func viewDidLayoutSubviews() {
92 | super.viewDidLayoutSubviews()
93 | print("label1 height: \(label1.frame.height)")
94 | print("label2 height: \(label2.frame.height)")
95 | }
96 |
97 | }
98 |
99 |
100 |
101 |
102 |
103 |
--------------------------------------------------------------------------------
/AttributedStringWrapper.xcodeproj/xcshareddata/xcschemes/AttributedStringWrapper.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
33 |
39 |
40 |
41 |
42 |
43 |
49 |
50 |
51 |
52 |
53 |
54 |
64 |
65 |
71 |
72 |
73 |
74 |
75 |
76 |
82 |
83 |
89 |
90 |
91 |
92 |
94 |
95 |
98 |
99 |
100 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # AttributedStringWrapper
2 |
3 |
4 |
5 | 
6 | 
7 | 
8 | [](https://cocoapods.org/pods/AttributedStringWrapper)
9 | [](https://github.com/loopeer/AttributedStringWrapper)
10 |
11 |
12 |
13 |
14 |
15 | **AttributedStringWrapper** is a simple packaging for NSAttributedString to make the developers easy to use
16 |
17 |
18 | ## Overview
19 |
20 | **AttributedStringWrapper** is base on String extension, converted into `RawRepresentable` protocal in order to solve the question of `Objective-C` namespace.
21 | So it looks a bit strange, if you have a better way, please contact me
22 |
23 |
24 |
25 | #### Before, you may like me
26 |
27 | ```swift
28 | extension UILabel {
29 | convenience init(frame: CGRect = .zero, attributedText: String, textColor: UIColor, font: UIFont, lineSpacing: CGFloat) {
30 | self.init(frame: frame)
31 | let paragraphStyle = NSMutableParagraphStyle()
32 | paragraphStyle.lineSpacing = lineSpacing
33 | paragraphStyle.lineBreakMode = .byTruncatingTail
34 | let attrStr = NSAttributedString(string: attributedText, attributes: [NSParagraphStyleAttributeName: paragraphStyle,
35 | NSFontAttributeName: font,
36 | NSForegroundColorAttributeName: textColor])
37 | self.attributedText = attrStr
38 | }
39 | }
40 |
41 | ```
42 |
43 |
44 | ```
45 | let attr = NSMutableAttributedString(string: content)
46 | let paragrap = NSParagraphStyle()
47 | paragrap.lineSpacing = 8.0
48 | paragrap.alignment = .center
49 | attr.addAttributes([NSParagraphStyle: paragrap], range: NSMakeRange(0, attr.length))
50 | attr.addAttributes([NSFontAttributeName: UIFont.systemFont(ofSize: 17)], range: NSMakeRange(0, attr.length))
51 | let shadow = NSShadow()
52 | shadow.shadowColor = UIColor.red
53 | shadow.shadowOffset = CGSize(width: 3, height: 3)
54 | shadow.shadowBlurRadius = 2.0
55 | attr.addAttributes([NSShadowAttributeName: NSShadow], range: NSMakeRange(0, attr.length))
56 | label6.attributedText = attr
57 |
58 | ```
59 |
60 |
61 | #### After:
62 |
63 | ```swift
64 | // 1. shadow: you can set range, default allRange
65 | label1.attributedText = content.toAttributed.shadow {
66 | $0.shadowColor = UIColor.red
67 | $0.shadowOffset = CGSize(width: 3, height: 3)
68 | $0.shadowBlurRadius = 2.0
69 | }.rawValue
70 |
71 |
72 | // 2. paragraphStyle: you can set range, default allRange
73 |
74 | let attrText2 = content.toAttributed.paragraph {
75 | $0.alignment = .center
76 | $0.lineSpacing = 8.0
77 | }.font(UIFont.systemFont(ofSize: 15))
78 |
79 | label2.attributedText = attrText2.rawValue
80 | print(attrText2.getHeight(by: screenW - 20))
81 |
82 |
83 | // 3. underLine: you can set range, default allRange
84 | label3.attributedText = content.toAttributed.underLine(style: [.styleDouble, .patternDot], color: UIColor.red).rawValue
85 |
86 | // 4. font, foregroundColor
87 | textField.attributedPlaceholder = "Please enter the phone number".toAttributed.font(.systemFont(ofSize: 15))
88 | .foregroundColor(.red).rawValue
89 |
90 | // 5. Even you can do it
91 | label6.attributedText = content.toAttributed
92 | .underLine(style: [.styleSingle, .patternDot], color: .red, range: NSMakeRange(0, 5))
93 | .font(.systemFont(ofSize: 18), range: NSMakeRange(5, 5))
94 | .backgroundColor(.blue, range: NSMakeRange(10, 5))
95 | .foregroundColor(.purple, range: NSMakeRange(15, 5))
96 | .baselineOffset(value: 5, range: NSMakeRange(20, 5))
97 | .obliqueness(angle: 0.5, range: NSMakeRange(25, 5))
98 | .kern(padding: 0.3, range: NSMakeRange(30, 5))
99 | .expansion(value: 0.3, range: NSMakeRange(35, 5))
100 | .stroke(color: .green, width: 3, range: NSMakeRange(40, 5))
101 | .textEffect(range: NSMakeRange(50, 5))
102 | .shadow{
103 | $0.shadowColor = UIColor.red
104 | $0.shadowOffset = CGSize(width: 3, height: 3)
105 | $0.shadowBlurRadius = 2.0
106 | }.rawValue
107 |
108 | // 6. “+”
109 | label7.attributedText = ("昵称: ".toAttributed.font(UIFont.systemFont(ofSize: 18)).foregroundColor(UIColor.red) +
110 | "loopeer".toAttributed.font(UIFont.systemFont(ofSize: 13)).underLine(style: [.styleSingle])).rawValue
111 |
112 |
113 | ```
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 | ## Installation
123 |
124 |
125 | ### 1. CocoaPods
126 |
127 | [CocoaPods](https://cocoapods.org/) is a dependency manager for Cocoa projects.
128 |
129 | Specify AttributedStringWrapper into your project's Podfile:
130 |
131 |
132 | ```ruby
133 | # source 'https://github.com/CocoaPods/Specs.git'
134 |
135 | platform :ios, '8.0'
136 | use_frameworks!
137 |
138 | target '' do
139 | #swift 3.x
140 | pod 'AttributedStringWrapper', '~> 1.0.2'
141 |
142 | #swift 4.0
143 | pod 'AttributedStringWrapper', '~> 1.0.3'
144 |
145 | end
146 | ```
147 |
148 |
149 | Then run the following command:
150 |
151 | ```sh
152 | $ pod install
153 | ```
154 |
155 |
156 | ### 2. Carthage
157 |
158 | [Carthage](https://github.com/Carthage/Carthage) is a simple, decentralized
159 | dependency manager for Cocoa.
160 |
161 | Specify AttributedStringWrapper into your project's Carthage:
162 |
163 |
164 | ```
165 | github "loopeer/AttributedStringWrapper" ~> 1.0.2
166 |
167 | ```
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
--------------------------------------------------------------------------------
/Sources/AttributedStringWrapper.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AttributedStringWrapper.swift
3 | // AttributedStringWrapper
4 | //
5 | // Created by 郜宇 on 2017/6/13.
6 | // Copyright © 2017年 Loopeer. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public extension String {
12 | var toAttributed: AttributedStringWrapper {
13 | return AttributedStringWrapper(rawValue: NSMutableAttributedString(string: self))
14 | }
15 | }
16 |
17 | public struct AttributedStringWrapper: RawRepresentable {
18 | public typealias RawValue = NSMutableAttributedString
19 | public var rawValue: NSMutableAttributedString
20 | public init(rawValue: AttributedStringWrapper.RawValue) {
21 | self.rawValue = rawValue
22 | }
23 | }
24 |
25 | public extension AttributedStringWrapper {
26 |
27 | typealias ParagraphStyleSetup = (NSMutableParagraphStyle) -> Void
28 | typealias ShadowStyleSetup = (NSShadow) -> Void
29 |
30 | @available(iOS 9.0, *)
31 | typealias WriteDirection = (formatType: NSWritingDirectionFormatType, direction: NSWritingDirection)
32 |
33 | public var allRange: NSRange {
34 | return NSMakeRange(0, self.rawValue.length)
35 | }
36 |
37 | /// NSParagraphStyleAttributeName(段落)
38 | @discardableResult
39 | func paragraph(range: NSRange? = nil, setup: ParagraphStyleSetup) -> AttributedStringWrapper {
40 | let paragraphStyle = NSMutableParagraphStyle()
41 | setup(paragraphStyle)
42 | rawValue.addAttributes([NSAttributedStringKey.paragraphStyle: paragraphStyle],
43 | range: range ?? allRange)
44 | return self
45 | }
46 |
47 | /// NSForegroundColorAttributeName(字体颜色)
48 | @discardableResult
49 | func foregroundColor(_ color: UIColor, range: NSRange? = nil) -> AttributedStringWrapper {
50 | rawValue.addAttributes([NSAttributedStringKey.foregroundColor: color],
51 | range: range ?? allRange)
52 | return self
53 | }
54 |
55 | /// NSFontAttributeName(字体)
56 | @discardableResult
57 | func font(_ font: UIFont, range: NSRange? = nil) -> AttributedStringWrapper {
58 | rawValue.addAttributes([NSAttributedStringKey.font: font],
59 | range: range ?? allRange)
60 | return self
61 | }
62 | /// NSBackgroundColorAttributeName(字体背景色)
63 | @discardableResult
64 | func backgroundColor(_ color: UIColor, range: NSRange? = nil) -> AttributedStringWrapper {
65 | rawValue.addAttributes([NSAttributedStringKey.backgroundColor: color],
66 | range: range ?? allRange)
67 | return self
68 | }
69 |
70 | /// NSStrikethroughStyleAttributeName(删除线)
71 | @discardableResult
72 | func strikethrough(style: [NSUnderlineStyle],
73 | color: UIColor? = nil,
74 | range: NSRange? = nil) -> AttributedStringWrapper {
75 | // iOS10.3 bugs: https://stackoverflow.com/questions/43070335/nsstrikethroughstyleattributename-how-to-strike-out-the-string-in-ios-10-3
76 | rawValue.addAttributes([NSAttributedStringKey.strikethroughStyle: style.reduce(0) { $0 | $1.rawValue }, NSAttributedStringKey.baselineOffset: 0], range: range ?? allRange)
77 | guard let color = color else { return self }
78 | rawValue.addAttributes([NSAttributedStringKey.strikethroughColor: color], range: range ?? allRange)
79 | return self
80 | }
81 |
82 | /// NSUnderlineStyleAttributeName(下划线)
83 | @discardableResult
84 | func underLine(style: [NSUnderlineStyle],
85 | color: UIColor? = nil,
86 | range: NSRange? = nil) -> AttributedStringWrapper {
87 | rawValue.addAttributes([NSAttributedStringKey.underlineStyle: style.reduce(0) { $0 | $1.rawValue }], range: range ?? allRange)
88 | guard let color = color else { return self }
89 | rawValue.addAttributes([NSAttributedStringKey.underlineColor: color], range: range ?? allRange)
90 | return self
91 | }
92 |
93 | /// NSShadowAttributeName(阴影)
94 | @discardableResult
95 | func shadow(range: NSRange? = nil, setup: ShadowStyleSetup) -> AttributedStringWrapper {
96 | let shadow = NSShadow()
97 | setup(shadow)
98 | rawValue.addAttributes([NSAttributedStringKey.shadow: shadow], range: range ?? allRange)
99 | return self
100 | }
101 |
102 | /// NSObliquenessAttributeName 设置字形倾斜度,正值右倾,负值左倾
103 | @discardableResult
104 | func obliqueness(angle: CGFloat, range: NSRange? = nil) -> AttributedStringWrapper {
105 | rawValue.addAttributes([NSAttributedStringKey.obliqueness: angle], range: range ?? allRange)
106 | return self
107 | }
108 |
109 | /// NSWritingDirectionAttributeName 设置文字书写方向,从左向右书写或者从右向左书写
110 | @available(iOS 9.0, *)
111 | @discardableResult
112 | func writingDirection(write: WriteDirection, range: NSRange? = nil) -> AttributedStringWrapper {
113 | rawValue.addAttributes([NSAttributedStringKey.writingDirection: [write.direction.rawValue | write.formatType.rawValue]], range: range ?? allRange)
114 | return self
115 | }
116 |
117 | /// 空心字 颜色, 线宽
118 | @discardableResult
119 | func stroke(color: UIColor, width: CGFloat, range: NSRange? = nil) -> AttributedStringWrapper {
120 | rawValue.addAttributes([NSAttributedStringKey.strokeColor: color], range: range ?? allRange)
121 | rawValue.addAttributes([NSAttributedStringKey.strokeWidth: width], range: range ?? allRange)
122 | return self
123 | }
124 |
125 | /// NSKernAttributeName 文字间的间距
126 | @discardableResult
127 | func kern(padding: CGFloat, range: NSRange? = nil) -> AttributedStringWrapper {
128 | rawValue.addAttributes([NSAttributedStringKey.kern: padding], range: range ?? allRange)
129 | return self
130 | }
131 |
132 | /// NSExpansionAttributeName 拉伸压缩 正值横向拉伸 负值横向压缩
133 | @discardableResult
134 | func expansion(value: CGFloat, range: NSRange? = nil) -> AttributedStringWrapper {
135 | rawValue.addAttributes([NSAttributedStringKey.expansion: value], range: range ?? allRange)
136 | return self
137 | }
138 |
139 | /// NSLigatureAttributeName 连体 0 表示没有连体字符。1 表示使用默认的连体字符。2表示使用所有连体符号。默认值为 1(注意,iOS 不支持值为 2)
140 | @discardableResult
141 | func ligature(value: CGFloat, range: NSRange? = nil) -> AttributedStringWrapper {
142 | rawValue.addAttributes([NSAttributedStringKey.ligature: value], range: range ?? allRange)
143 | return self
144 | }
145 |
146 | /// NSBaselineOffsetAttributeName 基线偏移量 正值上偏 负值下偏
147 | @discardableResult
148 | func baselineOffset(value: CGFloat, range: NSRange? = nil) -> AttributedStringWrapper {
149 | rawValue.addAttributes([NSAttributedStringKey.baselineOffset: value], range: range ?? allRange)
150 | return self
151 | }
152 |
153 | /// NSTextEffectAttributeName 特殊效果 目前只有NSTextEffectLetterpressStyle(凸版印刷效果)可用
154 | @discardableResult
155 | func textEffect(value: NSAttributedString.TextEffectStyle = .letterpressStyle, range: NSRange? = nil) -> AttributedStringWrapper {
156 | rawValue.addAttributes([NSAttributedStringKey.textEffect: value], range: range ?? allRange)
157 | return self
158 | }
159 |
160 | /// NSVerticalGlyphFormAttributeName 横、竖排版 0横向排版 1竖向排版
161 | @discardableResult
162 | func verticalGlyphForm(value: Int, range: NSRange? = nil) -> AttributedStringWrapper {
163 | rawValue.addAttributes([NSAttributedStringKey.verticalGlyphForm: value], range: range ?? allRange)
164 | return self
165 | }
166 |
167 | /// get height, Before this, you must set the height of the text firstly
168 | func getHeight(by fixedWidth: CGFloat) -> CGFloat {
169 | let h = rawValue.boundingRect(with: CGSize(width: fixedWidth, height: CGFloat(MAXFLOAT)), options: [.usesFontLeading , .usesLineFragmentOrigin, .usesDeviceMetrics], context: nil).size.height
170 | return ceil(h)
171 | }
172 | /// get width, Before this, you must set the height of the text firstly
173 | func getWidth(by fixedHeight: CGFloat) -> CGFloat {
174 | let w = rawValue.boundingRect(with: CGSize(width: CGFloat(MAXFLOAT), height: fixedHeight), options: [.usesFontLeading , .usesLineFragmentOrigin], context: nil).size.width
175 | return ceil(w)
176 | }
177 | }
178 |
179 | public func + (lf: AttributedStringWrapper, rf: AttributedStringWrapper) -> AttributedStringWrapper {
180 | lf.rawValue.append(rf.rawValue)
181 | return lf
182 | }
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
--------------------------------------------------------------------------------
/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 |
30 |
36 |
42 |
48 |
54 |
60 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
--------------------------------------------------------------------------------
/AttributedStringWrapper.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 5C4989378A428074F4ED2997 /* Pods_Demo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2EAD85520F78720B9D6FF301 /* Pods_Demo.framework */; };
11 | 5EED64491D35D6C08A961978 /* Pods_AttributedStringWrapper.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DBBFED007BFF479509B5C8E /* Pods_AttributedStringWrapper.framework */; };
12 | 7313FF4C1EEFD98C003ED487 /* AttributedStringWrapper.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7313FF421EEFD98C003ED487 /* AttributedStringWrapper.framework */; };
13 | 7313FF5F1EEFDACA003ED487 /* AttributedStringWrapper.h in Headers */ = {isa = PBXBuildFile; fileRef = 7313FF5D1EEFDACA003ED487 /* AttributedStringWrapper.h */; settings = {ATTRIBUTES = (Public, ); }; };
14 | 7313FF601EEFDACA003ED487 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 7313FF5E1EEFDACA003ED487 /* Info.plist */; };
15 | 7313FF671EEFDC6C003ED487 /* AttributedStringWrapperTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7313FF621EEFDAD4003ED487 /* AttributedStringWrapperTests.swift */; };
16 | 7313FF691EEFDD0C003ED487 /* AttributedStringWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7313FF681EEFDD0C003ED487 /* AttributedStringWrapper.swift */; };
17 | 7313FF951EEFDEA0003ED487 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7313FF941EEFDEA0003ED487 /* AppDelegate.swift */; };
18 | 7313FF971EEFDEA0003ED487 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7313FF961EEFDEA0003ED487 /* ViewController.swift */; };
19 | 7313FF9A1EEFDEA0003ED487 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7313FF981EEFDEA0003ED487 /* Main.storyboard */; };
20 | 7313FF9C1EEFDEA0003ED487 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7313FF9B1EEFDEA0003ED487 /* Assets.xcassets */; };
21 | 7313FF9F1EEFDEA0003ED487 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7313FF9D1EEFDEA0003ED487 /* LaunchScreen.storyboard */; };
22 | 9ACB0DBC9A82FA87F945A3F8 /* Pods_AttributedStringWrapperTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E3B7D3AF603B1F099B2BD650 /* Pods_AttributedStringWrapperTests.framework */; };
23 | /* End PBXBuildFile section */
24 |
25 | /* Begin PBXContainerItemProxy section */
26 | 7313FF4D1EEFD98C003ED487 /* PBXContainerItemProxy */ = {
27 | isa = PBXContainerItemProxy;
28 | containerPortal = 7313FF391EEFD98C003ED487 /* Project object */;
29 | proxyType = 1;
30 | remoteGlobalIDString = 7313FF411EEFD98C003ED487;
31 | remoteInfo = AttributedStringWrapper;
32 | };
33 | /* End PBXContainerItemProxy section */
34 |
35 | /* Begin PBXFileReference section */
36 | 2BB622E9A447407F91D3E7CC /* 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 = ""; };
37 | 2EAD85520F78720B9D6FF301 /* Pods_Demo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Demo.framework; sourceTree = BUILT_PRODUCTS_DIR; };
38 | 3DBBFED007BFF479509B5C8E /* Pods_AttributedStringWrapper.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AttributedStringWrapper.framework; sourceTree = BUILT_PRODUCTS_DIR; };
39 | 7313FF421EEFD98C003ED487 /* AttributedStringWrapper.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AttributedStringWrapper.framework; sourceTree = BUILT_PRODUCTS_DIR; };
40 | 7313FF4B1EEFD98C003ED487 /* AttributedStringWrapperTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AttributedStringWrapperTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
41 | 7313FF5D1EEFDACA003ED487 /* AttributedStringWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AttributedStringWrapper.h; sourceTree = ""; };
42 | 7313FF5E1EEFDACA003ED487 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
43 | 7313FF621EEFDAD4003ED487 /* AttributedStringWrapperTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AttributedStringWrapperTests.swift; sourceTree = ""; };
44 | 7313FF631EEFDAD4003ED487 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
45 | 7313FF681EEFDD0C003ED487 /* AttributedStringWrapper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AttributedStringWrapper.swift; sourceTree = ""; };
46 | 7313FF921EEFDEA0003ED487 /* Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Demo.app; sourceTree = BUILT_PRODUCTS_DIR; };
47 | 7313FF941EEFDEA0003ED487 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
48 | 7313FF961EEFDEA0003ED487 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; };
49 | 7313FF991EEFDEA0003ED487 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
50 | 7313FF9B1EEFDEA0003ED487 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
51 | 7313FF9E1EEFDEA0003ED487 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
52 | 7313FFA01EEFDEA0003ED487 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
53 | BC2D63B42106C59772165A88 /* Pods-AttributedStringWrapperTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AttributedStringWrapperTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-AttributedStringWrapperTests/Pods-AttributedStringWrapperTests.release.xcconfig"; sourceTree = ""; };
54 | C507B17161F96A8F1D6C8984 /* Pods-AttributedStringWrapper.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AttributedStringWrapper.release.xcconfig"; path = "Pods/Target Support Files/Pods-AttributedStringWrapper/Pods-AttributedStringWrapper.release.xcconfig"; sourceTree = ""; };
55 | CC223B3CF82F2AD1768C9995 /* Pods-AttributedStringWrapperTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AttributedStringWrapperTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-AttributedStringWrapperTests/Pods-AttributedStringWrapperTests.debug.xcconfig"; sourceTree = ""; };
56 | CD544AAB574221185188E785 /* 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 = ""; };
57 | DBE5F6FFFD6706A1E68DB414 /* Pods-AttributedStringWrapper.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AttributedStringWrapper.debug.xcconfig"; path = "Pods/Target Support Files/Pods-AttributedStringWrapper/Pods-AttributedStringWrapper.debug.xcconfig"; sourceTree = ""; };
58 | E3B7D3AF603B1F099B2BD650 /* Pods_AttributedStringWrapperTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AttributedStringWrapperTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
59 | /* End PBXFileReference section */
60 |
61 | /* Begin PBXFrameworksBuildPhase section */
62 | 7313FF3E1EEFD98C003ED487 /* Frameworks */ = {
63 | isa = PBXFrameworksBuildPhase;
64 | buildActionMask = 2147483647;
65 | files = (
66 | 5EED64491D35D6C08A961978 /* Pods_AttributedStringWrapper.framework in Frameworks */,
67 | );
68 | runOnlyForDeploymentPostprocessing = 0;
69 | };
70 | 7313FF481EEFD98C003ED487 /* Frameworks */ = {
71 | isa = PBXFrameworksBuildPhase;
72 | buildActionMask = 2147483647;
73 | files = (
74 | 7313FF4C1EEFD98C003ED487 /* AttributedStringWrapper.framework in Frameworks */,
75 | 9ACB0DBC9A82FA87F945A3F8 /* Pods_AttributedStringWrapperTests.framework in Frameworks */,
76 | );
77 | runOnlyForDeploymentPostprocessing = 0;
78 | };
79 | 7313FF8F1EEFDEA0003ED487 /* Frameworks */ = {
80 | isa = PBXFrameworksBuildPhase;
81 | buildActionMask = 2147483647;
82 | files = (
83 | 5C4989378A428074F4ED2997 /* Pods_Demo.framework in Frameworks */,
84 | );
85 | runOnlyForDeploymentPostprocessing = 0;
86 | };
87 | /* End PBXFrameworksBuildPhase section */
88 |
89 | /* Begin PBXGroup section */
90 | 47B99B94AEA5AEC234728D26 /* Pods */ = {
91 | isa = PBXGroup;
92 | children = (
93 | DBE5F6FFFD6706A1E68DB414 /* Pods-AttributedStringWrapper.debug.xcconfig */,
94 | C507B17161F96A8F1D6C8984 /* Pods-AttributedStringWrapper.release.xcconfig */,
95 | CC223B3CF82F2AD1768C9995 /* Pods-AttributedStringWrapperTests.debug.xcconfig */,
96 | BC2D63B42106C59772165A88 /* Pods-AttributedStringWrapperTests.release.xcconfig */,
97 | CD544AAB574221185188E785 /* Pods-Demo.debug.xcconfig */,
98 | 2BB622E9A447407F91D3E7CC /* Pods-Demo.release.xcconfig */,
99 | );
100 | name = Pods;
101 | sourceTree = "";
102 | };
103 | 72CA242D48A6EE7A2653177D /* Frameworks */ = {
104 | isa = PBXGroup;
105 | children = (
106 | 3DBBFED007BFF479509B5C8E /* Pods_AttributedStringWrapper.framework */,
107 | E3B7D3AF603B1F099B2BD650 /* Pods_AttributedStringWrapperTests.framework */,
108 | 2EAD85520F78720B9D6FF301 /* Pods_Demo.framework */,
109 | );
110 | name = Frameworks;
111 | sourceTree = "";
112 | };
113 | 7313FF381EEFD98C003ED487 = {
114 | isa = PBXGroup;
115 | children = (
116 | 7313FF5C1EEFDACA003ED487 /* Sources */,
117 | 7313FF611EEFDAD4003ED487 /* Tests */,
118 | 7313FF931EEFDEA0003ED487 /* Demo */,
119 | 7313FF431EEFD98C003ED487 /* Products */,
120 | 47B99B94AEA5AEC234728D26 /* Pods */,
121 | 72CA242D48A6EE7A2653177D /* Frameworks */,
122 | );
123 | sourceTree = "";
124 | };
125 | 7313FF431EEFD98C003ED487 /* Products */ = {
126 | isa = PBXGroup;
127 | children = (
128 | 7313FF421EEFD98C003ED487 /* AttributedStringWrapper.framework */,
129 | 7313FF4B1EEFD98C003ED487 /* AttributedStringWrapperTests.xctest */,
130 | 7313FF921EEFDEA0003ED487 /* Demo.app */,
131 | );
132 | name = Products;
133 | sourceTree = "";
134 | };
135 | 7313FF5C1EEFDACA003ED487 /* Sources */ = {
136 | isa = PBXGroup;
137 | children = (
138 | 7313FF5D1EEFDACA003ED487 /* AttributedStringWrapper.h */,
139 | 7313FF681EEFDD0C003ED487 /* AttributedStringWrapper.swift */,
140 | 7313FF5E1EEFDACA003ED487 /* Info.plist */,
141 | );
142 | path = Sources;
143 | sourceTree = "";
144 | };
145 | 7313FF611EEFDAD4003ED487 /* Tests */ = {
146 | isa = PBXGroup;
147 | children = (
148 | 7313FF621EEFDAD4003ED487 /* AttributedStringWrapperTests.swift */,
149 | 7313FF631EEFDAD4003ED487 /* Info.plist */,
150 | );
151 | path = Tests;
152 | sourceTree = "";
153 | };
154 | 7313FF931EEFDEA0003ED487 /* Demo */ = {
155 | isa = PBXGroup;
156 | children = (
157 | 7313FF941EEFDEA0003ED487 /* AppDelegate.swift */,
158 | 7313FF961EEFDEA0003ED487 /* ViewController.swift */,
159 | 7313FF981EEFDEA0003ED487 /* Main.storyboard */,
160 | 7313FF9B1EEFDEA0003ED487 /* Assets.xcassets */,
161 | 7313FF9D1EEFDEA0003ED487 /* LaunchScreen.storyboard */,
162 | 7313FFA01EEFDEA0003ED487 /* Info.plist */,
163 | );
164 | path = Demo;
165 | sourceTree = "";
166 | };
167 | /* End PBXGroup section */
168 |
169 | /* Begin PBXHeadersBuildPhase section */
170 | 7313FF3F1EEFD98C003ED487 /* Headers */ = {
171 | isa = PBXHeadersBuildPhase;
172 | buildActionMask = 2147483647;
173 | files = (
174 | 7313FF5F1EEFDACA003ED487 /* AttributedStringWrapper.h in Headers */,
175 | );
176 | runOnlyForDeploymentPostprocessing = 0;
177 | };
178 | /* End PBXHeadersBuildPhase section */
179 |
180 | /* Begin PBXNativeTarget section */
181 | 7313FF411EEFD98C003ED487 /* AttributedStringWrapper */ = {
182 | isa = PBXNativeTarget;
183 | buildConfigurationList = 7313FF561EEFD98C003ED487 /* Build configuration list for PBXNativeTarget "AttributedStringWrapper" */;
184 | buildPhases = (
185 | 2A0C89AF6B56F1FB0E6958A6 /* [CP] Check Pods Manifest.lock */,
186 | 7313FF3D1EEFD98C003ED487 /* Sources */,
187 | 7313FF3E1EEFD98C003ED487 /* Frameworks */,
188 | 7313FF3F1EEFD98C003ED487 /* Headers */,
189 | 7313FF401EEFD98C003ED487 /* Resources */,
190 | 8E3CD7509293FFF6F8267722 /* [CP] Copy Pods Resources */,
191 | );
192 | buildRules = (
193 | );
194 | dependencies = (
195 | );
196 | name = AttributedStringWrapper;
197 | productName = AttributedStringWrapper;
198 | productReference = 7313FF421EEFD98C003ED487 /* AttributedStringWrapper.framework */;
199 | productType = "com.apple.product-type.framework";
200 | };
201 | 7313FF4A1EEFD98C003ED487 /* AttributedStringWrapperTests */ = {
202 | isa = PBXNativeTarget;
203 | buildConfigurationList = 7313FF591EEFD98C003ED487 /* Build configuration list for PBXNativeTarget "AttributedStringWrapperTests" */;
204 | buildPhases = (
205 | 74A10E578DE5848A0CC4CE79 /* [CP] Check Pods Manifest.lock */,
206 | 7313FF471EEFD98C003ED487 /* Sources */,
207 | 7313FF481EEFD98C003ED487 /* Frameworks */,
208 | 7313FF491EEFD98C003ED487 /* Resources */,
209 | A9DB0CCEE9FCB7B4E13B7F9F /* [CP] Embed Pods Frameworks */,
210 | CF1A46819791E11D8C163400 /* [CP] Copy Pods Resources */,
211 | );
212 | buildRules = (
213 | );
214 | dependencies = (
215 | 7313FF4E1EEFD98C003ED487 /* PBXTargetDependency */,
216 | );
217 | name = AttributedStringWrapperTests;
218 | productName = AttributedStringWrapperTests;
219 | productReference = 7313FF4B1EEFD98C003ED487 /* AttributedStringWrapperTests.xctest */;
220 | productType = "com.apple.product-type.bundle.unit-test";
221 | };
222 | 7313FF911EEFDEA0003ED487 /* Demo */ = {
223 | isa = PBXNativeTarget;
224 | buildConfigurationList = 7313FFA11EEFDEA0003ED487 /* Build configuration list for PBXNativeTarget "Demo" */;
225 | buildPhases = (
226 | B074EFCFF3F6D86F051F52C7 /* [CP] Check Pods Manifest.lock */,
227 | 7313FF8E1EEFDEA0003ED487 /* Sources */,
228 | 7313FF8F1EEFDEA0003ED487 /* Frameworks */,
229 | 7313FF901EEFDEA0003ED487 /* Resources */,
230 | F5EDFC5AD7A75A87AFB03479 /* [CP] Embed Pods Frameworks */,
231 | 42164BE4D2B1C80DB1E4D2CC /* [CP] Copy Pods Resources */,
232 | );
233 | buildRules = (
234 | );
235 | dependencies = (
236 | );
237 | name = Demo;
238 | productName = Demo;
239 | productReference = 7313FF921EEFDEA0003ED487 /* Demo.app */;
240 | productType = "com.apple.product-type.application";
241 | };
242 | /* End PBXNativeTarget section */
243 |
244 | /* Begin PBXProject section */
245 | 7313FF391EEFD98C003ED487 /* Project object */ = {
246 | isa = PBXProject;
247 | attributes = {
248 | LastSwiftUpdateCheck = 0830;
249 | LastUpgradeCheck = 0830;
250 | ORGANIZATIONNAME = Loopeer;
251 | TargetAttributes = {
252 | 7313FF411EEFD98C003ED487 = {
253 | CreatedOnToolsVersion = 8.3.2;
254 | DevelopmentTeam = VS86A5N9W7;
255 | LastSwiftMigration = 0900;
256 | ProvisioningStyle = Automatic;
257 | };
258 | 7313FF4A1EEFD98C003ED487 = {
259 | CreatedOnToolsVersion = 8.3.2;
260 | DevelopmentTeam = VS86A5N9W7;
261 | LastSwiftMigration = 0900;
262 | ProvisioningStyle = Automatic;
263 | };
264 | 7313FF911EEFDEA0003ED487 = {
265 | CreatedOnToolsVersion = 8.3.2;
266 | DevelopmentTeam = VS86A5N9W7;
267 | ProvisioningStyle = Automatic;
268 | };
269 | };
270 | };
271 | buildConfigurationList = 7313FF3C1EEFD98C003ED487 /* Build configuration list for PBXProject "AttributedStringWrapper" */;
272 | compatibilityVersion = "Xcode 3.2";
273 | developmentRegion = English;
274 | hasScannedForEncodings = 0;
275 | knownRegions = (
276 | en,
277 | Base,
278 | );
279 | mainGroup = 7313FF381EEFD98C003ED487;
280 | productRefGroup = 7313FF431EEFD98C003ED487 /* Products */;
281 | projectDirPath = "";
282 | projectRoot = "";
283 | targets = (
284 | 7313FF411EEFD98C003ED487 /* AttributedStringWrapper */,
285 | 7313FF4A1EEFD98C003ED487 /* AttributedStringWrapperTests */,
286 | 7313FF911EEFDEA0003ED487 /* Demo */,
287 | );
288 | };
289 | /* End PBXProject section */
290 |
291 | /* Begin PBXResourcesBuildPhase section */
292 | 7313FF401EEFD98C003ED487 /* Resources */ = {
293 | isa = PBXResourcesBuildPhase;
294 | buildActionMask = 2147483647;
295 | files = (
296 | 7313FF601EEFDACA003ED487 /* Info.plist in Resources */,
297 | );
298 | runOnlyForDeploymentPostprocessing = 0;
299 | };
300 | 7313FF491EEFD98C003ED487 /* Resources */ = {
301 | isa = PBXResourcesBuildPhase;
302 | buildActionMask = 2147483647;
303 | files = (
304 | );
305 | runOnlyForDeploymentPostprocessing = 0;
306 | };
307 | 7313FF901EEFDEA0003ED487 /* Resources */ = {
308 | isa = PBXResourcesBuildPhase;
309 | buildActionMask = 2147483647;
310 | files = (
311 | 7313FF9F1EEFDEA0003ED487 /* LaunchScreen.storyboard in Resources */,
312 | 7313FF9C1EEFDEA0003ED487 /* Assets.xcassets in Resources */,
313 | 7313FF9A1EEFDEA0003ED487 /* Main.storyboard in Resources */,
314 | );
315 | runOnlyForDeploymentPostprocessing = 0;
316 | };
317 | /* End PBXResourcesBuildPhase section */
318 |
319 | /* Begin PBXShellScriptBuildPhase section */
320 | 2A0C89AF6B56F1FB0E6958A6 /* [CP] Check Pods Manifest.lock */ = {
321 | isa = PBXShellScriptBuildPhase;
322 | buildActionMask = 2147483647;
323 | files = (
324 | );
325 | inputPaths = (
326 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
327 | "${PODS_ROOT}/Manifest.lock",
328 | );
329 | name = "[CP] Check Pods Manifest.lock";
330 | outputPaths = (
331 | "$(DERIVED_FILE_DIR)/Pods-AttributedStringWrapper-checkManifestLockResult.txt",
332 | );
333 | runOnlyForDeploymentPostprocessing = 0;
334 | shellPath = /bin/sh;
335 | 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";
336 | showEnvVarsInLog = 0;
337 | };
338 | 42164BE4D2B1C80DB1E4D2CC /* [CP] Copy Pods Resources */ = {
339 | isa = PBXShellScriptBuildPhase;
340 | buildActionMask = 2147483647;
341 | files = (
342 | );
343 | inputPaths = (
344 | );
345 | name = "[CP] Copy Pods Resources";
346 | outputPaths = (
347 | );
348 | runOnlyForDeploymentPostprocessing = 0;
349 | shellPath = /bin/sh;
350 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Demo/Pods-Demo-resources.sh\"\n";
351 | showEnvVarsInLog = 0;
352 | };
353 | 74A10E578DE5848A0CC4CE79 /* [CP] Check Pods Manifest.lock */ = {
354 | isa = PBXShellScriptBuildPhase;
355 | buildActionMask = 2147483647;
356 | files = (
357 | );
358 | inputPaths = (
359 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
360 | "${PODS_ROOT}/Manifest.lock",
361 | );
362 | name = "[CP] Check Pods Manifest.lock";
363 | outputPaths = (
364 | "$(DERIVED_FILE_DIR)/Pods-AttributedStringWrapperTests-checkManifestLockResult.txt",
365 | );
366 | runOnlyForDeploymentPostprocessing = 0;
367 | shellPath = /bin/sh;
368 | 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";
369 | showEnvVarsInLog = 0;
370 | };
371 | 8E3CD7509293FFF6F8267722 /* [CP] Copy Pods Resources */ = {
372 | isa = PBXShellScriptBuildPhase;
373 | buildActionMask = 2147483647;
374 | files = (
375 | );
376 | inputPaths = (
377 | );
378 | name = "[CP] Copy Pods Resources";
379 | outputPaths = (
380 | );
381 | runOnlyForDeploymentPostprocessing = 0;
382 | shellPath = /bin/sh;
383 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-AttributedStringWrapper/Pods-AttributedStringWrapper-resources.sh\"\n";
384 | showEnvVarsInLog = 0;
385 | };
386 | A9DB0CCEE9FCB7B4E13B7F9F /* [CP] Embed Pods Frameworks */ = {
387 | isa = PBXShellScriptBuildPhase;
388 | buildActionMask = 2147483647;
389 | files = (
390 | );
391 | inputPaths = (
392 | );
393 | name = "[CP] Embed Pods Frameworks";
394 | outputPaths = (
395 | );
396 | runOnlyForDeploymentPostprocessing = 0;
397 | shellPath = /bin/sh;
398 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-AttributedStringWrapperTests/Pods-AttributedStringWrapperTests-frameworks.sh\"\n";
399 | showEnvVarsInLog = 0;
400 | };
401 | B074EFCFF3F6D86F051F52C7 /* [CP] Check Pods Manifest.lock */ = {
402 | isa = PBXShellScriptBuildPhase;
403 | buildActionMask = 2147483647;
404 | files = (
405 | );
406 | inputPaths = (
407 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
408 | "${PODS_ROOT}/Manifest.lock",
409 | );
410 | name = "[CP] Check Pods Manifest.lock";
411 | outputPaths = (
412 | "$(DERIVED_FILE_DIR)/Pods-Demo-checkManifestLockResult.txt",
413 | );
414 | runOnlyForDeploymentPostprocessing = 0;
415 | shellPath = /bin/sh;
416 | 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";
417 | showEnvVarsInLog = 0;
418 | };
419 | CF1A46819791E11D8C163400 /* [CP] Copy Pods Resources */ = {
420 | isa = PBXShellScriptBuildPhase;
421 | buildActionMask = 2147483647;
422 | files = (
423 | );
424 | inputPaths = (
425 | );
426 | name = "[CP] Copy Pods Resources";
427 | outputPaths = (
428 | );
429 | runOnlyForDeploymentPostprocessing = 0;
430 | shellPath = /bin/sh;
431 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-AttributedStringWrapperTests/Pods-AttributedStringWrapperTests-resources.sh\"\n";
432 | showEnvVarsInLog = 0;
433 | };
434 | F5EDFC5AD7A75A87AFB03479 /* [CP] Embed Pods Frameworks */ = {
435 | isa = PBXShellScriptBuildPhase;
436 | buildActionMask = 2147483647;
437 | files = (
438 | );
439 | inputPaths = (
440 | "${SRCROOT}/Pods/Target Support Files/Pods-Demo/Pods-Demo-frameworks.sh",
441 | "${BUILT_PRODUCTS_DIR}/AttributedStringWrapper/AttributedStringWrapper.framework",
442 | );
443 | name = "[CP] Embed Pods Frameworks";
444 | outputPaths = (
445 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AttributedStringWrapper.framework",
446 | );
447 | runOnlyForDeploymentPostprocessing = 0;
448 | shellPath = /bin/sh;
449 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Demo/Pods-Demo-frameworks.sh\"\n";
450 | showEnvVarsInLog = 0;
451 | };
452 | /* End PBXShellScriptBuildPhase section */
453 |
454 | /* Begin PBXSourcesBuildPhase section */
455 | 7313FF3D1EEFD98C003ED487 /* Sources */ = {
456 | isa = PBXSourcesBuildPhase;
457 | buildActionMask = 2147483647;
458 | files = (
459 | 7313FF691EEFDD0C003ED487 /* AttributedStringWrapper.swift in Sources */,
460 | );
461 | runOnlyForDeploymentPostprocessing = 0;
462 | };
463 | 7313FF471EEFD98C003ED487 /* Sources */ = {
464 | isa = PBXSourcesBuildPhase;
465 | buildActionMask = 2147483647;
466 | files = (
467 | 7313FF671EEFDC6C003ED487 /* AttributedStringWrapperTests.swift in Sources */,
468 | );
469 | runOnlyForDeploymentPostprocessing = 0;
470 | };
471 | 7313FF8E1EEFDEA0003ED487 /* Sources */ = {
472 | isa = PBXSourcesBuildPhase;
473 | buildActionMask = 2147483647;
474 | files = (
475 | 7313FF971EEFDEA0003ED487 /* ViewController.swift in Sources */,
476 | 7313FF951EEFDEA0003ED487 /* AppDelegate.swift in Sources */,
477 | );
478 | runOnlyForDeploymentPostprocessing = 0;
479 | };
480 | /* End PBXSourcesBuildPhase section */
481 |
482 | /* Begin PBXTargetDependency section */
483 | 7313FF4E1EEFD98C003ED487 /* PBXTargetDependency */ = {
484 | isa = PBXTargetDependency;
485 | target = 7313FF411EEFD98C003ED487 /* AttributedStringWrapper */;
486 | targetProxy = 7313FF4D1EEFD98C003ED487 /* PBXContainerItemProxy */;
487 | };
488 | /* End PBXTargetDependency section */
489 |
490 | /* Begin PBXVariantGroup section */
491 | 7313FF981EEFDEA0003ED487 /* Main.storyboard */ = {
492 | isa = PBXVariantGroup;
493 | children = (
494 | 7313FF991EEFDEA0003ED487 /* Base */,
495 | );
496 | name = Main.storyboard;
497 | sourceTree = "";
498 | };
499 | 7313FF9D1EEFDEA0003ED487 /* LaunchScreen.storyboard */ = {
500 | isa = PBXVariantGroup;
501 | children = (
502 | 7313FF9E1EEFDEA0003ED487 /* Base */,
503 | );
504 | name = LaunchScreen.storyboard;
505 | sourceTree = "";
506 | };
507 | /* End PBXVariantGroup section */
508 |
509 | /* Begin XCBuildConfiguration section */
510 | 7313FF541EEFD98C003ED487 /* Debug */ = {
511 | isa = XCBuildConfiguration;
512 | buildSettings = {
513 | ALWAYS_SEARCH_USER_PATHS = NO;
514 | CLANG_ANALYZER_NONNULL = YES;
515 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
516 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
517 | CLANG_CXX_LIBRARY = "libc++";
518 | CLANG_ENABLE_MODULES = YES;
519 | CLANG_ENABLE_OBJC_ARC = YES;
520 | CLANG_WARN_BOOL_CONVERSION = YES;
521 | CLANG_WARN_CONSTANT_CONVERSION = YES;
522 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
523 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
524 | CLANG_WARN_EMPTY_BODY = YES;
525 | CLANG_WARN_ENUM_CONVERSION = YES;
526 | CLANG_WARN_INFINITE_RECURSION = YES;
527 | CLANG_WARN_INT_CONVERSION = YES;
528 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
529 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
530 | CLANG_WARN_UNREACHABLE_CODE = YES;
531 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
532 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
533 | COPY_PHASE_STRIP = NO;
534 | CURRENT_PROJECT_VERSION = 1;
535 | DEBUG_INFORMATION_FORMAT = dwarf;
536 | ENABLE_STRICT_OBJC_MSGSEND = YES;
537 | ENABLE_TESTABILITY = YES;
538 | GCC_C_LANGUAGE_STANDARD = gnu99;
539 | GCC_DYNAMIC_NO_PIC = NO;
540 | GCC_NO_COMMON_BLOCKS = YES;
541 | GCC_OPTIMIZATION_LEVEL = 0;
542 | GCC_PREPROCESSOR_DEFINITIONS = (
543 | "DEBUG=1",
544 | "$(inherited)",
545 | );
546 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
547 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
548 | GCC_WARN_UNDECLARED_SELECTOR = YES;
549 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
550 | GCC_WARN_UNUSED_FUNCTION = YES;
551 | GCC_WARN_UNUSED_VARIABLE = YES;
552 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
553 | MTL_ENABLE_DEBUG_INFO = YES;
554 | ONLY_ACTIVE_ARCH = YES;
555 | SDKROOT = iphoneos;
556 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
557 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
558 | TARGETED_DEVICE_FAMILY = "1,2";
559 | VERSIONING_SYSTEM = "apple-generic";
560 | VERSION_INFO_PREFIX = "";
561 | };
562 | name = Debug;
563 | };
564 | 7313FF551EEFD98C003ED487 /* Release */ = {
565 | isa = XCBuildConfiguration;
566 | buildSettings = {
567 | ALWAYS_SEARCH_USER_PATHS = NO;
568 | CLANG_ANALYZER_NONNULL = YES;
569 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
570 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
571 | CLANG_CXX_LIBRARY = "libc++";
572 | CLANG_ENABLE_MODULES = YES;
573 | CLANG_ENABLE_OBJC_ARC = YES;
574 | CLANG_WARN_BOOL_CONVERSION = YES;
575 | CLANG_WARN_CONSTANT_CONVERSION = YES;
576 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
577 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
578 | CLANG_WARN_EMPTY_BODY = YES;
579 | CLANG_WARN_ENUM_CONVERSION = YES;
580 | CLANG_WARN_INFINITE_RECURSION = YES;
581 | CLANG_WARN_INT_CONVERSION = YES;
582 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
583 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
584 | CLANG_WARN_UNREACHABLE_CODE = YES;
585 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
586 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
587 | COPY_PHASE_STRIP = NO;
588 | CURRENT_PROJECT_VERSION = 1;
589 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
590 | ENABLE_NS_ASSERTIONS = NO;
591 | ENABLE_STRICT_OBJC_MSGSEND = YES;
592 | GCC_C_LANGUAGE_STANDARD = gnu99;
593 | GCC_NO_COMMON_BLOCKS = YES;
594 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
595 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
596 | GCC_WARN_UNDECLARED_SELECTOR = YES;
597 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
598 | GCC_WARN_UNUSED_FUNCTION = YES;
599 | GCC_WARN_UNUSED_VARIABLE = YES;
600 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
601 | MTL_ENABLE_DEBUG_INFO = NO;
602 | SDKROOT = iphoneos;
603 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
604 | TARGETED_DEVICE_FAMILY = "1,2";
605 | VALIDATE_PRODUCT = YES;
606 | VERSIONING_SYSTEM = "apple-generic";
607 | VERSION_INFO_PREFIX = "";
608 | };
609 | name = Release;
610 | };
611 | 7313FF571EEFD98C003ED487 /* Debug */ = {
612 | isa = XCBuildConfiguration;
613 | baseConfigurationReference = DBE5F6FFFD6706A1E68DB414 /* Pods-AttributedStringWrapper.debug.xcconfig */;
614 | buildSettings = {
615 | CLANG_ENABLE_MODULES = YES;
616 | CODE_SIGN_IDENTITY = "";
617 | DEFINES_MODULE = YES;
618 | DEVELOPMENT_TEAM = VS86A5N9W7;
619 | DYLIB_COMPATIBILITY_VERSION = 1;
620 | DYLIB_CURRENT_VERSION = 1;
621 | DYLIB_INSTALL_NAME_BASE = "@rpath";
622 | INFOPLIST_FILE = "$(SRCROOT)/Sources/Info.plist";
623 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
624 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
625 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
626 | PRODUCT_BUNDLE_IDENTIFIER = Loopeer.AttributedStringWrapper;
627 | PRODUCT_NAME = "$(TARGET_NAME)";
628 | SKIP_INSTALL = YES;
629 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
630 | SWIFT_SWIFT3_OBJC_INFERENCE = On;
631 | SWIFT_VERSION = 4.0;
632 | };
633 | name = Debug;
634 | };
635 | 7313FF581EEFD98C003ED487 /* Release */ = {
636 | isa = XCBuildConfiguration;
637 | baseConfigurationReference = C507B17161F96A8F1D6C8984 /* Pods-AttributedStringWrapper.release.xcconfig */;
638 | buildSettings = {
639 | CLANG_ENABLE_MODULES = YES;
640 | CODE_SIGN_IDENTITY = "";
641 | DEFINES_MODULE = YES;
642 | DEVELOPMENT_TEAM = VS86A5N9W7;
643 | DYLIB_COMPATIBILITY_VERSION = 1;
644 | DYLIB_CURRENT_VERSION = 1;
645 | DYLIB_INSTALL_NAME_BASE = "@rpath";
646 | INFOPLIST_FILE = "$(SRCROOT)/Sources/Info.plist";
647 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
648 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
649 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
650 | PRODUCT_BUNDLE_IDENTIFIER = Loopeer.AttributedStringWrapper;
651 | PRODUCT_NAME = "$(TARGET_NAME)";
652 | SKIP_INSTALL = YES;
653 | SWIFT_SWIFT3_OBJC_INFERENCE = On;
654 | SWIFT_VERSION = 4.0;
655 | };
656 | name = Release;
657 | };
658 | 7313FF5A1EEFD98C003ED487 /* Debug */ = {
659 | isa = XCBuildConfiguration;
660 | baseConfigurationReference = CC223B3CF82F2AD1768C9995 /* Pods-AttributedStringWrapperTests.debug.xcconfig */;
661 | buildSettings = {
662 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
663 | DEVELOPMENT_TEAM = VS86A5N9W7;
664 | INFOPLIST_FILE = Tests/Info.plist;
665 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
666 | PRODUCT_BUNDLE_IDENTIFIER = Loopeer.AttributedStringWrapperTests;
667 | PRODUCT_NAME = "$(TARGET_NAME)";
668 | SWIFT_SWIFT3_OBJC_INFERENCE = On;
669 | SWIFT_VERSION = 4.0;
670 | };
671 | name = Debug;
672 | };
673 | 7313FF5B1EEFD98C003ED487 /* Release */ = {
674 | isa = XCBuildConfiguration;
675 | baseConfigurationReference = BC2D63B42106C59772165A88 /* Pods-AttributedStringWrapperTests.release.xcconfig */;
676 | buildSettings = {
677 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
678 | DEVELOPMENT_TEAM = VS86A5N9W7;
679 | INFOPLIST_FILE = Tests/Info.plist;
680 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
681 | PRODUCT_BUNDLE_IDENTIFIER = Loopeer.AttributedStringWrapperTests;
682 | PRODUCT_NAME = "$(TARGET_NAME)";
683 | SWIFT_SWIFT3_OBJC_INFERENCE = On;
684 | SWIFT_VERSION = 4.0;
685 | };
686 | name = Release;
687 | };
688 | 7313FFA21EEFDEA0003ED487 /* Debug */ = {
689 | isa = XCBuildConfiguration;
690 | baseConfigurationReference = CD544AAB574221185188E785 /* Pods-Demo.debug.xcconfig */;
691 | buildSettings = {
692 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
693 | DEVELOPMENT_TEAM = VS86A5N9W7;
694 | INFOPLIST_FILE = Demo/Info.plist;
695 | IPHONEOS_DEPLOYMENT_TARGET = 10.3;
696 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
697 | PRODUCT_BUNDLE_IDENTIFIER = Loopeer.Demo;
698 | PRODUCT_NAME = "$(TARGET_NAME)";
699 | SWIFT_VERSION = 4.0;
700 | };
701 | name = Debug;
702 | };
703 | 7313FFA31EEFDEA0003ED487 /* Release */ = {
704 | isa = XCBuildConfiguration;
705 | baseConfigurationReference = 2BB622E9A447407F91D3E7CC /* Pods-Demo.release.xcconfig */;
706 | buildSettings = {
707 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
708 | DEVELOPMENT_TEAM = VS86A5N9W7;
709 | INFOPLIST_FILE = Demo/Info.plist;
710 | IPHONEOS_DEPLOYMENT_TARGET = 10.3;
711 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
712 | PRODUCT_BUNDLE_IDENTIFIER = Loopeer.Demo;
713 | PRODUCT_NAME = "$(TARGET_NAME)";
714 | SWIFT_VERSION = 4.0;
715 | };
716 | name = Release;
717 | };
718 | /* End XCBuildConfiguration section */
719 |
720 | /* Begin XCConfigurationList section */
721 | 7313FF3C1EEFD98C003ED487 /* Build configuration list for PBXProject "AttributedStringWrapper" */ = {
722 | isa = XCConfigurationList;
723 | buildConfigurations = (
724 | 7313FF541EEFD98C003ED487 /* Debug */,
725 | 7313FF551EEFD98C003ED487 /* Release */,
726 | );
727 | defaultConfigurationIsVisible = 0;
728 | defaultConfigurationName = Release;
729 | };
730 | 7313FF561EEFD98C003ED487 /* Build configuration list for PBXNativeTarget "AttributedStringWrapper" */ = {
731 | isa = XCConfigurationList;
732 | buildConfigurations = (
733 | 7313FF571EEFD98C003ED487 /* Debug */,
734 | 7313FF581EEFD98C003ED487 /* Release */,
735 | );
736 | defaultConfigurationIsVisible = 0;
737 | defaultConfigurationName = Release;
738 | };
739 | 7313FF591EEFD98C003ED487 /* Build configuration list for PBXNativeTarget "AttributedStringWrapperTests" */ = {
740 | isa = XCConfigurationList;
741 | buildConfigurations = (
742 | 7313FF5A1EEFD98C003ED487 /* Debug */,
743 | 7313FF5B1EEFD98C003ED487 /* Release */,
744 | );
745 | defaultConfigurationIsVisible = 0;
746 | defaultConfigurationName = Release;
747 | };
748 | 7313FFA11EEFDEA0003ED487 /* Build configuration list for PBXNativeTarget "Demo" */ = {
749 | isa = XCConfigurationList;
750 | buildConfigurations = (
751 | 7313FFA21EEFDEA0003ED487 /* Debug */,
752 | 7313FFA31EEFDEA0003ED487 /* Release */,
753 | );
754 | defaultConfigurationIsVisible = 0;
755 | defaultConfigurationName = Release;
756 | };
757 | /* End XCConfigurationList section */
758 | };
759 | rootObject = 7313FF391EEFD98C003ED487 /* Project object */;
760 | }
761 |
--------------------------------------------------------------------------------