├── MOOFoldTextView ├── Assets │ └── .gitkeep └── Classes │ ├── .gitkeep │ └── MOOFoldTextView.swift ├── _Pods.xcodeproj ├── Test1-OpenAndClose.gif ├── Test2-OpenAndClose-Cell.gif ├── Example ├── MOOFoldTextView.xcodeproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ ├── xcshareddata │ │ └── xcschemes │ │ │ └── MOOFoldTextView-Example.xcscheme │ └── project.pbxproj ├── Podfile ├── MOOFoldTextView.xcworkspace │ ├── xcshareddata │ │ └── IDEWorkspaceChecks.plist │ └── contents.xcworkspacedata ├── Podfile.lock ├── Tests │ ├── Info.plist │ └── Tests.swift └── MOOFoldTextView │ ├── Images.xcassets │ └── AppIcon.appiconset │ │ └── Contents.json │ ├── Info.plist │ ├── ViewController.swift │ ├── MOOTableViewCell.swift │ ├── AppDelegate.swift │ ├── MOOTest1ViewController.swift │ ├── MOOTest2ViewController.swift │ └── Base.lproj │ ├── Main.storyboard │ └── LaunchScreen.xib ├── LICENSE ├── MOOFoldTextView.podspec ├── .gitignore └── README.md /MOOFoldTextView/Assets/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /MOOFoldTextView/Classes/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /_Pods.xcodeproj: -------------------------------------------------------------------------------- 1 | Example/Pods/Pods.xcodeproj -------------------------------------------------------------------------------- /Test1-OpenAndClose.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxh-mo/MOOFoldTextView/HEAD/Test1-OpenAndClose.gif -------------------------------------------------------------------------------- /Test2-OpenAndClose-Cell.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxh-mo/MOOFoldTextView/HEAD/Test2-OpenAndClose-Cell.gif -------------------------------------------------------------------------------- /Example/MOOFoldTextView.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Example/Podfile: -------------------------------------------------------------------------------- 1 | use_frameworks! 2 | 3 | platform :ios, '10.0' 4 | 5 | target 'MOOFoldTextView_Example' do 6 | pod 'MOOFoldTextView', :path => '../' 7 | 8 | target 'MOOFoldTextView_Tests' do 9 | inherit! :search_paths 10 | 11 | 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /Example/MOOFoldTextView.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Example/MOOFoldTextView.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Example/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - MOOFoldTextView (0.1.0) 3 | 4 | DEPENDENCIES: 5 | - MOOFoldTextView (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | MOOFoldTextView: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | MOOFoldTextView: 49a0b6f50da065f06deeb97e662f44912c6ac57e 13 | 14 | PODFILE CHECKSUM: 3ade11469e0f860d9af66e0834aa6d2b7ea9589c 15 | 16 | COCOAPODS: 1.13.0 17 | -------------------------------------------------------------------------------- /Example/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 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /Example/Tests/Tests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | import MOOFoldTextView 3 | 4 | class Tests: XCTestCase { 5 | 6 | override func setUp() { 7 | super.setUp() 8 | // Put setup code here. This method is called before the invocation of each test method in the class. 9 | } 10 | 11 | override func tearDown() { 12 | // Put teardown code here. This method is called after the invocation of each test method in the class. 13 | super.tearDown() 14 | } 15 | 16 | func testExample() { 17 | // This is an example of a functional test case. 18 | XCTAssert(true, "Pass") 19 | } 20 | 21 | func testPerformanceExample() { 22 | // This is an example of a performance test case. 23 | self.measure() { 24 | // Put the code you want to measure the time of here. 25 | } 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /Example/MOOFoldTextView/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ios-marketing", 45 | "size" : "1024x1024", 46 | "scale" : "1x" 47 | } 48 | ], 49 | "info" : { 50 | "version" : 1, 51 | "author" : "xcode" 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2023 994355869@qq.com 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /Example/MOOFoldTextView/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 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /Example/MOOFoldTextView/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // MOOFoldTextView 4 | // 5 | // Created by mikimo on 11/19/2023. 6 | // Copyright (c) 2023 Mobi Technology All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class ViewController: UIViewController { 12 | 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | 16 | // 1. textView 内部交互控制 显示 or 收起 17 | let test1Btn = UIButton(type: .custom) 18 | test1Btn.setTitle("Test1", for: .normal) 19 | test1Btn.setTitleColor(.white, for: .normal) 20 | test1Btn.frame = CGRect(x: 20, y: 100, width: 60, height: 44) 21 | test1Btn.addTarget(self, action: #selector(clickTest1Btn), for: .touchUpInside) 22 | test1Btn.backgroundColor = .red 23 | view.addSubview(test1Btn) 24 | 25 | // 2. 先计算出高度 外包设置 显示 or 收起 (方便UITableViewCell里使用) 26 | let test2Btn = UIButton(type: .custom) 27 | test2Btn.setTitle("Test2", for: .normal) 28 | test2Btn.setTitleColor(.white, for: .normal) 29 | test2Btn.frame = CGRect(x: 100, y: 100, width: 60, height: 44) 30 | test2Btn.addTarget(self, action: #selector(clickTest2Btn), for: .touchUpInside) 31 | test2Btn.backgroundColor = .red 32 | view.addSubview(test2Btn) 33 | } 34 | 35 | @objc func clickTest1Btn() { 36 | self.navigationController?.pushViewController(MOOTest1ViewController(), animated: true) 37 | } 38 | 39 | @objc func clickTest2Btn() { 40 | self.navigationController?.pushViewController(MOOTest2ViewController(), animated: true) 41 | } 42 | } 43 | 44 | -------------------------------------------------------------------------------- /MOOFoldTextView.podspec: -------------------------------------------------------------------------------- 1 | # 2 | # Be sure to run `pod lib lint MOOFoldTextView.podspec' to ensure this is a 3 | # valid spec before submitting. 4 | # 5 | # Any lines starting with a # are optional, but their use is encouraged 6 | # To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html 7 | # 8 | 9 | Pod::Spec.new do |s| 10 | s.name = 'MOOFoldTextView' 11 | s.version = '0.1.1' 12 | s.summary = 'A short description of MOOFoldTextView.' 13 | 14 | # This description is used to generate tags and improve search results. 15 | # * Think: What does it do? Why did you write it? What is the focus? 16 | # * Try to keep it short, snappy and to the point. 17 | # * Write the description between the DESC delimiters below. 18 | # * Finally, don't worry about the indent, CocoaPods strips it! 19 | 20 | s.description = <<-DESC 21 | TODO: Add long description of the pod here. 22 | DESC 23 | 24 | s.homepage = 'https://github.com/994355869@qq.com/MOOFoldTextView' 25 | # s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2' 26 | s.license = { :type => 'MIT', :file => 'LICENSE' } 27 | s.author = { '994355869@qq.com' => 'mikimo@tencent.com' } 28 | s.source = { :git => 'https://github.com/mxh-mo/MOOFoldTextView.git', :tag => s.version.to_s } 29 | # s.social_media_url = 'https://twitter.com/' 30 | 31 | s.ios.deployment_target = '10.0' 32 | 33 | s.source_files = 'MOOFoldTextView/Classes/**/*' 34 | 35 | # s.resource_bundles = { 36 | # 'MOOFoldTextView' => ['MOOFoldTextView/Assets/*.png'] 37 | # } 38 | 39 | # s.public_header_files = 'Pod/Classes/**/*.h' 40 | # s.frameworks = 'UIKit', 'MapKit' 41 | # s.dependency 'AFNetworking', '~> 2.3' 42 | end 43 | -------------------------------------------------------------------------------- /Example/MOOFoldTextView/MOOTableViewCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MOOTableViewCell.swift 3 | // MOOFoldTextView_Example 4 | // 5 | // Created by mikimo on 2023/11/19. 6 | // Copyright © 2023 CocoaPods. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import MOOFoldTextView 11 | 12 | // 3.1 13 | public protocol MOOTableViewCellDelegate: AnyObject { 14 | func mooCellShouldReloadData(_ cell: UITableViewCell) 15 | } 16 | 17 | class MOOTableViewCell: UITableViewCell { 18 | 19 | // 2 20 | var mooConfig: MOOFoldTextConfig = MOOFoldTextConfig() { 21 | didSet { 22 | self.attributeTextView.mooConfig = self.mooConfig 23 | self.attributeTextView.mooReloadText() 24 | } 25 | } 26 | // 3.2 27 | weak var mooDelegate: MOOTableViewCellDelegate? 28 | 29 | override init(style: UITableViewCellStyle, reuseIdentifier: String?) { 30 | super.init(style: style, reuseIdentifier: reuseIdentifier) 31 | // 1.2 add to super view 32 | self.contentView.addSubview(self.attributeTextView) 33 | } 34 | 35 | override func layoutSubviews() { 36 | super.layoutSubviews() 37 | // 1.3 set frame 38 | self.attributeTextView.frame = self.contentView.bounds 39 | } 40 | 41 | // 1.1 init 42 | private lazy var attributeTextView: MOOFoldTextView = { 43 | let view = MOOFoldTextView(frame: .zero) 44 | view.backgroundColor = .cyan 45 | view.mooDelegate = self 46 | return view 47 | }() 48 | 49 | required init?(coder: NSCoder) { 50 | fatalError("init(coder:) has not been implemented") 51 | } 52 | } 53 | 54 | // 3.3 55 | extension MOOTableViewCell: MOOFoldTextViewDelegate { 56 | func mooFoldViewShouldUpdateLayout(_ foldTextView: MOOFoldTextView) { 57 | self.mooDelegate?.mooCellShouldReloadData(self) 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /Example/MOOFoldTextView/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // MOOFoldTextView 4 | // 5 | // Created by mikimo on 11/19/2023. 6 | // Copyright (c) 2023 Mobi Technology 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 throttle down OpenGL ES frame rates. 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 inactive 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 | -------------------------------------------------------------------------------- /Example/MOOFoldTextView/MOOTest1ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MOOTest1ViewController.swift 3 | // MOOFoldTextView_Example 4 | // 5 | // Created by mikimo on 2023/11/19. 6 | // Copyright © 2023 Mobi Technology All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import MOOFoldTextView 11 | 12 | class MOOTest1ViewController: UIViewController { 13 | 14 | override func viewDidLoad() { 15 | super.viewDidLoad() 16 | self.title = "Test1" 17 | // 2.1 18 | self.view.addSubview(self.mooFoldTextView) 19 | // 2.2 set config and reload 20 | self.mooFoldTextView.mooConfig = self.mooFoldTextConfig 21 | self.mooFoldTextView.mooReloadText() 22 | } 23 | 24 | override func viewWillLayoutSubviews() { 25 | super.viewWillLayoutSubviews() 26 | // 3 27 | self.mooFoldTextView.frame = CGRect(x: 0.0, 28 | y: 100.0, 29 | width: CGRectGetWidth(self.view.bounds), 30 | height: self.mooFoldTextConfig.currentHeight()) 31 | } 32 | 33 | // 1.1 init view 34 | private lazy var mooFoldTextView: MOOFoldTextView = { 35 | let view = MOOFoldTextView(frame: .zero) 36 | view.backgroundColor = .cyan 37 | view.mooDelegate = self 38 | return view 39 | }() 40 | 41 | // 1.2 init conifg 42 | private lazy var mooFoldTextConfig: MOOFoldTextConfig = { 43 | let config = MOOFoldTextConfig() 44 | config.allText = 45 | """ 46 | Swift is a type-safe language, which means the language helps you to be clear about\ 47 | the types of values your code can work with. If part of your code requires a String,\ 48 | type safety prevents you from passing it an Int by mistake. Likewise, type safety\ 49 | prevents you from accidentally passing an optional String 50 | """ 51 | config.paragraph.lineSpacing = 10.0 52 | config.contentWidth = CGRectGetWidth(self.view.bounds) 53 | return config 54 | }() 55 | } 56 | 57 | // 4 Implement Proxy 58 | extension MOOTest1ViewController: MOOFoldTextViewDelegate { 59 | 60 | func mooFoldViewShouldUpdateLayout(_ foldTextView: MOOFoldTextView) { 61 | // update layout after fold state changed 62 | self.view.setNeedsLayout() 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.toptal.com/developers/gitignore/api/swift 3 | # Edit at https://www.toptal.com/developers/gitignore?templates=swift 4 | 5 | ### Swift ### 6 | # Xcode 7 | # 8 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 9 | 10 | ## User settings 11 | xcuserdata/ 12 | 13 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) 14 | *.xcscmblueprint 15 | *.xccheckout 16 | 17 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) 18 | build/ 19 | DerivedData/ 20 | *.moved-aside 21 | *.pbxuser 22 | !default.pbxuser 23 | *.mode1v3 24 | !default.mode1v3 25 | *.mode2v3 26 | !default.mode2v3 27 | *.perspectivev3 28 | !default.perspectivev3 29 | 30 | ## Obj-C/Swift specific 31 | *.hmap 32 | 33 | ## App packaging 34 | *.ipa 35 | *.dSYM.zip 36 | *.dSYM 37 | 38 | ## Playgrounds 39 | timeline.xctimeline 40 | playground.xcworkspace 41 | 42 | # Swift Package Manager 43 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 44 | # Packages/ 45 | # Package.pins 46 | # Package.resolved 47 | # *.xcodeproj 48 | # Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata 49 | # hence it is not needed unless you have added a package configuration file to your project 50 | # .swiftpm 51 | 52 | .build/ 53 | 54 | # CocoaPods 55 | # We recommend against adding the Pods directory to your .gitignore. However 56 | # you should judge for yourself, the pros and cons are mentioned at: 57 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 58 | Pods/ 59 | # Add this line if you want to avoid checking in source code from the Xcode workspace 60 | # *.xcworkspace 61 | 62 | # Carthage 63 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 64 | # Carthage/Checkouts 65 | 66 | Carthage/Build/ 67 | 68 | # Accio dependency management 69 | Dependencies/ 70 | .accio/ 71 | 72 | # fastlane 73 | # It is recommended to not store the screenshots in the git repo. 74 | # Instead, use fastlane to re-generate the screenshots whenever they are needed. 75 | # For more information about the recommended setup visit: 76 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 77 | 78 | fastlane/report.xml 79 | fastlane/Preview.html 80 | fastlane/screenshots/**/*.png 81 | fastlane/test_output 82 | 83 | # Code Injection 84 | # After new code Injection tools there's a generated folder /iOSInjectionProject 85 | # https://github.com/johnno1962/injectionforxcode 86 | 87 | iOSInjectionProject/ 88 | 89 | # End of https://www.toptal.com/developers/gitignore/api/swift 90 | 91 | -------------------------------------------------------------------------------- /Example/MOOFoldTextView/MOOTest2ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MOOTest2ViewController.swift 3 | // MOOFoldTextView_Example 4 | // 5 | // Created by mikimo on 2023/11/19. 6 | // Copyright © 2023 Mobi Technology All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import MOOFoldTextView 11 | 12 | class MOOTest2ViewController: UIViewController { 13 | 14 | override func viewDidLoad() { 15 | super.viewDidLoad() 16 | self.title = "Test2 - TableView" 17 | // 4.3 add to super view 18 | self.view.addSubview(self.tableView) 19 | self.tableView.reloadData() 20 | } 21 | 22 | override func viewWillLayoutSubviews() { 23 | super.viewWillLayoutSubviews() 24 | // 4.4 set frame 25 | self.tableView.frame = CGRect(x: 0.0, 26 | y: 100.0, 27 | width: CGRectGetWidth(self.view.bounds), 28 | height: CGRectGetHeight(self.view.bounds) - 100.0); 29 | } 30 | // 4.1 init table view 31 | private lazy var tableView: UITableView = { 32 | let view = UITableView(frame: .zero, style: .grouped) 33 | view.register(MOOTableViewCell.self, forCellReuseIdentifier: "MOOTableViewCell") 34 | view.dataSource = self 35 | view.delegate = self 36 | return view 37 | }() 38 | // 4.2 init dataSource with config 39 | private lazy var dataSource: [MOOFoldTextConfig] = { 40 | let config = MOOFoldTextConfig() 41 | config.allText = 42 | """ 43 | Swift is a type-safe language, which means the language helps you to be clear about\ 44 | the types of values your code can work with. If part of your code requires a String,\ 45 | type safety prevents you from passing it an Int by mistake. Likewise, type safety\ 46 | prevents you from accidentally passing an optional String 47 | """ 48 | config.paragraph.lineSpacing = 10.0 49 | config.contentWidth = CGRectGetWidth(self.view.bounds) 50 | return [config] 51 | }() 52 | } 53 | 54 | // 6 reload data after fold state changed 55 | extension MOOTest2ViewController: MOOTableViewCellDelegate { 56 | func mooCellShouldReloadData(_ cell: UITableViewCell) { 57 | self.tableView.reloadData() 58 | } 59 | } 60 | 61 | // 5.1 62 | extension MOOTest2ViewController: UITableViewDataSource { 63 | 64 | func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 65 | return self.dataSource.count 66 | } 67 | 68 | func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 69 | let cell = tableView.dequeueReusableCell(withIdentifier: "MOOTableViewCell", 70 | for: indexPath) 71 | if let cell = cell as? MOOTableViewCell { 72 | cell.mooConfig = self.dataSource[indexPath.row] 73 | cell.mooDelegate = self 74 | } 75 | return cell 76 | } 77 | } 78 | 79 | // 5.2 80 | extension MOOTest2ViewController: UITableViewDelegate { 81 | 82 | func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 83 | let config = self.dataSource[indexPath.row] 84 | return config.currentHeight() 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /Example/MOOFoldTextView/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /Example/MOOFoldTextView/Base.lproj/LaunchScreen.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 25 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /Example/MOOFoldTextView.xcodeproj/xcshareddata/xcschemes/MOOFoldTextView-Example.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 45 | 46 | 48 | 54 | 55 | 56 | 57 | 58 | 64 | 65 | 66 | 67 | 68 | 69 | 80 | 82 | 88 | 89 | 90 | 91 | 92 | 93 | 99 | 101 | 107 | 108 | 109 | 110 | 112 | 113 | 116 | 117 | 118 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MOOFoldTextView 2 | 3 | [![CI Status](https://img.shields.io/travis/994355869@qq.com/MOOFoldTextView.svg?style=flat)](https://travis-ci.org/994355869@qq.com/MOOFoldTextView) 4 | [![Version](https://img.shields.io/cocoapods/v/MOOFoldTextView.svg?style=flat)](https://cocoapods.org/pods/MOOFoldTextView) 5 | [![License](https://img.shields.io/cocoapods/l/MOOFoldTextView.svg?style=flat)](https://cocoapods.org/pods/MOOFoldTextView) 6 | [![Platform](https://img.shields.io/cocoapods/p/MOOFoldTextView.svg?style=flat)](https://cocoapods.org/pods/MOOFoldTextView) 7 | 8 | ## 1. Effect display 9 | 10 | Test1:Direct Use: 11 | 12 | 13 | 14 | ---- 15 | 16 | Test2:Use in cell: 17 | 18 | 19 | 20 | ## 2. Example 21 | 22 | To run the example project, clone the repo, and run `pod install` from the Example directory first. 23 | 24 | ## 3. Installation 25 | 26 | MOOFoldTextView is available through [CocoaPods](https://cocoapods.org). To install 27 | it, simply add the following line to your Podfile: 28 | 29 | ```ruby 30 | pod 'MOOFoldTextView' 31 | ``` 32 | then import 33 | ```swift 34 | import MOOFoldTextView 35 | ``` 36 | 37 | ## 4. Usage 38 | 39 | ### 4.1 Direct Use 40 | 41 | ```swift 42 | // 1.1 init view 43 | private lazy var mooFoldTextView: MOOFoldTextView = { 44 | let view = MOOFoldTextView(frame: .zero) 45 | view.backgroundColor = .cyan 46 | view.mooDelegate = self 47 | return view 48 | }() 49 | // 1.2 init conifg 50 | private lazy var mooFoldTextConfig: MOOFoldTextConfig = { 51 | let config = MOOFoldTextConfig() 52 | config.allText = 53 | """ 54 | Swift is a type-safe language, which means the language helps you to be clear about\ 55 | the types of values your code can work with. If part of your code requires a String,\ 56 | type safety prevents you from passing it an Int by mistake. Likewise, type safety\ 57 | prevents you from accidentally passing an optional String 58 | """ 59 | config.paragraph.lineSpacing = 10.0 60 | config.contentWidth = CGRectGetWidth(self.view.bounds) 61 | return config 62 | }() 63 | 64 | 65 | // 2.1 add to super view 66 | self.view.addSubview(self.mooFoldTextView) 67 | // 2.2 set config and reload 68 | self.mooFoldTextView.mooConfig = self.mooFoldTextConfig 69 | self.mooFoldTextView.mooReloadText() 70 | 71 | // 3 set frame 72 | self.mooFoldTextView.frame = CGRect(x: 0.0, 73 | y: 100.0, 74 | width: CGRectGetWidth(self.view.bounds), 75 | height: self.mooFoldTextConfig.currentHeight()) 76 | 77 | // 4 Implement Proxy 78 | extension MOOTest1ViewController: MOOFoldTextViewDelegate { 79 | func mooFoldViewShouldUpdateLayout(_ foldTextView: MOOFoldTextView) { 80 | // update layout after fold state changed 81 | self.view.setNeedsLayout() 82 | } 83 | } 84 | ``` 85 | 86 | ---- 87 | 88 | ### 4.2 Use in cell 89 | 90 | #### 4.2.1 at Custom TableViewCell 91 | 92 | ```swift 93 | // 1.1 init 94 | private lazy var attributeTextView: MOOFoldTextView = { 95 | let view = MOOFoldTextView(frame: .zero) 96 | view.backgroundColor = .cyan 97 | view.mooDelegate = self 98 | return view 99 | }() 100 | // 1.2 add to super view 101 | self.contentView.addSubview(self.attributeTextView) 102 | // 1.3 set frame 103 | self.attributeTextView.frame = self.contentView.bounds 104 | 105 | 106 | // 2 receive config and set to textView 107 | var mooConfig: MOOFoldTextConfig = MOOFoldTextConfig() { 108 | didSet { 109 | self.attributeTextView.mooConfig = self.mooConfig 110 | self.attributeTextView.mooReloadText() 111 | } 112 | } 113 | 114 | // 3.1 define protocol to forward event 115 | public protocol MOOTableViewCellDelegate: AnyObject { 116 | func mooCellShouldReloadData(_ cell: UITableViewCell) 117 | } 118 | // 3.2 119 | weak var mooDelegate: MOOTableViewCellDelegate? 120 | // 3.3 121 | extension MOOTableViewCell: MOOFoldTextViewDelegate { 122 | func mooFoldViewShouldUpdateLayout(_ foldTextView: MOOFoldTextView) { 123 | self.mooDelegate?.mooCellShouldReloadData(self) 124 | } 125 | } 126 | ``` 127 | 128 | #### 4.2.2 at View Controller 129 | 130 | ```swift 131 | import MOOFoldTextView 132 | 133 | // 4.1 init tableView 134 | private lazy var tableView: UITableView = { 135 | let view = UITableView(frame: .zero, style: .grouped) 136 | view.register(MOOTableViewCell.self, forCellReuseIdentifier: "MOOTableViewCell") 137 | view.dataSource = self 138 | view.delegate = self 139 | return view 140 | }() 141 | // 4.2 init dataSource with config 142 | private lazy var dataSource: [MOOFoldTextConfig] = { 143 | let config = MOOFoldTextConfig() 144 | config.allText = 145 | """ 146 | Swift is a type-safe language, which means the language helps you to be clear about\ 147 | the types of values your code can work with. If part of your code requires a String,\ 148 | type safety prevents you from passing it an Int by mistake. Likewise, type safety\ 149 | prevents you from accidentally passing an optional String 150 | """ 151 | config.paragraph.lineSpacing = 10.0 152 | config.contentWidth = CGRectGetWidth(self.view.bounds) 153 | return [config] 154 | }() 155 | // 4.3 add to super view 156 | self.view.addSubview(self.tableView) 157 | self.tableView.reloadData() 158 | // 4.4 set frame 159 | self.tableView.frame = CGRect(x: 0.0, 160 | y: 100.0, 161 | width: CGRectGetWidth(self.view.bounds), 162 | height: CGRectGetHeight(self.view.bounds) - 100.0); 163 | 164 | // 5.1 Implementation UITableViewDataSource 165 | func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 166 | return self.dataSource.count 167 | } 168 | func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 169 | let cell = tableView.dequeueReusableCell(withIdentifier: "MOOTableViewCell", 170 | for: indexPath) 171 | if let cell = cell as? MOOTableViewCell { 172 | cell.mooConfig = self.dataSource[indexPath.row] 173 | cell.mooDelegate = self 174 | } 175 | return cell 176 | } 177 | // 5.2 Implementation UITableViewDelegate 178 | func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 179 | let config = self.dataSource[indexPath.row] 180 | return config.currentHeight() 181 | } 182 | 183 | // 6 reload data after fold state changed 184 | extension MOOTest2ViewController: MOOTableViewCellDelegate { 185 | func mooCellShouldReloadData(_ cell: UITableViewCell) { 186 | self.tableView.reloadData() 187 | } 188 | } 189 | 190 | ``` 191 | 192 | ## 5. Author 193 | 194 | [moxiaoyan](https://github.com/mxh-mo) 195 | 196 | ## 6. License 197 | 198 | MOOFoldTextView is available under the MIT license. See the LICENSE file for more info. 199 | -------------------------------------------------------------------------------- /MOOFoldTextView/Classes/MOOFoldTextView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MOOFoldTextView.swift 3 | // MOOFoldTextView 4 | // 5 | // Created by mikimo on 2023/11/19. 6 | // Copyright (c) 2023 Mobi Technology All rights reserved. 7 | // 8 | // All properties and methods should be prefixed with the library name to prevent future conflicts with the system 9 | // Prefix with `moo / MOO` are public 10 | // Prefix with `moo_` are private 11 | 12 | import UIKit 13 | 14 | // MARK: - MOOFoldTextConfig 15 | public class MOOFoldTextConfig { 16 | 17 | /// config base properties 18 | public var allText: String = "" 19 | public var contentWidth: CGFloat = 0.0 20 | public var foldLineCount: UInt = 3 21 | 22 | /// config text view style 23 | public var attributs: [NSAttributedString.Key: Any] = [.font: UIFont.systemFont(ofSize: 16.0)] 24 | public var paragraph: NSMutableParagraphStyle = NSMutableParagraphStyle() 25 | 26 | /// config text of unfold and fold text 27 | public var unfoldLinkText: String = "More" 28 | public var foldLinkText: String = "Close" 29 | 30 | /// will be set value after called calcParams() 31 | public private(set) var unfoldLineCount: UInt = 0 32 | public private(set) var unfoldHeight: CGFloat = 0.0 33 | public private(set) var foldHeight: CGFloat = 0.0 34 | 35 | /// will be set value from MOOFoldTextView, you shouldn't change value for this propery 36 | public var isUnFold: Bool = false 37 | 38 | public init() { 39 | } 40 | 41 | /// shoudl call after config properties changed 42 | public func calcHeight(_ textView: UITextView) { 43 | // set total text 44 | textView.attributedText = self.unfoldAttributeString() 45 | 46 | // get total height according width 47 | self.unfoldHeight = textView.sizeThatFits(CGSize(width: self.contentWidth, 48 | height: CGFloat.greatestFiniteMagnitude)).height 49 | 50 | // get line number according height and lineHeight 51 | self.unfoldLineCount = UInt(floor(self.unfoldHeight / self.mooLineHeight())) 52 | 53 | // get close height 54 | if self.unfoldLineCount > self.foldLineCount { 55 | self.foldHeight = CGFloat(self.foldLineCount) * self.mooLineHeight() 56 | } else { 57 | self.foldHeight = self.unfoldHeight 58 | } 59 | } 60 | 61 | public func currentHeight() -> CGFloat { 62 | if self.isUnFold { 63 | return self.unfoldHeight 64 | } else { 65 | return self.foldHeight 66 | } 67 | } 68 | 69 | public func foldAttributeString() -> NSMutableAttributedString { 70 | // get the previese lessline string 71 | let preLessLineText = moo_preLessLineString() 72 | 73 | // cut the same text as unfoldLinkText, then + unfoldLinkText 74 | let startIndex = preLessLineText.index(preLessLineText.endIndex, 75 | offsetBy: -(unfoldLinkText.count + 2)) 76 | let endIndex = preLessLineText.endIndex 77 | let range = startIndex ..< endIndex 78 | let needShowText = preLessLineText.replacingCharacters(in: range, with: " " + unfoldLinkText) 79 | 80 | // set attributs and pargrapgStyle for attributedString 81 | let attributedString = NSMutableAttributedString(string: needShowText, 82 | attributes: attributs) 83 | attributedString.addAttribute(.paragraphStyle, 84 | value: paragraph, 85 | range: NSRange(location: 0, length: needShowText.count)) 86 | 87 | // add tap action for link range 88 | let linkRange = NSRange(location: needShowText.count - unfoldLinkText.count, 89 | length: unfoldLinkText.count) 90 | attributedString.addAttribute(.link, 91 | value: MOOUnfoldLinkScheme, 92 | range: linkRange) 93 | return attributedString 94 | } 95 | 96 | public func unfoldAttributeString() -> NSMutableAttributedString { 97 | let result = allText + " " + foldLinkText 98 | 99 | // set attributs and pargrapgStyle for attributedString 100 | let attributedString = NSMutableAttributedString(string: result, 101 | attributes: attributs) 102 | attributedString.addAttribute(.paragraphStyle, 103 | value: paragraph, 104 | range: NSRange(location: 0, length: allText.count)) 105 | 106 | // add tap action for link range 107 | let linkRange = NSRange(location: result.count - foldLinkText.count, 108 | length: foldLinkText.count) 109 | attributedString.addAttribute(.link, 110 | value: MOOFoldLinkScheme, 111 | range: linkRange) 112 | return attributedString 113 | } 114 | 115 | // MARK: - Private Methods 116 | 117 | private func mooLineHeight() -> CGFloat { 118 | let font = attributs[.font] as? UIFont ?? .systemFont(ofSize: 16.0) 119 | return paragraph.lineSpacing + font.lineHeight 120 | } 121 | 122 | /// get the first less lines of string 123 | private func moo_preLessLineString() -> String { 124 | let attributedString = NSMutableAttributedString(string: allText, attributes: attributs) 125 | let ctFrameSetter = CTFramesetterCreateWithAttributedString(attributedString) 126 | 127 | // here add 8 spacing to width for calculate 128 | let containerFrame = CGRect(x: 0.0, 129 | y: 0.0, 130 | width: contentWidth - 8.0, 131 | height: CGFloat.greatestFiniteMagnitude) 132 | let path = CGPath(rect: containerFrame, transform: nil) 133 | let ctFrame = CTFramesetterCreateFrame(ctFrameSetter, CFRange(location: 0, length: 0), path, nil) 134 | let lines: NSArray = CTFrameGetLines(ctFrame) 135 | 136 | // length of the first less lines 137 | var preLessLineLength = 0.0 138 | for i in 0.. Bool { 198 | return self.mooConfig.unfoldLineCount > self.mooConfig.foldLineCount && !self.mooConfig.isUnFold 199 | } 200 | 201 | required init?(coder: NSCoder) { 202 | fatalError("init(coder:) has not been implemented") 203 | } 204 | } 205 | 206 | extension MOOFoldTextView: UITextViewDelegate { 207 | 208 | /// handle click link action 209 | public func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool { 210 | if URL.absoluteString == self.mooConfig.MOOUnfoldLinkScheme { 211 | /// click open button 212 | self.mooUpdateToOpenState() 213 | self.mooDelegate?.mooFoldViewShouldUpdateLayout(self) 214 | return false 215 | } 216 | if URL.absoluteString == self.mooConfig.MOOFoldLinkScheme { 217 | /// click close button 218 | self.mooUpdateToCloseState() 219 | self.mooDelegate?.mooFoldViewShouldUpdateLayout(self) 220 | return false 221 | } 222 | return true 223 | } 224 | } 225 | -------------------------------------------------------------------------------- /Example/MOOFoldTextView.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 25018E0F478BDC80A09A1C77 /* Pods_MOOFoldTextView_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C90134A08504545641A9571 /* Pods_MOOFoldTextView_Tests.framework */; }; 11 | 2874E238DA85ABC47756A33F /* Pods_MOOFoldTextView_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F247C872C24E4CC4BE2A237F /* Pods_MOOFoldTextView_Example.framework */; }; 12 | 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD51AFB9204008FA782 /* AppDelegate.swift */; }; 13 | 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD71AFB9204008FA782 /* ViewController.swift */; }; 14 | 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 607FACD91AFB9204008FA782 /* Main.storyboard */; }; 15 | 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDC1AFB9204008FA782 /* Images.xcassets */; }; 16 | 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */; }; 17 | 607FACEC1AFB9204008FA782 /* Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACEB1AFB9204008FA782 /* Tests.swift */; }; 18 | FD755F4F2B09EE5A00EA7119 /* MOOTest1ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD755F4E2B09EE5A00EA7119 /* MOOTest1ViewController.swift */; }; 19 | FD755F512B09EE8D00EA7119 /* MOOTest2ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD755F502B09EE8D00EA7119 /* MOOTest2ViewController.swift */; }; 20 | FD755F532B09EEF600EA7119 /* MOOTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD755F522B09EEF600EA7119 /* MOOTableViewCell.swift */; }; 21 | /* End PBXBuildFile section */ 22 | 23 | /* Begin PBXContainerItemProxy section */ 24 | 607FACE61AFB9204008FA782 /* PBXContainerItemProxy */ = { 25 | isa = PBXContainerItemProxy; 26 | containerPortal = 607FACC81AFB9204008FA782 /* Project object */; 27 | proxyType = 1; 28 | remoteGlobalIDString = 607FACCF1AFB9204008FA782; 29 | remoteInfo = MOOFoldTextView; 30 | }; 31 | /* End PBXContainerItemProxy section */ 32 | 33 | /* Begin PBXFileReference section */ 34 | 607FACD01AFB9204008FA782 /* MOOFoldTextView_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MOOFoldTextView_Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 35 | 607FACD41AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 36 | 607FACD51AFB9204008FA782 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 37 | 607FACD71AFB9204008FA782 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 38 | 607FACDA1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 39 | 607FACDC1AFB9204008FA782 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 40 | 607FACDF1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 41 | 607FACE51AFB9204008FA782 /* MOOFoldTextView_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MOOFoldTextView_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 42 | 607FACEA1AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 43 | 607FACEB1AFB9204008FA782 /* Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests.swift; sourceTree = ""; }; 44 | 7A012B9567565C9489E44E1D /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; 45 | 8C90134A08504545641A9571 /* Pods_MOOFoldTextView_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MOOFoldTextView_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 46 | 94CA18135D910F89C4F3DF2C /* MOOFoldTextView.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = MOOFoldTextView.podspec; path = ../MOOFoldTextView.podspec; sourceTree = ""; }; 47 | 94CAD5B518F1475B5BD77276 /* Pods-MOOFoldTextView_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MOOFoldTextView_Tests.debug.xcconfig"; path = "Target Support Files/Pods-MOOFoldTextView_Tests/Pods-MOOFoldTextView_Tests.debug.xcconfig"; sourceTree = ""; }; 48 | AC44134C22CE2269D6020AF8 /* Pods-MOOFoldTextView_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MOOFoldTextView_Example.release.xcconfig"; path = "Target Support Files/Pods-MOOFoldTextView_Example/Pods-MOOFoldTextView_Example.release.xcconfig"; sourceTree = ""; }; 49 | CCEEE17817131F3FF53DE717 /* Pods-MOOFoldTextView_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MOOFoldTextView_Example.debug.xcconfig"; path = "Target Support Files/Pods-MOOFoldTextView_Example/Pods-MOOFoldTextView_Example.debug.xcconfig"; sourceTree = ""; }; 50 | D901CB0FA7566673FAC50CCB /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; 51 | EECA3BD4D0C60329F7B1CF9F /* Pods-MOOFoldTextView_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MOOFoldTextView_Tests.release.xcconfig"; path = "Target Support Files/Pods-MOOFoldTextView_Tests/Pods-MOOFoldTextView_Tests.release.xcconfig"; sourceTree = ""; }; 52 | F247C872C24E4CC4BE2A237F /* Pods_MOOFoldTextView_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MOOFoldTextView_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 53 | FD755F4E2B09EE5A00EA7119 /* MOOTest1ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MOOTest1ViewController.swift; sourceTree = ""; }; 54 | FD755F502B09EE8D00EA7119 /* MOOTest2ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MOOTest2ViewController.swift; sourceTree = ""; }; 55 | FD755F522B09EEF600EA7119 /* MOOTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MOOTableViewCell.swift; sourceTree = ""; }; 56 | /* End PBXFileReference section */ 57 | 58 | /* Begin PBXFrameworksBuildPhase section */ 59 | 607FACCD1AFB9204008FA782 /* Frameworks */ = { 60 | isa = PBXFrameworksBuildPhase; 61 | buildActionMask = 2147483647; 62 | files = ( 63 | 2874E238DA85ABC47756A33F /* Pods_MOOFoldTextView_Example.framework in Frameworks */, 64 | ); 65 | runOnlyForDeploymentPostprocessing = 0; 66 | }; 67 | 607FACE21AFB9204008FA782 /* Frameworks */ = { 68 | isa = PBXFrameworksBuildPhase; 69 | buildActionMask = 2147483647; 70 | files = ( 71 | 25018E0F478BDC80A09A1C77 /* Pods_MOOFoldTextView_Tests.framework in Frameworks */, 72 | ); 73 | runOnlyForDeploymentPostprocessing = 0; 74 | }; 75 | /* End PBXFrameworksBuildPhase section */ 76 | 77 | /* Begin PBXGroup section */ 78 | 607FACC71AFB9204008FA782 = { 79 | isa = PBXGroup; 80 | children = ( 81 | 607FACF51AFB993E008FA782 /* Podspec Metadata */, 82 | 607FACD21AFB9204008FA782 /* Example for MOOFoldTextView */, 83 | 607FACE81AFB9204008FA782 /* Tests */, 84 | 607FACD11AFB9204008FA782 /* Products */, 85 | BBDA96B37B53434977F91AAF /* Pods */, 86 | C457383BD3BC7A5BBB6D82A0 /* Frameworks */, 87 | ); 88 | sourceTree = ""; 89 | }; 90 | 607FACD11AFB9204008FA782 /* Products */ = { 91 | isa = PBXGroup; 92 | children = ( 93 | 607FACD01AFB9204008FA782 /* MOOFoldTextView_Example.app */, 94 | 607FACE51AFB9204008FA782 /* MOOFoldTextView_Tests.xctest */, 95 | ); 96 | name = Products; 97 | sourceTree = ""; 98 | }; 99 | 607FACD21AFB9204008FA782 /* Example for MOOFoldTextView */ = { 100 | isa = PBXGroup; 101 | children = ( 102 | 607FACD51AFB9204008FA782 /* AppDelegate.swift */, 103 | 607FACD71AFB9204008FA782 /* ViewController.swift */, 104 | FD755F4E2B09EE5A00EA7119 /* MOOTest1ViewController.swift */, 105 | FD755F502B09EE8D00EA7119 /* MOOTest2ViewController.swift */, 106 | FD755F522B09EEF600EA7119 /* MOOTableViewCell.swift */, 107 | 607FACD91AFB9204008FA782 /* Main.storyboard */, 108 | 607FACDC1AFB9204008FA782 /* Images.xcassets */, 109 | 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */, 110 | 607FACD31AFB9204008FA782 /* Supporting Files */, 111 | ); 112 | name = "Example for MOOFoldTextView"; 113 | path = MOOFoldTextView; 114 | sourceTree = ""; 115 | }; 116 | 607FACD31AFB9204008FA782 /* Supporting Files */ = { 117 | isa = PBXGroup; 118 | children = ( 119 | 607FACD41AFB9204008FA782 /* Info.plist */, 120 | ); 121 | name = "Supporting Files"; 122 | sourceTree = ""; 123 | }; 124 | 607FACE81AFB9204008FA782 /* Tests */ = { 125 | isa = PBXGroup; 126 | children = ( 127 | 607FACEB1AFB9204008FA782 /* Tests.swift */, 128 | 607FACE91AFB9204008FA782 /* Supporting Files */, 129 | ); 130 | path = Tests; 131 | sourceTree = ""; 132 | }; 133 | 607FACE91AFB9204008FA782 /* Supporting Files */ = { 134 | isa = PBXGroup; 135 | children = ( 136 | 607FACEA1AFB9204008FA782 /* Info.plist */, 137 | ); 138 | name = "Supporting Files"; 139 | sourceTree = ""; 140 | }; 141 | 607FACF51AFB993E008FA782 /* Podspec Metadata */ = { 142 | isa = PBXGroup; 143 | children = ( 144 | 94CA18135D910F89C4F3DF2C /* MOOFoldTextView.podspec */, 145 | D901CB0FA7566673FAC50CCB /* README.md */, 146 | 7A012B9567565C9489E44E1D /* LICENSE */, 147 | ); 148 | name = "Podspec Metadata"; 149 | sourceTree = ""; 150 | }; 151 | BBDA96B37B53434977F91AAF /* Pods */ = { 152 | isa = PBXGroup; 153 | children = ( 154 | CCEEE17817131F3FF53DE717 /* Pods-MOOFoldTextView_Example.debug.xcconfig */, 155 | AC44134C22CE2269D6020AF8 /* Pods-MOOFoldTextView_Example.release.xcconfig */, 156 | 94CAD5B518F1475B5BD77276 /* Pods-MOOFoldTextView_Tests.debug.xcconfig */, 157 | EECA3BD4D0C60329F7B1CF9F /* Pods-MOOFoldTextView_Tests.release.xcconfig */, 158 | ); 159 | path = Pods; 160 | sourceTree = ""; 161 | }; 162 | C457383BD3BC7A5BBB6D82A0 /* Frameworks */ = { 163 | isa = PBXGroup; 164 | children = ( 165 | F247C872C24E4CC4BE2A237F /* Pods_MOOFoldTextView_Example.framework */, 166 | 8C90134A08504545641A9571 /* Pods_MOOFoldTextView_Tests.framework */, 167 | ); 168 | name = Frameworks; 169 | sourceTree = ""; 170 | }; 171 | /* End PBXGroup section */ 172 | 173 | /* Begin PBXNativeTarget section */ 174 | 607FACCF1AFB9204008FA782 /* MOOFoldTextView_Example */ = { 175 | isa = PBXNativeTarget; 176 | buildConfigurationList = 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "MOOFoldTextView_Example" */; 177 | buildPhases = ( 178 | 5783E68EB51F2B830BF2E30C /* [CP] Check Pods Manifest.lock */, 179 | 607FACCC1AFB9204008FA782 /* Sources */, 180 | 607FACCD1AFB9204008FA782 /* Frameworks */, 181 | 607FACCE1AFB9204008FA782 /* Resources */, 182 | 277E1D4E0AA074A288D8DFF3 /* [CP] Embed Pods Frameworks */, 183 | ); 184 | buildRules = ( 185 | ); 186 | dependencies = ( 187 | ); 188 | name = MOOFoldTextView_Example; 189 | productName = MOOFoldTextView; 190 | productReference = 607FACD01AFB9204008FA782 /* MOOFoldTextView_Example.app */; 191 | productType = "com.apple.product-type.application"; 192 | }; 193 | 607FACE41AFB9204008FA782 /* MOOFoldTextView_Tests */ = { 194 | isa = PBXNativeTarget; 195 | buildConfigurationList = 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "MOOFoldTextView_Tests" */; 196 | buildPhases = ( 197 | F8AE118C3360F13F082245DA /* [CP] Check Pods Manifest.lock */, 198 | 607FACE11AFB9204008FA782 /* Sources */, 199 | 607FACE21AFB9204008FA782 /* Frameworks */, 200 | 607FACE31AFB9204008FA782 /* Resources */, 201 | ); 202 | buildRules = ( 203 | ); 204 | dependencies = ( 205 | 607FACE71AFB9204008FA782 /* PBXTargetDependency */, 206 | ); 207 | name = MOOFoldTextView_Tests; 208 | productName = Tests; 209 | productReference = 607FACE51AFB9204008FA782 /* MOOFoldTextView_Tests.xctest */; 210 | productType = "com.apple.product-type.bundle.unit-test"; 211 | }; 212 | /* End PBXNativeTarget section */ 213 | 214 | /* Begin PBXProject section */ 215 | 607FACC81AFB9204008FA782 /* Project object */ = { 216 | isa = PBXProject; 217 | attributes = { 218 | LastSwiftUpdateCheck = 0830; 219 | LastUpgradeCheck = 0830; 220 | ORGANIZATIONNAME = CocoaPods; 221 | TargetAttributes = { 222 | 607FACCF1AFB9204008FA782 = { 223 | CreatedOnToolsVersion = 6.3.1; 224 | LastSwiftMigration = 0900; 225 | }; 226 | 607FACE41AFB9204008FA782 = { 227 | CreatedOnToolsVersion = 6.3.1; 228 | LastSwiftMigration = 0900; 229 | TestTargetID = 607FACCF1AFB9204008FA782; 230 | }; 231 | }; 232 | }; 233 | buildConfigurationList = 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "MOOFoldTextView" */; 234 | compatibilityVersion = "Xcode 3.2"; 235 | developmentRegion = English; 236 | hasScannedForEncodings = 0; 237 | knownRegions = ( 238 | English, 239 | en, 240 | Base, 241 | ); 242 | mainGroup = 607FACC71AFB9204008FA782; 243 | productRefGroup = 607FACD11AFB9204008FA782 /* Products */; 244 | projectDirPath = ""; 245 | projectRoot = ""; 246 | targets = ( 247 | 607FACCF1AFB9204008FA782 /* MOOFoldTextView_Example */, 248 | 607FACE41AFB9204008FA782 /* MOOFoldTextView_Tests */, 249 | ); 250 | }; 251 | /* End PBXProject section */ 252 | 253 | /* Begin PBXResourcesBuildPhase section */ 254 | 607FACCE1AFB9204008FA782 /* Resources */ = { 255 | isa = PBXResourcesBuildPhase; 256 | buildActionMask = 2147483647; 257 | files = ( 258 | 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */, 259 | 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */, 260 | 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */, 261 | ); 262 | runOnlyForDeploymentPostprocessing = 0; 263 | }; 264 | 607FACE31AFB9204008FA782 /* Resources */ = { 265 | isa = PBXResourcesBuildPhase; 266 | buildActionMask = 2147483647; 267 | files = ( 268 | ); 269 | runOnlyForDeploymentPostprocessing = 0; 270 | }; 271 | /* End PBXResourcesBuildPhase section */ 272 | 273 | /* Begin PBXShellScriptBuildPhase section */ 274 | 277E1D4E0AA074A288D8DFF3 /* [CP] Embed Pods Frameworks */ = { 275 | isa = PBXShellScriptBuildPhase; 276 | buildActionMask = 2147483647; 277 | files = ( 278 | ); 279 | inputPaths = ( 280 | "${PODS_ROOT}/Target Support Files/Pods-MOOFoldTextView_Example/Pods-MOOFoldTextView_Example-frameworks.sh", 281 | "${BUILT_PRODUCTS_DIR}/MOOFoldTextView/MOOFoldTextView.framework", 282 | ); 283 | name = "[CP] Embed Pods Frameworks"; 284 | outputPaths = ( 285 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MOOFoldTextView.framework", 286 | ); 287 | runOnlyForDeploymentPostprocessing = 0; 288 | shellPath = /bin/sh; 289 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-MOOFoldTextView_Example/Pods-MOOFoldTextView_Example-frameworks.sh\"\n"; 290 | showEnvVarsInLog = 0; 291 | }; 292 | 5783E68EB51F2B830BF2E30C /* [CP] Check Pods Manifest.lock */ = { 293 | isa = PBXShellScriptBuildPhase; 294 | buildActionMask = 2147483647; 295 | files = ( 296 | ); 297 | inputFileListPaths = ( 298 | ); 299 | inputPaths = ( 300 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 301 | "${PODS_ROOT}/Manifest.lock", 302 | ); 303 | name = "[CP] Check Pods Manifest.lock"; 304 | outputFileListPaths = ( 305 | ); 306 | outputPaths = ( 307 | "$(DERIVED_FILE_DIR)/Pods-MOOFoldTextView_Example-checkManifestLockResult.txt", 308 | ); 309 | runOnlyForDeploymentPostprocessing = 0; 310 | shellPath = /bin/sh; 311 | 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"; 312 | showEnvVarsInLog = 0; 313 | }; 314 | F8AE118C3360F13F082245DA /* [CP] Check Pods Manifest.lock */ = { 315 | isa = PBXShellScriptBuildPhase; 316 | buildActionMask = 2147483647; 317 | files = ( 318 | ); 319 | inputFileListPaths = ( 320 | ); 321 | inputPaths = ( 322 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 323 | "${PODS_ROOT}/Manifest.lock", 324 | ); 325 | name = "[CP] Check Pods Manifest.lock"; 326 | outputFileListPaths = ( 327 | ); 328 | outputPaths = ( 329 | "$(DERIVED_FILE_DIR)/Pods-MOOFoldTextView_Tests-checkManifestLockResult.txt", 330 | ); 331 | runOnlyForDeploymentPostprocessing = 0; 332 | shellPath = /bin/sh; 333 | 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"; 334 | showEnvVarsInLog = 0; 335 | }; 336 | /* End PBXShellScriptBuildPhase section */ 337 | 338 | /* Begin PBXSourcesBuildPhase section */ 339 | 607FACCC1AFB9204008FA782 /* Sources */ = { 340 | isa = PBXSourcesBuildPhase; 341 | buildActionMask = 2147483647; 342 | files = ( 343 | FD755F532B09EEF600EA7119 /* MOOTableViewCell.swift in Sources */, 344 | 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */, 345 | FD755F4F2B09EE5A00EA7119 /* MOOTest1ViewController.swift in Sources */, 346 | 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */, 347 | FD755F512B09EE8D00EA7119 /* MOOTest2ViewController.swift in Sources */, 348 | ); 349 | runOnlyForDeploymentPostprocessing = 0; 350 | }; 351 | 607FACE11AFB9204008FA782 /* Sources */ = { 352 | isa = PBXSourcesBuildPhase; 353 | buildActionMask = 2147483647; 354 | files = ( 355 | 607FACEC1AFB9204008FA782 /* Tests.swift in Sources */, 356 | ); 357 | runOnlyForDeploymentPostprocessing = 0; 358 | }; 359 | /* End PBXSourcesBuildPhase section */ 360 | 361 | /* Begin PBXTargetDependency section */ 362 | 607FACE71AFB9204008FA782 /* PBXTargetDependency */ = { 363 | isa = PBXTargetDependency; 364 | target = 607FACCF1AFB9204008FA782 /* MOOFoldTextView_Example */; 365 | targetProxy = 607FACE61AFB9204008FA782 /* PBXContainerItemProxy */; 366 | }; 367 | /* End PBXTargetDependency section */ 368 | 369 | /* Begin PBXVariantGroup section */ 370 | 607FACD91AFB9204008FA782 /* Main.storyboard */ = { 371 | isa = PBXVariantGroup; 372 | children = ( 373 | 607FACDA1AFB9204008FA782 /* Base */, 374 | ); 375 | name = Main.storyboard; 376 | sourceTree = ""; 377 | }; 378 | 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */ = { 379 | isa = PBXVariantGroup; 380 | children = ( 381 | 607FACDF1AFB9204008FA782 /* Base */, 382 | ); 383 | name = LaunchScreen.xib; 384 | sourceTree = ""; 385 | }; 386 | /* End PBXVariantGroup section */ 387 | 388 | /* Begin XCBuildConfiguration section */ 389 | 607FACED1AFB9204008FA782 /* Debug */ = { 390 | isa = XCBuildConfiguration; 391 | buildSettings = { 392 | ALWAYS_SEARCH_USER_PATHS = NO; 393 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 394 | CLANG_CXX_LIBRARY = "libc++"; 395 | CLANG_ENABLE_MODULES = YES; 396 | CLANG_ENABLE_OBJC_ARC = YES; 397 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 398 | CLANG_WARN_BOOL_CONVERSION = YES; 399 | CLANG_WARN_COMMA = YES; 400 | CLANG_WARN_CONSTANT_CONVERSION = YES; 401 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 402 | CLANG_WARN_EMPTY_BODY = YES; 403 | CLANG_WARN_ENUM_CONVERSION = YES; 404 | CLANG_WARN_INFINITE_RECURSION = YES; 405 | CLANG_WARN_INT_CONVERSION = YES; 406 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 407 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 408 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 409 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 410 | CLANG_WARN_STRICT_PROTOTYPES = YES; 411 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 412 | CLANG_WARN_UNREACHABLE_CODE = YES; 413 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 414 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 415 | COPY_PHASE_STRIP = NO; 416 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 417 | ENABLE_STRICT_OBJC_MSGSEND = YES; 418 | ENABLE_TESTABILITY = YES; 419 | GCC_C_LANGUAGE_STANDARD = gnu99; 420 | GCC_DYNAMIC_NO_PIC = NO; 421 | GCC_NO_COMMON_BLOCKS = YES; 422 | GCC_OPTIMIZATION_LEVEL = 0; 423 | GCC_PREPROCESSOR_DEFINITIONS = ( 424 | "DEBUG=1", 425 | "$(inherited)", 426 | ); 427 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 428 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 429 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 430 | GCC_WARN_UNDECLARED_SELECTOR = YES; 431 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 432 | GCC_WARN_UNUSED_FUNCTION = YES; 433 | GCC_WARN_UNUSED_VARIABLE = YES; 434 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 435 | MTL_ENABLE_DEBUG_INFO = YES; 436 | ONLY_ACTIVE_ARCH = YES; 437 | SDKROOT = iphoneos; 438 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 439 | }; 440 | name = Debug; 441 | }; 442 | 607FACEE1AFB9204008FA782 /* Release */ = { 443 | isa = XCBuildConfiguration; 444 | buildSettings = { 445 | ALWAYS_SEARCH_USER_PATHS = NO; 446 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 447 | CLANG_CXX_LIBRARY = "libc++"; 448 | CLANG_ENABLE_MODULES = YES; 449 | CLANG_ENABLE_OBJC_ARC = YES; 450 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 451 | CLANG_WARN_BOOL_CONVERSION = YES; 452 | CLANG_WARN_COMMA = YES; 453 | CLANG_WARN_CONSTANT_CONVERSION = YES; 454 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 455 | CLANG_WARN_EMPTY_BODY = YES; 456 | CLANG_WARN_ENUM_CONVERSION = YES; 457 | CLANG_WARN_INFINITE_RECURSION = YES; 458 | CLANG_WARN_INT_CONVERSION = YES; 459 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 460 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 461 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 462 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 463 | CLANG_WARN_STRICT_PROTOTYPES = YES; 464 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 465 | CLANG_WARN_UNREACHABLE_CODE = YES; 466 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 467 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 468 | COPY_PHASE_STRIP = NO; 469 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 470 | ENABLE_NS_ASSERTIONS = NO; 471 | ENABLE_STRICT_OBJC_MSGSEND = YES; 472 | GCC_C_LANGUAGE_STANDARD = gnu99; 473 | GCC_NO_COMMON_BLOCKS = YES; 474 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 475 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 476 | GCC_WARN_UNDECLARED_SELECTOR = YES; 477 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 478 | GCC_WARN_UNUSED_FUNCTION = YES; 479 | GCC_WARN_UNUSED_VARIABLE = YES; 480 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 481 | MTL_ENABLE_DEBUG_INFO = NO; 482 | SDKROOT = iphoneos; 483 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 484 | VALIDATE_PRODUCT = YES; 485 | }; 486 | name = Release; 487 | }; 488 | 607FACF01AFB9204008FA782 /* Debug */ = { 489 | isa = XCBuildConfiguration; 490 | baseConfigurationReference = CCEEE17817131F3FF53DE717 /* Pods-MOOFoldTextView_Example.debug.xcconfig */; 491 | buildSettings = { 492 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 493 | INFOPLIST_FILE = MOOFoldTextView/Info.plist; 494 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 495 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 496 | MODULE_NAME = ExampleApp; 497 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; 498 | PRODUCT_NAME = "$(TARGET_NAME)"; 499 | SWIFT_SWIFT3_OBJC_INFERENCE = Default; 500 | SWIFT_VERSION = 4.0; 501 | }; 502 | name = Debug; 503 | }; 504 | 607FACF11AFB9204008FA782 /* Release */ = { 505 | isa = XCBuildConfiguration; 506 | baseConfigurationReference = AC44134C22CE2269D6020AF8 /* Pods-MOOFoldTextView_Example.release.xcconfig */; 507 | buildSettings = { 508 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 509 | INFOPLIST_FILE = MOOFoldTextView/Info.plist; 510 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 511 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 512 | MODULE_NAME = ExampleApp; 513 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; 514 | PRODUCT_NAME = "$(TARGET_NAME)"; 515 | SWIFT_SWIFT3_OBJC_INFERENCE = Default; 516 | SWIFT_VERSION = 4.0; 517 | }; 518 | name = Release; 519 | }; 520 | 607FACF31AFB9204008FA782 /* Debug */ = { 521 | isa = XCBuildConfiguration; 522 | baseConfigurationReference = 94CAD5B518F1475B5BD77276 /* Pods-MOOFoldTextView_Tests.debug.xcconfig */; 523 | buildSettings = { 524 | FRAMEWORK_SEARCH_PATHS = ( 525 | "$(PLATFORM_DIR)/Developer/Library/Frameworks", 526 | "$(inherited)", 527 | ); 528 | GCC_PREPROCESSOR_DEFINITIONS = ( 529 | "DEBUG=1", 530 | "$(inherited)", 531 | ); 532 | INFOPLIST_FILE = Tests/Info.plist; 533 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 534 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; 535 | PRODUCT_NAME = "$(TARGET_NAME)"; 536 | SWIFT_SWIFT3_OBJC_INFERENCE = Default; 537 | SWIFT_VERSION = 4.0; 538 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/MOOFoldTextView_Example.app/MOOFoldTextView_Example"; 539 | }; 540 | name = Debug; 541 | }; 542 | 607FACF41AFB9204008FA782 /* Release */ = { 543 | isa = XCBuildConfiguration; 544 | baseConfigurationReference = EECA3BD4D0C60329F7B1CF9F /* Pods-MOOFoldTextView_Tests.release.xcconfig */; 545 | buildSettings = { 546 | FRAMEWORK_SEARCH_PATHS = ( 547 | "$(PLATFORM_DIR)/Developer/Library/Frameworks", 548 | "$(inherited)", 549 | ); 550 | INFOPLIST_FILE = Tests/Info.plist; 551 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 552 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; 553 | PRODUCT_NAME = "$(TARGET_NAME)"; 554 | SWIFT_SWIFT3_OBJC_INFERENCE = Default; 555 | SWIFT_VERSION = 4.0; 556 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/MOOFoldTextView_Example.app/MOOFoldTextView_Example"; 557 | }; 558 | name = Release; 559 | }; 560 | /* End XCBuildConfiguration section */ 561 | 562 | /* Begin XCConfigurationList section */ 563 | 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "MOOFoldTextView" */ = { 564 | isa = XCConfigurationList; 565 | buildConfigurations = ( 566 | 607FACED1AFB9204008FA782 /* Debug */, 567 | 607FACEE1AFB9204008FA782 /* Release */, 568 | ); 569 | defaultConfigurationIsVisible = 0; 570 | defaultConfigurationName = Release; 571 | }; 572 | 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "MOOFoldTextView_Example" */ = { 573 | isa = XCConfigurationList; 574 | buildConfigurations = ( 575 | 607FACF01AFB9204008FA782 /* Debug */, 576 | 607FACF11AFB9204008FA782 /* Release */, 577 | ); 578 | defaultConfigurationIsVisible = 0; 579 | defaultConfigurationName = Release; 580 | }; 581 | 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "MOOFoldTextView_Tests" */ = { 582 | isa = XCConfigurationList; 583 | buildConfigurations = ( 584 | 607FACF31AFB9204008FA782 /* Debug */, 585 | 607FACF41AFB9204008FA782 /* Release */, 586 | ); 587 | defaultConfigurationIsVisible = 0; 588 | defaultConfigurationName = Release; 589 | }; 590 | /* End XCConfigurationList section */ 591 | }; 592 | rootObject = 607FACC81AFB9204008FA782 /* Project object */; 593 | } 594 | --------------------------------------------------------------------------------