├── JCTagListView ├── Assets │ └── .gitkeep └── Classes │ ├── JCTagListViewFlowLayout.h │ ├── JCTagCell.h │ ├── JCTagCell.m │ ├── JCTagListView.h │ ├── JCTagListViewFlowLayout.m │ └── JCTagListView.m ├── _Pods.xcodeproj ├── Example ├── Tests │ ├── en.lproj │ │ └── InfoPlist.strings │ ├── Tests-Prefix.pch │ ├── Tests-Info.plist │ └── Tests.m ├── JCTagListView │ ├── en.lproj │ │ └── InfoPlist.strings │ ├── JCViewController.h │ ├── JCAppDelegate.h │ ├── JCTableViewController.h │ ├── JCTagListView-Prefix.pch │ ├── main.m │ ├── JCAppDelegate.m │ ├── JCTagListView-Info.plist │ ├── Base.lproj │ │ └── LaunchScreen.storyboard │ ├── Images.xcassets │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── JCViewController.m │ ├── JCTableViewController.m │ └── Main.storyboard ├── Pods │ ├── Target Support Files │ │ ├── JCTagListView │ │ │ ├── JCTagListView-dummy.m │ │ │ ├── JCTagListView-prefix.pch │ │ │ └── JCTagListView.xcconfig │ │ └── Pods-JCTagListView_Example │ │ │ ├── Pods-JCTagListView_Example-dummy.m │ │ │ ├── Pods-JCTagListView_Example.debug.xcconfig │ │ │ ├── Pods-JCTagListView_Example.release.xcconfig │ │ │ ├── Pods-JCTagListView_Example-acknowledgements.markdown │ │ │ ├── Pods-JCTagListView_Example-acknowledgements.plist │ │ │ ├── Pods-JCTagListView_Example-resources.sh │ │ │ └── Pods-JCTagListView_Example-frameworks.sh │ ├── Manifest.lock │ ├── Local Podspecs │ │ └── JCTagListView.podspec.json │ └── Pods.xcodeproj │ │ └── project.pbxproj ├── Podfile ├── JCTagListView.xcodeproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ ├── xcshareddata │ │ └── xcschemes │ │ │ └── JCTagListView-Example.xcscheme │ └── project.pbxproj ├── JCTagListView.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── Podfile.lock ├── ScreenShot1.png ├── ScreenShot2.png ├── ScreenShot3.png ├── .travis.yml ├── .gitignore ├── JCTagListView.podspec ├── LICENSE └── README.md /JCTagListView/Assets/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /_Pods.xcodeproj: -------------------------------------------------------------------------------- 1 | Example/Pods/Pods.xcodeproj -------------------------------------------------------------------------------- /Example/Tests/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /ScreenShot1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lijingcheng/JCTagListView/HEAD/ScreenShot1.png -------------------------------------------------------------------------------- /ScreenShot2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lijingcheng/JCTagListView/HEAD/ScreenShot2.png -------------------------------------------------------------------------------- /ScreenShot3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lijingcheng/JCTagListView/HEAD/ScreenShot3.png -------------------------------------------------------------------------------- /Example/JCTagListView/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /Example/Tests/Tests-Prefix.pch: -------------------------------------------------------------------------------- 1 | // The contents of this file are implicitly included at the beginning of every test case source file. 2 | 3 | #ifdef __OBJC__ 4 | 5 | 6 | 7 | #endif 8 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/JCTagListView/JCTagListView-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_JCTagListView : NSObject 3 | @end 4 | @implementation PodsDummy_JCTagListView 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Podfile: -------------------------------------------------------------------------------- 1 | source 'https://github.com/CocoaPods/Specs.git' 2 | 3 | platform :ios, '9.0' 4 | 5 | use_frameworks! 6 | 7 | target 'JCTagListView_Example' do 8 | pod 'JCTagListView', :path => '../' 9 | end 10 | -------------------------------------------------------------------------------- /Example/JCTagListView.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-JCTagListView_Example/Pods-JCTagListView_Example-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_JCTagListView_Example : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_JCTagListView_Example 5 | @end 6 | -------------------------------------------------------------------------------- /Example/JCTagListView/JCViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // JCViewController.h 3 | // JCTagListView 4 | // 5 | // Created by lijingcheng on 09/25/2018. 6 | // Copyright (c) 2018 lijingcheng. All rights reserved. 7 | // 8 | 9 | @import UIKit; 10 | 11 | @interface JCViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/JCTagListView/JCTagListView-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Example/JCTagListView.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Example/JCTagListView.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /JCTagListView/Classes/JCTagListViewFlowLayout.h: -------------------------------------------------------------------------------- 1 | // 2 | // JCTagListViewFlowLayout.h 3 | // JCTagListView 4 | // 5 | // Created by 李京城 on 2018/9/25. 6 | // 7 | 8 | #import 9 | 10 | NS_ASSUME_NONNULL_BEGIN 11 | 12 | @interface JCTagListViewFlowLayout : UICollectionViewFlowLayout 13 | 14 | @end 15 | 16 | NS_ASSUME_NONNULL_END 17 | -------------------------------------------------------------------------------- /Example/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - JCTagListView (2.0.0) 3 | 4 | DEPENDENCIES: 5 | - JCTagListView (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | JCTagListView: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | JCTagListView: 051fa899b8a3453f1d33b5e0cde5f5a341191ff4 13 | 14 | PODFILE CHECKSUM: 18ca15bb9051d983a8c3f8f24762f0bcfcc735cf 15 | 16 | COCOAPODS: 1.5.3 17 | -------------------------------------------------------------------------------- /Example/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - JCTagListView (2.0.0) 3 | 4 | DEPENDENCIES: 5 | - JCTagListView (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | JCTagListView: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | JCTagListView: 051fa899b8a3453f1d33b5e0cde5f5a341191ff4 13 | 14 | PODFILE CHECKSUM: 18ca15bb9051d983a8c3f8f24762f0bcfcc735cf 15 | 16 | COCOAPODS: 1.5.3 17 | -------------------------------------------------------------------------------- /Example/JCTagListView/JCAppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // JCAppDelegate.h 3 | // JCTagListView 4 | // 5 | // Created by lijingcheng on 09/25/2018. 6 | // Copyright (c) 2018 lijingcheng. All rights reserved. 7 | // 8 | 9 | @import UIKit; 10 | 11 | @interface JCAppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /Example/JCTagListView/JCTableViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // JCTableViewController.h 3 | // JCTagListView_Example 4 | // 5 | // Created by 李京城 on 2018/9/25. 6 | // Copyright © 2018年 lijingcheng. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface JCTableViewController : UITableViewController 14 | 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /Example/JCTagListView/JCTagListView-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header 3 | // 4 | // The contents of this file are implicitly included at the beginning of every source file. 5 | // 6 | 7 | #import 8 | 9 | #ifndef __IPHONE_5_0 10 | #warning "This project uses features only available in iOS SDK 5.0 and later." 11 | #endif 12 | 13 | #ifdef __OBJC__ 14 | @import UIKit; 15 | @import Foundation; 16 | #endif 17 | -------------------------------------------------------------------------------- /Example/JCTagListView/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // JCTagListView 4 | // 5 | // Created by lijingcheng on 09/25/2018. 6 | // Copyright (c) 2018 lijingcheng. All rights reserved. 7 | // 8 | 9 | @import UIKit; 10 | #import "JCAppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) 13 | { 14 | @autoreleasepool { 15 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([JCAppDelegate class])); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Example/JCTagListView/JCAppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // JCAppDelegate.m 3 | // JCTagListView 4 | // 5 | // Created by lijingcheng on 09/25/2018. 6 | // Copyright (c) 2018 lijingcheng. All rights reserved. 7 | // 8 | 9 | #import "JCAppDelegate.h" 10 | 11 | @implementation JCAppDelegate 12 | 13 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 14 | return YES; 15 | } 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /JCTagListView/Classes/JCTagCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // JCTagCell.h 3 | // JCTagListView 4 | // 5 | // Created by 李京城 on 15/7/3. 6 | // Copyright (c) 2015年 李京城. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface JCTagCell : UICollectionViewCell 14 | 15 | @property (nonatomic, strong) UILabel *textLabel; 16 | 17 | @property (nonatomic, assign) UIEdgeInsets contentInset; 18 | 19 | @end 20 | 21 | NS_ASSUME_NONNULL_END 22 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/JCTagListView/JCTagListView.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/JCTagListView 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | PODS_BUILD_DIR = ${BUILD_DIR} 4 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 5 | PODS_ROOT = ${SRCROOT} 6 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. 7 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 8 | SKIP_INSTALL = YES 9 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | # references: 2 | # * https://www.objc.io/issues/6-build-tools/travis-ci/ 3 | # * https://github.com/supermarin/xcpretty#usage 4 | 5 | osx_image: xcode7.3 6 | language: objective-c 7 | # cache: cocoapods 8 | # podfile: Example/Podfile 9 | # before_install: 10 | # - gem install cocoapods # Since Travis is not always on latest version 11 | # - pod install --project-directory=Example 12 | script: 13 | - set -o pipefail && xcodebuild test -enableCodeCoverage YES -workspace Example/JCTagListView.xcworkspace -scheme JCTagListView-Example -sdk iphonesimulator9.3 ONLY_ACTIVE_ARCH=NO | xcpretty 14 | - pod lib lint 15 | -------------------------------------------------------------------------------- /Example/Pods/Local Podspecs/JCTagListView.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "JCTagListView", 3 | "version": "2.0.0", 4 | "summary": "Support select tags and settings tags style.", 5 | "homepage": "http://lijingcheng.github.io/", 6 | "license": { 7 | "type": "MIT", 8 | "file": "LICENSE" 9 | }, 10 | "authors": { 11 | "lijingcheng": "bj_lijingcheng@163.com" 12 | }, 13 | "source": { 14 | "git": "https://github.com/lijingcheng/JCTagListView.git", 15 | "tag": "2.0.0" 16 | }, 17 | "social_media_url": "http://weibo.com/lijingcheng1984", 18 | "platforms": { 19 | "ios": "9.0" 20 | }, 21 | "source_files": "JCTagListView/Classes/**/*" 22 | } 23 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-JCTagListView_Example/Pods-JCTagListView_Example.debug.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/JCTagListView" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 4 | OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/JCTagListView/JCTagListView.framework/Headers" 5 | OTHER_LDFLAGS = $(inherited) -framework "JCTagListView" 6 | PODS_BUILD_DIR = ${BUILD_DIR} 7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 9 | PODS_ROOT = ${SRCROOT}/Pods 10 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-JCTagListView_Example/Pods-JCTagListView_Example.release.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/JCTagListView" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 4 | OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/JCTagListView/JCTagListView.framework/Headers" 5 | OTHER_LDFLAGS = $(inherited) -framework "JCTagListView" 6 | PODS_BUILD_DIR = ${BUILD_DIR} 7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 9 | PODS_ROOT = ${SRCROOT}/Pods 10 | -------------------------------------------------------------------------------- /Example/Tests/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 | CFBundlePackageType 14 | BNDL 15 | CFBundleShortVersionString 16 | 1.0 17 | CFBundleSignature 18 | ???? 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /Example/Tests/Tests.m: -------------------------------------------------------------------------------- 1 | // 2 | // JCTagListViewTests.m 3 | // JCTagListViewTests 4 | // 5 | // Created by lijingcheng on 09/25/2018. 6 | // Copyright (c) 2018 lijingcheng. All rights reserved. 7 | // 8 | 9 | @import XCTest; 10 | 11 | @interface Tests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation Tests 16 | 17 | - (void)setUp 18 | { 19 | [super setUp]; 20 | // Put setup code here. This method is called before the invocation of each test method in the class. 21 | } 22 | 23 | - (void)tearDown 24 | { 25 | // Put teardown code here. This method is called after the invocation of each test method in the class. 26 | [super tearDown]; 27 | } 28 | 29 | - (void)testExample 30 | { 31 | XCTFail(@"No implementation for \"%s\"", __PRETTY_FUNCTION__); 32 | } 33 | 34 | @end 35 | 36 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # OS X 2 | .DS_Store 3 | 4 | # Xcode 5 | build/ 6 | *.pbxuser 7 | !default.pbxuser 8 | *.mode1v3 9 | !default.mode1v3 10 | *.mode2v3 11 | !default.mode2v3 12 | *.perspectivev3 13 | !default.perspectivev3 14 | xcuserdata/ 15 | *.xccheckout 16 | profile 17 | *.moved-aside 18 | DerivedData 19 | *.hmap 20 | *.ipa 21 | 22 | # Bundler 23 | .bundle 24 | 25 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 26 | # Carthage/Checkouts 27 | 28 | Carthage/Build 29 | 30 | # We recommend against adding the Pods directory to your .gitignore. However 31 | # you should judge for yourself, the pros and cons are mentioned at: 32 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control 33 | # 34 | # Note: if you ignore the Pods directory, make sure to uncomment 35 | # `pod install` in .travis.yml 36 | # 37 | Pods/ 38 | -------------------------------------------------------------------------------- /JCTagListView.podspec: -------------------------------------------------------------------------------- 1 | # 2 | # Be sure to run `pod lib lint JCTagListView.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 = 'JCTagListView' 11 | s.version = '2.0.0' 12 | s.summary = 'Support select tags and settings tags style.' 13 | s.homepage = 'http://lijingcheng.github.io/' 14 | s.license = { :type => 'MIT', :file => 'LICENSE' } 15 | s.author = { 'lijingcheng' => 'bj_lijingcheng@163.com' } 16 | s.source = { :git => 'https://github.com/lijingcheng/JCTagListView.git', :tag => s.version.to_s } 17 | s.social_media_url = 'http://weibo.com/lijingcheng1984' 18 | s.ios.deployment_target = '9.0' 19 | s.source_files = 'JCTagListView/Classes/**/*' 20 | end 21 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2018 lijingcheng 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 | -------------------------------------------------------------------------------- /JCTagListView/Classes/JCTagCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // JCTagCell.m 3 | // JCTagListView 4 | // 5 | // Created by 李京城 on 15/7/3. 6 | // Copyright (c) 2015年 李京城. All rights reserved. 7 | // 8 | 9 | #import "JCTagCell.h" 10 | 11 | @implementation JCTagCell 12 | 13 | - (instancetype)initWithFrame:(CGRect)frame { 14 | if (self = [super initWithFrame:frame]) { 15 | self.layer.masksToBounds = YES; 16 | 17 | [self.contentView addSubview:self.titleLabel]; 18 | } 19 | 20 | return self; 21 | } 22 | 23 | - (void)layoutSubviews { 24 | [super layoutSubviews]; 25 | 26 | self.titleLabel.frame = CGRectMake(self.contentInset.left, self.contentInset.top, self.bounds.size.width - self.contentInset.left - self.contentInset.right, self.bounds.size.height - self.contentInset.top - self.contentInset.bottom); 27 | } 28 | 29 | - (void)prepareForReuse { 30 | [super prepareForReuse]; 31 | 32 | self.titleLabel.text = @""; 33 | } 34 | 35 | #pragma mark - setter/getter 36 | 37 | - (UILabel *)titleLabel { 38 | if (!_textLabel) { 39 | _textLabel = [[UILabel alloc] initWithFrame:CGRectZero]; 40 | _textLabel.textAlignment = NSTextAlignmentCenter; 41 | } 42 | 43 | return _textLabel; 44 | } 45 | 46 | @end 47 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-JCTagListView_Example/Pods-JCTagListView_Example-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## JCTagListView 5 | 6 | Copyright (c) 2018 lijingcheng 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining a copy 9 | of this software and associated documentation files (the "Software"), to deal 10 | in the Software without restriction, including without limitation the rights 11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | copies of the Software, and to permit persons to whom the Software is 13 | furnished to do so, subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice shall be included in 16 | all copies or substantial portions of the Software. 17 | 18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 | THE SOFTWARE. 25 | 26 | Generated by CocoaPods - https://cocoapods.org 27 | -------------------------------------------------------------------------------- /Example/JCTagListView/JCTagListView-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1.0 25 | LSRequiresIPhoneOS 26 | 27 | UILaunchStoryboardName 28 | LaunchScreen 29 | UIMainStoryboardFile 30 | Main 31 | UIRequiredDeviceCapabilities 32 | 33 | armv7 34 | 35 | UISupportedInterfaceOrientations 36 | 37 | UIInterfaceOrientationPortrait 38 | 39 | UISupportedInterfaceOrientations~ipad 40 | 41 | UIInterfaceOrientationPortrait 42 | UIInterfaceOrientationPortraitUpsideDown 43 | UIInterfaceOrientationLandscapeLeft 44 | UIInterfaceOrientationLandscapeRight 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /Example/JCTagListView/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 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /Example/JCTagListView/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" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "size" : "1024x1024", 91 | "scale" : "1x" 92 | } 93 | ], 94 | "info" : { 95 | "version" : 1, 96 | "author" : "xcode" 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /JCTagListView/Classes/JCTagListView.h: -------------------------------------------------------------------------------- 1 | // 2 | // JCTagListView.h 3 | // JCTagListView 4 | // 5 | // Created by 李京城 on 15/7/3. 6 | // Copyright (c) 2015年 李京城. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | typedef void (^JCTagListViewBlock)(NSInteger index); 14 | 15 | IB_DESIGNABLE 16 | @interface JCTagListView : UIView 17 | 18 | @property (nonatomic, assign) IBInspectable CGFloat tagItemSpacing; // default: 10 19 | @property (nonatomic, assign) IBInspectable CGFloat tagLineSpacing; // default: 10 20 | @property (nonatomic, assign) IBInspectable CGFloat tagCornerRadius; // default: 10 21 | @property (nonatomic, assign) IBInspectable CGFloat tagBorderWidth; // default: 0.5 22 | 23 | @property (nonatomic, assign) UIEdgeInsets tagContentInset; // default: 5、 10、 5、 10 24 | 25 | @property (nonatomic, strong) UIColor *tagBorderColor; // default: lightGrayColor 26 | @property (nonatomic, strong) UIColor *tagSelectedBorderColor; // default: lightGrayColor 27 | @property (nonatomic, strong) UIColor *tagTextColor; // default: darkGrayColor 28 | @property (nonatomic, strong) UIColor *tagSelectedTextColor; // default: darkGrayColor 29 | @property (nonatomic, strong) UIColor *tagBackgroundColor; // default: whiteColor 30 | @property (nonatomic, strong) UIColor *tagSelectedBackgroundColor; // default: rgb(217,217,217) 31 | 32 | @property (nonatomic, assign) BOOL supportSelected; // default: NO 33 | @property (nonatomic, assign) BOOL supportMultipleSelected; // default: NO 34 | 35 | @property (nonatomic, strong) UIFont *tagFont; // default: [UIFont systemFontOfSize:14.0f] 36 | 37 | @property (nonatomic, strong) NSArray *tags; 38 | @property (nonatomic, strong) NSMutableArray *selectedTags; 39 | @property (nonatomic, strong, readonly) NSMutableArray *selectedTagsIndex; // selected result 40 | 41 | @property (nonatomic, assign, readonly) CGFloat contentHeight; // Used to calculate the height 42 | 43 | - (void)didSelectItem:(JCTagListViewBlock)block; 44 | 45 | - (void)reloadData; 46 | 47 | @end 48 | 49 | NS_ASSUME_NONNULL_END 50 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-JCTagListView_Example/Pods-JCTagListView_Example-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Copyright (c) 2018 lijingcheng <jingcheng.li@mtime.com> 18 | 19 | Permission is hereby granted, free of charge, to any person obtaining a copy 20 | of this software and associated documentation files (the "Software"), to deal 21 | in the Software without restriction, including without limitation the rights 22 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 23 | copies of the Software, and to permit persons to whom the Software is 24 | furnished to do so, subject to the following conditions: 25 | 26 | The above copyright notice and this permission notice shall be included in 27 | all copies or substantial portions of the Software. 28 | 29 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 30 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 31 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 32 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 33 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 34 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 35 | THE SOFTWARE. 36 | 37 | License 38 | MIT 39 | Title 40 | JCTagListView 41 | Type 42 | PSGroupSpecifier 43 | 44 | 45 | FooterText 46 | Generated by CocoaPods - https://cocoapods.org 47 | Title 48 | 49 | Type 50 | PSGroupSpecifier 51 | 52 | 53 | StringsTable 54 | Acknowledgements 55 | Title 56 | Acknowledgements 57 | 58 | 59 | -------------------------------------------------------------------------------- /Example/JCTagListView/JCViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // JCViewController.m 3 | // JCTagListView 4 | // 5 | // Created by lijingcheng on 09/25/2018. 6 | // Copyright (c) 2018 lijingcheng. All rights reserved. 7 | // 8 | 9 | #import "JCViewController.h" 10 | #import "JCTableViewController.h" 11 | #import "JCTagListView.h" 12 | 13 | @interface JCViewController () 14 | 15 | @property (nonatomic, weak) IBOutlet JCTagListView *tagListView; 16 | 17 | @end 18 | 19 | @implementation JCViewController 20 | 21 | - (void)viewDidLoad { 22 | [super viewDidLoad]; 23 | 24 | self.tagListView.supportSelected = YES; 25 | self.tagListView.supportMultipleSelected = YES; 26 | 27 | self.tagListView.tags = @[@"NSStNSStringNSStringNSStringNSStringNSStringNSStringNSStringring", @"NSMutableString", @"NSArray", @"UITapGestureRecognizer", @"IBOutlet", @"IBAction", @"id", @"UIView", @"UIStatusBar", @"UITableViewController", @"UIStepper", @"UISegmentedControl", @"UICollectionViewController", @"UISearchBar", @"UIToolbar", @"UIPageControl", @"UIActionSheet", @"NSMutableArray", @"NSDictionary", @"NSMutableDictionary", @"NSSet", @"NSMutableSet", @"NSData", @"NSMutableData", @"NSDate", @"NSCalendar", @"UIButton", @"UILabel", @"UITextField", @"UITextView", @"UIImageView", @"UITableView", @"UICollectionView", @"UIViewController"]; 28 | 29 | self.tagListView.selectedTags = @[@"NSMutableString", @"UITableViewController", @"UIStepper", @"UISegmentedControl", @"UICollectionViewController", @"UISearchBar", @"UIToolbar", @"NSMutableData", @"NSDate", @"NSCalendar", @"UIButton", @"UILabel", @"UITextField"].mutableCopy; 30 | 31 | [self.tagListView didSelectItem:^(NSInteger index) { 32 | NSLog(@"%@", @(index)); 33 | }]; 34 | } 35 | 36 | #pragma mark - IBAction 37 | 38 | - (IBAction)selected:(id)sender { 39 | UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Selected Index" message:[self.tagListView.selectedTagsIndex description] preferredStyle:UIAlertControllerStyleAlert]; 40 | [alertController addAction: [UIAlertAction actionWithTitle:@"Confirm" style:UIAlertActionStyleCancel handler:nil]]; 41 | 42 | [self presentViewController:alertController animated:YES completion:nil]; 43 | } 44 | 45 | - (IBAction)openTableViewController:(id)sender { 46 | JCTableViewController *tableVC = [self.storyboard instantiateViewControllerWithIdentifier:@"JCTableViewController"]; 47 | 48 | [self.navigationController pushViewController:tableVC animated:YES]; 49 | } 50 | 51 | @end 52 | -------------------------------------------------------------------------------- /Example/JCTagListView/JCTableViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // JCTableViewController.m 3 | // JCTagListView_Example 4 | // 5 | // Created by 李京城 on 2018/9/25. 6 | // Copyright © 2018年 lijingcheng. All rights reserved. 7 | // 8 | 9 | #import "JCTableViewController.h" 10 | #import "JCTagListView.h" 11 | 12 | @interface JCTableViewCell : UITableViewCell 13 | @property (nonatomic, weak) IBOutlet JCTagListView *tagListView; 14 | @end 15 | @implementation JCTableViewCell 16 | @end 17 | 18 | @interface JCTableViewController () 19 | 20 | @property (nonatomic, copy) NSArray *allTags; 21 | 22 | @property (nonatomic, strong) NSMutableArray *cellHeights; 23 | 24 | @property (nonatomic, strong) JCTagListView *testTagListView; // Used to calculate text height 25 | 26 | @end 27 | 28 | @implementation JCTableViewController 29 | 30 | - (void)viewDidLoad { 31 | [super viewDidLoad]; 32 | 33 | self.cellHeights = [NSMutableArray array]; 34 | 35 | self.allTags = @[@[@"NSStNSStringNSStringNSStringNSStringNSStringNSStringNSStringring", @"NSMutableString", @"NSArray", @"UIAlertView", @"UITapGestureRecognizer", @"IBOutlet", @"IBAction", @"id", @"UIView", @"UIStatusBar", @"UITableViewController", @"UIStepper", @"UISegmentedControl", @"UICollectionViewController", @"UISearchBar", @"UIToolbar", @"UIPageControl"], @[@"UIActionSheet", @"NSMutableArray", @"NSDictionary", @"NSMutableDictionary", @"NSSet", @"NSMutableSet", @"NSData", @"NSMutableData", @"NSDate", @"UICollectionView", @"UIViewController", @"NSCalendar"], @[@"UITextField", @"UITextView", @"UIImageView", @"UITableView"], @[@"UIButton", @"UILabel"]]; 36 | 37 | CGFloat cellPadding = 10.0f; 38 | 39 | for (NSArray *tags in self.allTags) { 40 | self.testTagListView.tags = tags; 41 | [self.cellHeights addObject:@(self.testTagListView.contentHeight + cellPadding * 2)]; 42 | } 43 | } 44 | 45 | #pragma mark - Table view data source 46 | 47 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 48 | return self.allTags.count; 49 | } 50 | 51 | - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 52 | return [self.cellHeights[indexPath.row] floatValue]; 53 | } 54 | 55 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 56 | JCTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellId" forIndexPath:indexPath]; 57 | cell.tagListView.tags = self.allTags[indexPath.row]; 58 | 59 | return cell; 60 | } 61 | 62 | #pragma mark - 63 | 64 | - (JCTagListView *)testTagListView { 65 | if (!_testTagListView) { 66 | _testTagListView = [[JCTagListView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width - 20, 0)]; 67 | } 68 | 69 | return _testTagListView; 70 | } 71 | 72 | @end 73 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # JCTagListView 2 | 3 | [![Stars](https://img.shields.io/redmine/plugin/stars/redmine_xlsx_format_issue_exporter.svg)](https://cocoapods.org/pods/FMDBHelper) 4 | [![Version](https://img.shields.io/cocoapods/v/JCTagListView.svg?style=flat)](https://cocoapods.org/pods/JCTagListView) 5 | [![License](https://img.shields.io/cocoapods/l/JCTagListView.svg?style=flat)](https://cocoapods.org/pods/JCTagListView) 6 | [![Platform](https://img.shields.io/cocoapods/p/JCTagListView.svg?style=flat)](https://cocoapods.org/pods/JCTagListView) 7 | 8 | 9 | 10 | 11 | 12 | ## Example 13 | 14 | To run the example project, clone the repo, and run `pod install` from the Example directory first. 15 | 16 | ## Installation 17 | 18 | JCTagListView is available through [CocoaPods](https://cocoapods.org). To install 19 | it, simply add the following line to your Podfile: 20 | 21 | ```ruby 22 | pod 'JCTagListView', '2.0.0' 23 | ``` 24 | 25 | ## Usage 26 | 27 | ```objc 28 | IB_DESIGNABLE 29 | @interface JCTagListView : UIView 30 | 31 | @property (nonatomic, assign) IBInspectable CGFloat tagItemSpacing; // default: 10 32 | @property (nonatomic, assign) IBInspectable CGFloat tagLineSpacing; // default: 10 33 | @property (nonatomic, assign) IBInspectable CGFloat tagCornerRadius; // default: 10 34 | @property (nonatomic, assign) IBInspectable CGFloat tagBorderWidth; // default: 0.5 35 | 36 | @property (nonatomic, assign) UIEdgeInsets tagContentInset; // default: 5、 10、 5、 10 37 | 38 | @property (nonatomic, strong) UIColor *tagBorderColor; // default: lightGrayColor 39 | @property (nonatomic, strong) UIColor *tagSelectedBorderColor; // default: lightGrayColor 40 | @property (nonatomic, strong) UIColor *tagTextColor; // default: darkGrayColor 41 | @property (nonatomic, strong) UIColor *tagSelectedTextColor; // default: darkGrayColor 42 | @property (nonatomic, strong) UIColor *tagBackgroundColor; // default: whiteColor 43 | @property (nonatomic, strong) UIColor *tagSelectedBackgroundColor; // default: rgb(217,217,217) 44 | 45 | @property (nonatomic, assign) BOOL supportSelected; // default: NO 46 | @property (nonatomic, assign) BOOL supportMultipleSelected; // default: NO 47 | 48 | @property (nonatomic, strong) UIFont *tagFont; // default: [UIFont systemFontOfSize:14.0f] 49 | 50 | @property (nonatomic, strong) NSArray *tags; 51 | @property (nonatomic, strong) NSMutableArray *selectedTags; 52 | @property (nonatomic, strong, readonly) NSMutableArray *selectedTagsIndex; // selected result 53 | 54 | @property (nonatomic, assign, readonly) CGFloat contentHeight; // Used to calculate the height 55 | 56 | - (void)didSelectItem:(JCTagListViewBlock)block; 57 | 58 | - (void)reloadData; 59 | 60 | @end 61 | ``` 62 | 63 | ## Author 64 | 65 | 李京城 66 | 67 | ## License 68 | 69 | JCTagListView is available under the MIT license. See the LICENSE file for more info. 70 | -------------------------------------------------------------------------------- /JCTagListView/Classes/JCTagListViewFlowLayout.m: -------------------------------------------------------------------------------- 1 | // 2 | // JCTagListViewFlowLayout.m 3 | // JCTagListView 4 | // 5 | // Created by 李京城 on 2018/9/25. 6 | // 7 | 8 | #import "JCTagListViewFlowLayout.h" 9 | 10 | @interface JCTagListViewFlowLayout() 11 | 12 | @property (nonatomic, weak) id delegate; 13 | 14 | @property (nonatomic, strong) NSMutableArray *itemAttributes; 15 | 16 | @property (nonatomic, assign) CGFloat contentHeight; 17 | 18 | @end 19 | 20 | @implementation JCTagListViewFlowLayout 21 | 22 | - (id)init { 23 | if (self = [super init]) { 24 | [self setup]; 25 | } 26 | 27 | return self; 28 | } 29 | 30 | - (id)initWithCoder:(NSCoder *)aDecoder { 31 | if (self = [super initWithCoder:aDecoder]) { 32 | [self setup]; 33 | } 34 | 35 | return self; 36 | } 37 | 38 | - (void)setup { 39 | _itemAttributes = [NSMutableArray array]; 40 | } 41 | 42 | #pragma mark - 43 | 44 | - (void)prepareLayout { 45 | [self.itemAttributes removeAllObjects]; 46 | 47 | self.contentHeight = 0; 48 | 49 | CGFloat originX = 0; 50 | CGFloat originY = 0; 51 | 52 | NSInteger itemCount = [self.collectionView numberOfItemsInSection:0]; 53 | 54 | for (NSInteger i = 0; i < itemCount; i++) { 55 | NSIndexPath *indexPath = [NSIndexPath indexPathForItem:i inSection:0]; 56 | 57 | CGSize itemSize = [self.delegate collectionView:self.collectionView layout:self sizeForItemAtIndexPath:indexPath]; 58 | 59 | if ( i == 0) { 60 | self.contentHeight += itemSize.height; 61 | } 62 | 63 | if ((originX + itemSize.width) > self.collectionView.frame.size.width) { 64 | originX = 0; 65 | originY += (self.minimumLineSpacing + itemSize.height); 66 | 67 | self.contentHeight += (self.minimumLineSpacing + itemSize.height); 68 | } 69 | 70 | UICollectionViewLayoutAttributes *attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath]; 71 | attributes.frame = CGRectMake(originX, originY, itemSize.width, itemSize.height); 72 | [self.itemAttributes addObject:attributes]; 73 | 74 | originX += (self.minimumInteritemSpacing + itemSize.width); 75 | } 76 | } 77 | 78 | - (CGSize)collectionViewContentSize { 79 | return CGSizeMake(self.collectionView.frame.size.width, self.contentHeight); 80 | } 81 | 82 | - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect { 83 | return self.itemAttributes; 84 | } 85 | 86 | - (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds { 87 | CGRect oldBounds = self.collectionView.bounds; 88 | 89 | if (CGRectGetWidth(newBounds) != CGRectGetWidth(oldBounds)) { 90 | return YES; 91 | } 92 | 93 | return NO; 94 | } 95 | 96 | #pragma mark - 97 | 98 | - (id)delegate { 99 | if (!_delegate) { 100 | _delegate = (id)self.collectionView.delegate; 101 | } 102 | 103 | return _delegate; 104 | } 105 | 106 | @end 107 | -------------------------------------------------------------------------------- /Example/JCTagListView.xcodeproj/xcshareddata/xcschemes/JCTagListView-Example.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 | 66 | 72 | 73 | 74 | 75 | 76 | 77 | 83 | 85 | 91 | 92 | 93 | 94 | 96 | 97 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-JCTagListView_Example/Pods-JCTagListView_Example-resources.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then 7 | # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy 8 | # resources to, so exit 0 (signalling the script phase was successful). 9 | exit 0 10 | fi 11 | 12 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 13 | 14 | RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt 15 | > "$RESOURCES_TO_COPY" 16 | 17 | XCASSET_FILES=() 18 | 19 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 20 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 21 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 22 | 23 | case "${TARGETED_DEVICE_FAMILY:-}" in 24 | 1,2) 25 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" 26 | ;; 27 | 1) 28 | TARGET_DEVICE_ARGS="--target-device iphone" 29 | ;; 30 | 2) 31 | TARGET_DEVICE_ARGS="--target-device ipad" 32 | ;; 33 | 3) 34 | TARGET_DEVICE_ARGS="--target-device tv" 35 | ;; 36 | 4) 37 | TARGET_DEVICE_ARGS="--target-device watch" 38 | ;; 39 | *) 40 | TARGET_DEVICE_ARGS="--target-device mac" 41 | ;; 42 | esac 43 | 44 | install_resource() 45 | { 46 | if [[ "$1" = /* ]] ; then 47 | RESOURCE_PATH="$1" 48 | else 49 | RESOURCE_PATH="${PODS_ROOT}/$1" 50 | fi 51 | if [[ ! -e "$RESOURCE_PATH" ]] ; then 52 | cat << EOM 53 | error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. 54 | EOM 55 | exit 1 56 | fi 57 | case $RESOURCE_PATH in 58 | *.storyboard) 59 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true 60 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 61 | ;; 62 | *.xib) 63 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true 64 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 65 | ;; 66 | *.framework) 67 | echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true 68 | mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 69 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true 70 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 71 | ;; 72 | *.xcdatamodel) 73 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true 74 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" 75 | ;; 76 | *.xcdatamodeld) 77 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true 78 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" 79 | ;; 80 | *.xcmappingmodel) 81 | echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true 82 | xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" 83 | ;; 84 | *.xcassets) 85 | ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" 86 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") 87 | ;; 88 | *) 89 | echo "$RESOURCE_PATH" || true 90 | echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" 91 | ;; 92 | esac 93 | } 94 | 95 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 96 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 97 | if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then 98 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 99 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 100 | fi 101 | rm -f "$RESOURCES_TO_COPY" 102 | 103 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ] 104 | then 105 | # Find all other xcassets (this unfortunately includes those of path pods and other targets). 106 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) 107 | while read line; do 108 | if [[ $line != "${PODS_ROOT}*" ]]; then 109 | XCASSET_FILES+=("$line") 110 | fi 111 | done <<<"$OTHER_XCASSETS" 112 | 113 | if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then 114 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 115 | else 116 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_TEMP_DIR}/assetcatalog_generated_info_cocoapods.plist" 117 | fi 118 | fi 119 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-JCTagListView_Example/Pods-JCTagListView_Example-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then 7 | # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy 8 | # frameworks to, so exit 0 (signalling the script phase was successful). 9 | exit 0 10 | fi 11 | 12 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 13 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 14 | 15 | COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" 16 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 17 | 18 | # Used as a return value for each invocation of `strip_invalid_archs` function. 19 | STRIP_BINARY_RETVAL=0 20 | 21 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 22 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 23 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 24 | 25 | # Copies and strips a vendored framework 26 | install_framework() 27 | { 28 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 29 | local source="${BUILT_PRODUCTS_DIR}/$1" 30 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 31 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 32 | elif [ -r "$1" ]; then 33 | local source="$1" 34 | fi 35 | 36 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 37 | 38 | if [ -L "${source}" ]; then 39 | echo "Symlinked..." 40 | source="$(readlink "${source}")" 41 | fi 42 | 43 | # Use filter instead of exclude so missing patterns don't throw errors. 44 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 45 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 46 | 47 | local basename 48 | basename="$(basename -s .framework "$1")" 49 | binary="${destination}/${basename}.framework/${basename}" 50 | if ! [ -r "$binary" ]; then 51 | binary="${destination}/${basename}" 52 | fi 53 | 54 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 55 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 56 | strip_invalid_archs "$binary" 57 | fi 58 | 59 | # Resign the code if required by the build settings to avoid unstable apps 60 | code_sign_if_enabled "${destination}/$(basename "$1")" 61 | 62 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 63 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 64 | local swift_runtime_libs 65 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) 66 | for lib in $swift_runtime_libs; do 67 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 68 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 69 | code_sign_if_enabled "${destination}/${lib}" 70 | done 71 | fi 72 | } 73 | 74 | # Copies and strips a vendored dSYM 75 | install_dsym() { 76 | local source="$1" 77 | if [ -r "$source" ]; then 78 | # Copy the dSYM into a the targets temp dir. 79 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" 80 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" 81 | 82 | local basename 83 | basename="$(basename -s .framework.dSYM "$source")" 84 | binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" 85 | 86 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 87 | if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then 88 | strip_invalid_archs "$binary" 89 | fi 90 | 91 | if [[ $STRIP_BINARY_RETVAL == 1 ]]; then 92 | # Move the stripped file into its final destination. 93 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" 94 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}" 95 | else 96 | # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. 97 | touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" 98 | fi 99 | fi 100 | } 101 | 102 | # Signs a framework with the provided identity 103 | code_sign_if_enabled() { 104 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 105 | # Use the current code_sign_identitiy 106 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 107 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" 108 | 109 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 110 | code_sign_cmd="$code_sign_cmd &" 111 | fi 112 | echo "$code_sign_cmd" 113 | eval "$code_sign_cmd" 114 | fi 115 | } 116 | 117 | # Strip invalid architectures 118 | strip_invalid_archs() { 119 | binary="$1" 120 | # Get architectures for current target binary 121 | binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" 122 | # Intersect them with the architectures we are building for 123 | intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" 124 | # If there are no archs supported by this binary then warn the user 125 | if [[ -z "$intersected_archs" ]]; then 126 | echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." 127 | STRIP_BINARY_RETVAL=0 128 | return 129 | fi 130 | stripped="" 131 | for arch in $binary_archs; do 132 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then 133 | # Strip non-valid architectures in-place 134 | lipo -remove "$arch" -output "$binary" "$binary" || exit 1 135 | stripped="$stripped $arch" 136 | fi 137 | done 138 | if [[ "$stripped" ]]; then 139 | echo "Stripped $binary of architectures:$stripped" 140 | fi 141 | STRIP_BINARY_RETVAL=1 142 | } 143 | 144 | 145 | if [[ "$CONFIGURATION" == "Debug" ]]; then 146 | install_framework "${BUILT_PRODUCTS_DIR}/JCTagListView/JCTagListView.framework" 147 | fi 148 | if [[ "$CONFIGURATION" == "Release" ]]; then 149 | install_framework "${BUILT_PRODUCTS_DIR}/JCTagListView/JCTagListView.framework" 150 | fi 151 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 152 | wait 153 | fi 154 | -------------------------------------------------------------------------------- /JCTagListView/Classes/JCTagListView.m: -------------------------------------------------------------------------------- 1 | // 2 | // JCTagListView.m 3 | // JCTagListView 4 | // 5 | // Created by 李京城 on 15/7/3. 6 | // Copyright (c) 2015年 李京城. All rights reserved. 7 | // 8 | 9 | #import "JCTagListView.h" 10 | #import "JCTagCell.h" 11 | #import "JCTagListViewFlowLayout.h" 12 | 13 | @interface JCTagListView () 14 | 15 | @property (nonatomic, strong) UICollectionView *collectionView; 16 | 17 | @property (nonatomic, strong) UILabel *testLabel; // Used to calculate text height 18 | 19 | @property (nonatomic, copy) JCTagListViewBlock selectedBlock; 20 | 21 | @end 22 | 23 | @implementation JCTagListView 24 | 25 | static NSString * const reuseIdentifier = @"tagListViewItemId"; 26 | 27 | - (id)initWithFrame:(CGRect)frame { 28 | if (self = [super initWithFrame:frame]) { 29 | [self setup]; 30 | } 31 | 32 | return self; 33 | } 34 | 35 | - (id)initWithCoder:(NSCoder *)aDecoder { 36 | if (self = [super initWithCoder:aDecoder]) { 37 | [self setup]; 38 | } 39 | 40 | return self; 41 | } 42 | 43 | - (void)layoutSubviews { 44 | [super layoutSubviews]; 45 | 46 | self.collectionView.frame = self.bounds; 47 | } 48 | 49 | - (void)setup { 50 | _tags = [NSMutableArray array]; 51 | _selectedTags = [NSMutableArray array]; 52 | _selectedTagsIndex = [NSMutableArray array]; 53 | 54 | _tagItemSpacing = 10.0f; 55 | _tagLineSpacing = 10.0f; 56 | _tagCornerRadius = 10.0f; 57 | _tagBorderWidth = 0.5f; 58 | _tagContentInset = UIEdgeInsetsMake(5, 10, 5, 10); 59 | 60 | _tagBorderColor = [UIColor lightGrayColor]; 61 | _tagSelectedBorderColor = [UIColor lightGrayColor]; 62 | _tagTextColor = [UIColor darkGrayColor]; 63 | _tagSelectedTextColor = [UIColor darkGrayColor]; 64 | _tagBackgroundColor = [UIColor whiteColor]; 65 | _tagSelectedBackgroundColor = [UIColor colorWithRed:217/255.0f green:217/255.0f blue:217/255.0f alpha:1]; 66 | 67 | _supportSelected = NO; 68 | _supportMultipleSelected = NO; 69 | 70 | _tagFont = [UIFont systemFontOfSize:14.0]; 71 | 72 | [self addSubview:self.collectionView]; 73 | } 74 | 75 | #pragma mark - public method 76 | 77 | - (void)didSelectItem:(JCTagListViewBlock)block { 78 | self.selectedBlock = block; 79 | } 80 | 81 | - (void)reloadData { 82 | [_selectedTagsIndex removeAllObjects]; 83 | 84 | [self.collectionView reloadData]; 85 | } 86 | 87 | #pragma mark - UICollectionViewDelegate | UICollectionViewDataSource 88 | 89 | - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { 90 | return self.tags.count; 91 | } 92 | 93 | - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { 94 | return [self textContentSize:self.tags[indexPath.item]]; 95 | } 96 | 97 | - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 98 | JCTagCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath]; 99 | cell.layer.cornerRadius = self.tagCornerRadius; 100 | cell.layer.borderWidth = self.tagBorderWidth; 101 | 102 | cell.contentInset = self.tagContentInset; 103 | 104 | cell.textLabel.text = self.tags[indexPath.item]; 105 | cell.textLabel.font = self.tagFont; 106 | 107 | if (self.supportSelected && [self.selectedTags containsObject:self.tags[indexPath.item]]) { 108 | cell.layer.borderColor = self.tagSelectedBorderColor.CGColor; 109 | cell.textLabel.textColor = self.tagSelectedTextColor; 110 | cell.layer.backgroundColor = self.tagSelectedBackgroundColor.CGColor; 111 | 112 | [_selectedTagsIndex addObject:@(indexPath.item)]; 113 | } else { 114 | cell.layer.borderColor = self.tagBorderColor.CGColor; 115 | cell.textLabel.textColor = self.tagTextColor; 116 | cell.layer.backgroundColor = self.tagBackgroundColor.CGColor; 117 | } 118 | 119 | return cell; 120 | } 121 | 122 | - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { 123 | if (self.supportSelected) { 124 | if (self.supportMultipleSelected) { 125 | if ([self.selectedTags containsObject:self.tags[indexPath.item]]) { 126 | [self.selectedTags removeObject:self.tags[indexPath.item]]; 127 | } else { 128 | [self.selectedTags addObject:self.tags[indexPath.item]]; 129 | } 130 | } else { 131 | self.selectedTags = @[self.tags[indexPath.item]].mutableCopy; 132 | } 133 | 134 | [self reloadData]; 135 | 136 | if (self.selectedBlock) { 137 | self.selectedBlock(indexPath.item); 138 | } 139 | } 140 | } 141 | 142 | #pragma mark - setter/getter 143 | 144 | - (UICollectionView *)collectionView { 145 | if (!_collectionView) { 146 | JCTagListViewFlowLayout *layout = [[JCTagListViewFlowLayout alloc] init]; 147 | layout.minimumInteritemSpacing = self.tagItemSpacing; 148 | layout.minimumLineSpacing = self.tagLineSpacing; 149 | 150 | _collectionView = [[UICollectionView alloc] initWithFrame:self.bounds collectionViewLayout:layout]; 151 | _collectionView.delegate = self; 152 | _collectionView.dataSource = self; 153 | _collectionView.scrollEnabled = NO; 154 | _collectionView.showsHorizontalScrollIndicator = NO; 155 | _collectionView.showsVerticalScrollIndicator = NO; 156 | _collectionView.backgroundColor = self.backgroundColor; 157 | [_collectionView registerClass:[JCTagCell class] forCellWithReuseIdentifier:reuseIdentifier]; 158 | } 159 | 160 | return _collectionView; 161 | } 162 | 163 | - (UILabel *)testLabel { 164 | if (!_testLabel) { 165 | _testLabel = [[UILabel alloc] initWithFrame:CGRectZero]; 166 | } 167 | 168 | return _testLabel; 169 | } 170 | 171 | - (void)setTags:(NSMutableArray *)tags { 172 | _tags = tags; 173 | 174 | [self reloadData]; 175 | } 176 | 177 | - (void)setSelectedTags:(NSMutableArray *)selectedTags { 178 | _selectedTags = selectedTags; 179 | 180 | [self reloadData]; 181 | } 182 | 183 | - (void)setTagItemSpacing:(CGFloat)tagItemSpacing { 184 | _tagItemSpacing = tagItemSpacing; 185 | 186 | JCTagListViewFlowLayout *layout = (JCTagListViewFlowLayout *)self.collectionView.collectionViewLayout; 187 | layout.minimumInteritemSpacing = tagItemSpacing; 188 | } 189 | 190 | - (void)setTagLineSpacing:(CGFloat)tagLineSpacing { 191 | _tagLineSpacing = tagLineSpacing; 192 | 193 | JCTagListViewFlowLayout *layout = (JCTagListViewFlowLayout *)self.collectionView.collectionViewLayout; 194 | layout.minimumLineSpacing = tagLineSpacing; 195 | } 196 | 197 | - (CGFloat)contentHeight { 198 | CGFloat contentHeight = 0; 199 | 200 | CGFloat originX = 0; 201 | CGFloat originY = 0; 202 | 203 | for (NSInteger i = 0; i < self.tags.count; i++) { 204 | CGSize itemSize = [self textContentSize:self.tags[i]]; 205 | 206 | if ( i == 0) { 207 | contentHeight += itemSize.height; 208 | } 209 | 210 | if ((originX + itemSize.width) > self.collectionView.frame.size.width) { 211 | originX = 0; 212 | originY += (self.tagLineSpacing + itemSize.height); 213 | 214 | contentHeight += (self.tagLineSpacing + itemSize.height); 215 | } 216 | 217 | originX += (self.tagItemSpacing + itemSize.width); 218 | } 219 | 220 | return contentHeight; 221 | } 222 | 223 | #pragma mark - private method 224 | 225 | - (CGSize)textContentSize:(NSString *)text { 226 | self.testLabel.font = self.tagFont; 227 | self.testLabel.text = text; 228 | [self.testLabel sizeToFit]; 229 | 230 | CGFloat labelWidth = MIN(self.collectionView.frame.size.width - self.tagContentInset.left - self.tagContentInset.right, ceil(self.testLabel.frame.size.width)); 231 | 232 | return CGSizeMake(labelWidth + self.tagContentInset.left + self.tagContentInset.right , ceil(self.testLabel.frame.size.height) + self.tagContentInset.top + self.tagContentInset.bottom); 233 | } 234 | 235 | @end 236 | -------------------------------------------------------------------------------- /Example/JCTagListView/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 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | -------------------------------------------------------------------------------- /Example/JCTagListView.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 5EBADE2D2A9DE0DE1F286C77 /* Pods_JCTagListView_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AC93BBB4F3CEC6AB4AD2F58E /* Pods_JCTagListView_Example.framework */; }; 11 | 6003F58E195388D20070C39A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58D195388D20070C39A /* Foundation.framework */; }; 12 | 6003F590195388D20070C39A /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58F195388D20070C39A /* CoreGraphics.framework */; }; 13 | 6003F592195388D20070C39A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F591195388D20070C39A /* UIKit.framework */; }; 14 | 6003F598195388D20070C39A /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6003F596195388D20070C39A /* InfoPlist.strings */; }; 15 | 6003F59A195388D20070C39A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F599195388D20070C39A /* main.m */; }; 16 | 6003F59E195388D20070C39A /* JCAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F59D195388D20070C39A /* JCAppDelegate.m */; }; 17 | 6003F5A7195388D20070C39A /* JCViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F5A6195388D20070C39A /* JCViewController.m */; }; 18 | 6003F5A9195388D20070C39A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6003F5A8195388D20070C39A /* Images.xcassets */; }; 19 | 6003F5B0195388D20070C39A /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F5AF195388D20070C39A /* XCTest.framework */; }; 20 | 6003F5B1195388D20070C39A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58D195388D20070C39A /* Foundation.framework */; }; 21 | 6003F5B2195388D20070C39A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F591195388D20070C39A /* UIKit.framework */; }; 22 | 6003F5BA195388D20070C39A /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6003F5B8195388D20070C39A /* InfoPlist.strings */; }; 23 | 6003F5BC195388D20070C39A /* Tests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F5BB195388D20070C39A /* Tests.m */; }; 24 | 71719F9F1E33DC2100824A3D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 71719F9D1E33DC2100824A3D /* LaunchScreen.storyboard */; }; 25 | F30A848D215CE8E800ED8C59 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F30A848C215CE8E800ED8C59 /* Main.storyboard */; }; 26 | F30F406B215B823C006FC621 /* JCTagListView.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F30F406A215B823C006FC621 /* JCTagListView.framework */; }; 27 | F37FC7C2215A4D6900CD6447 /* JCTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F37FC7C1215A4D6900CD6447 /* JCTableViewController.m */; }; 28 | /* End PBXBuildFile section */ 29 | 30 | /* Begin PBXContainerItemProxy section */ 31 | 6003F5B3195388D20070C39A /* PBXContainerItemProxy */ = { 32 | isa = PBXContainerItemProxy; 33 | containerPortal = 6003F582195388D10070C39A /* Project object */; 34 | proxyType = 1; 35 | remoteGlobalIDString = 6003F589195388D20070C39A; 36 | remoteInfo = JCTagListView; 37 | }; 38 | /* End PBXContainerItemProxy section */ 39 | 40 | /* Begin PBXFileReference section */ 41 | 48DF1CD4B8FD8B29662949F6 /* Pods-JCTagListView_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JCTagListView_Example.debug.xcconfig"; path = "Pods/Target Support Files/Pods-JCTagListView_Example/Pods-JCTagListView_Example.debug.xcconfig"; sourceTree = ""; }; 42 | 528E2B56ACB876F8E1D49A95 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; 43 | 6003F58A195388D20070C39A /* JCTagListView_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = JCTagListView_Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 44 | 6003F58D195388D20070C39A /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 45 | 6003F58F195388D20070C39A /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 46 | 6003F591195388D20070C39A /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 47 | 6003F595195388D20070C39A /* JCTagListView-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "JCTagListView-Info.plist"; sourceTree = ""; }; 48 | 6003F597195388D20070C39A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 49 | 6003F599195388D20070C39A /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 50 | 6003F59B195388D20070C39A /* JCTagListView-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "JCTagListView-Prefix.pch"; sourceTree = ""; }; 51 | 6003F59C195388D20070C39A /* JCAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JCAppDelegate.h; sourceTree = ""; }; 52 | 6003F59D195388D20070C39A /* JCAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = JCAppDelegate.m; sourceTree = ""; }; 53 | 6003F5A5195388D20070C39A /* JCViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JCViewController.h; sourceTree = ""; }; 54 | 6003F5A6195388D20070C39A /* JCViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = JCViewController.m; sourceTree = ""; }; 55 | 6003F5A8195388D20070C39A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 56 | 6003F5AE195388D20070C39A /* JCTagListView_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = JCTagListView_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 57 | 6003F5AF195388D20070C39A /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 58 | 6003F5B7195388D20070C39A /* Tests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Tests-Info.plist"; sourceTree = ""; }; 59 | 6003F5B9195388D20070C39A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 60 | 6003F5BB195388D20070C39A /* Tests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Tests.m; sourceTree = ""; }; 61 | 606FC2411953D9B200FFA9A0 /* Tests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Tests-Prefix.pch"; sourceTree = ""; }; 62 | 71719F9E1E33DC2100824A3D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 63 | 8DCB1E289900798FAF3E3906 /* Pods-JCTagListView_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JCTagListView_Example.release.xcconfig"; path = "Pods/Target Support Files/Pods-JCTagListView_Example/Pods-JCTagListView_Example.release.xcconfig"; sourceTree = ""; }; 64 | 915F4C71D56AC0F5C4939591 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; 65 | 9509843C489F5CE513643D16 /* Pods_JCTagListView_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_JCTagListView_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 66 | A7FA5BB9EA6E9BE5A3C9B486 /* JCTagListView.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = JCTagListView.podspec; path = ../JCTagListView.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 67 | AC93BBB4F3CEC6AB4AD2F58E /* Pods_JCTagListView_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_JCTagListView_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 68 | F30A848C215CE8E800ED8C59 /* Main.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = ""; }; 69 | F30F406A215B823C006FC621 /* JCTagListView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = JCTagListView.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 70 | F37FC7C0215A4D6900CD6447 /* JCTableViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JCTableViewController.h; sourceTree = ""; }; 71 | F37FC7C1215A4D6900CD6447 /* JCTableViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = JCTableViewController.m; sourceTree = ""; }; 72 | /* End PBXFileReference section */ 73 | 74 | /* Begin PBXFrameworksBuildPhase section */ 75 | 6003F587195388D20070C39A /* Frameworks */ = { 76 | isa = PBXFrameworksBuildPhase; 77 | buildActionMask = 2147483647; 78 | files = ( 79 | F30F406B215B823C006FC621 /* JCTagListView.framework in Frameworks */, 80 | 6003F590195388D20070C39A /* CoreGraphics.framework in Frameworks */, 81 | 6003F592195388D20070C39A /* UIKit.framework in Frameworks */, 82 | 6003F58E195388D20070C39A /* Foundation.framework in Frameworks */, 83 | 5EBADE2D2A9DE0DE1F286C77 /* Pods_JCTagListView_Example.framework in Frameworks */, 84 | ); 85 | runOnlyForDeploymentPostprocessing = 0; 86 | }; 87 | 6003F5AB195388D20070C39A /* Frameworks */ = { 88 | isa = PBXFrameworksBuildPhase; 89 | buildActionMask = 2147483647; 90 | files = ( 91 | 6003F5B0195388D20070C39A /* XCTest.framework in Frameworks */, 92 | 6003F5B2195388D20070C39A /* UIKit.framework in Frameworks */, 93 | 6003F5B1195388D20070C39A /* Foundation.framework in Frameworks */, 94 | ); 95 | runOnlyForDeploymentPostprocessing = 0; 96 | }; 97 | /* End PBXFrameworksBuildPhase section */ 98 | 99 | /* Begin PBXGroup section */ 100 | 6003F581195388D10070C39A = { 101 | isa = PBXGroup; 102 | children = ( 103 | 60FF7A9C1954A5C5007DD14C /* Podspec Metadata */, 104 | 6003F593195388D20070C39A /* Example for JCTagListView */, 105 | 6003F5B5195388D20070C39A /* Tests */, 106 | 6003F58C195388D20070C39A /* Frameworks */, 107 | 6003F58B195388D20070C39A /* Products */, 108 | 99326099C11A7DD27137E58C /* Pods */, 109 | ); 110 | sourceTree = ""; 111 | }; 112 | 6003F58B195388D20070C39A /* Products */ = { 113 | isa = PBXGroup; 114 | children = ( 115 | 6003F58A195388D20070C39A /* JCTagListView_Example.app */, 116 | 6003F5AE195388D20070C39A /* JCTagListView_Tests.xctest */, 117 | ); 118 | name = Products; 119 | sourceTree = ""; 120 | }; 121 | 6003F58C195388D20070C39A /* Frameworks */ = { 122 | isa = PBXGroup; 123 | children = ( 124 | F30F406A215B823C006FC621 /* JCTagListView.framework */, 125 | 6003F58D195388D20070C39A /* Foundation.framework */, 126 | 6003F58F195388D20070C39A /* CoreGraphics.framework */, 127 | 6003F591195388D20070C39A /* UIKit.framework */, 128 | 6003F5AF195388D20070C39A /* XCTest.framework */, 129 | 9509843C489F5CE513643D16 /* Pods_JCTagListView_Tests.framework */, 130 | AC93BBB4F3CEC6AB4AD2F58E /* Pods_JCTagListView_Example.framework */, 131 | ); 132 | name = Frameworks; 133 | sourceTree = ""; 134 | }; 135 | 6003F593195388D20070C39A /* Example for JCTagListView */ = { 136 | isa = PBXGroup; 137 | children = ( 138 | F30A848C215CE8E800ED8C59 /* Main.storyboard */, 139 | 6003F5A5195388D20070C39A /* JCViewController.h */, 140 | 6003F5A6195388D20070C39A /* JCViewController.m */, 141 | F37FC7C0215A4D6900CD6447 /* JCTableViewController.h */, 142 | F37FC7C1215A4D6900CD6447 /* JCTableViewController.m */, 143 | 6003F594195388D20070C39A /* Supporting Files */, 144 | ); 145 | name = "Example for JCTagListView"; 146 | path = JCTagListView; 147 | sourceTree = ""; 148 | }; 149 | 6003F594195388D20070C39A /* Supporting Files */ = { 150 | isa = PBXGroup; 151 | children = ( 152 | 6003F59C195388D20070C39A /* JCAppDelegate.h */, 153 | 6003F59D195388D20070C39A /* JCAppDelegate.m */, 154 | 71719F9D1E33DC2100824A3D /* LaunchScreen.storyboard */, 155 | 6003F5A8195388D20070C39A /* Images.xcassets */, 156 | 6003F595195388D20070C39A /* JCTagListView-Info.plist */, 157 | 6003F59B195388D20070C39A /* JCTagListView-Prefix.pch */, 158 | 6003F596195388D20070C39A /* InfoPlist.strings */, 159 | 6003F599195388D20070C39A /* main.m */, 160 | ); 161 | name = "Supporting Files"; 162 | sourceTree = ""; 163 | }; 164 | 6003F5B5195388D20070C39A /* Tests */ = { 165 | isa = PBXGroup; 166 | children = ( 167 | 6003F5BB195388D20070C39A /* Tests.m */, 168 | 6003F5B6195388D20070C39A /* Supporting Files */, 169 | ); 170 | path = Tests; 171 | sourceTree = ""; 172 | }; 173 | 6003F5B6195388D20070C39A /* Supporting Files */ = { 174 | isa = PBXGroup; 175 | children = ( 176 | 6003F5B7195388D20070C39A /* Tests-Info.plist */, 177 | 6003F5B8195388D20070C39A /* InfoPlist.strings */, 178 | 606FC2411953D9B200FFA9A0 /* Tests-Prefix.pch */, 179 | ); 180 | name = "Supporting Files"; 181 | sourceTree = ""; 182 | }; 183 | 60FF7A9C1954A5C5007DD14C /* Podspec Metadata */ = { 184 | isa = PBXGroup; 185 | children = ( 186 | A7FA5BB9EA6E9BE5A3C9B486 /* JCTagListView.podspec */, 187 | 528E2B56ACB876F8E1D49A95 /* README.md */, 188 | 915F4C71D56AC0F5C4939591 /* LICENSE */, 189 | ); 190 | name = "Podspec Metadata"; 191 | sourceTree = ""; 192 | }; 193 | 99326099C11A7DD27137E58C /* Pods */ = { 194 | isa = PBXGroup; 195 | children = ( 196 | 48DF1CD4B8FD8B29662949F6 /* Pods-JCTagListView_Example.debug.xcconfig */, 197 | 8DCB1E289900798FAF3E3906 /* Pods-JCTagListView_Example.release.xcconfig */, 198 | ); 199 | name = Pods; 200 | sourceTree = ""; 201 | }; 202 | /* End PBXGroup section */ 203 | 204 | /* Begin PBXNativeTarget section */ 205 | 6003F589195388D20070C39A /* JCTagListView_Example */ = { 206 | isa = PBXNativeTarget; 207 | buildConfigurationList = 6003F5BF195388D20070C39A /* Build configuration list for PBXNativeTarget "JCTagListView_Example" */; 208 | buildPhases = ( 209 | 08C474E9460080281216A0CA /* [CP] Check Pods Manifest.lock */, 210 | 6003F586195388D20070C39A /* Sources */, 211 | 6003F587195388D20070C39A /* Frameworks */, 212 | 6003F588195388D20070C39A /* Resources */, 213 | F1F2515A3A7DA22477447E75 /* [CP] Embed Pods Frameworks */, 214 | ); 215 | buildRules = ( 216 | ); 217 | dependencies = ( 218 | ); 219 | name = JCTagListView_Example; 220 | productName = JCTagListView; 221 | productReference = 6003F58A195388D20070C39A /* JCTagListView_Example.app */; 222 | productType = "com.apple.product-type.application"; 223 | }; 224 | 6003F5AD195388D20070C39A /* JCTagListView_Tests */ = { 225 | isa = PBXNativeTarget; 226 | buildConfigurationList = 6003F5C2195388D20070C39A /* Build configuration list for PBXNativeTarget "JCTagListView_Tests" */; 227 | buildPhases = ( 228 | 6003F5AA195388D20070C39A /* Sources */, 229 | 6003F5AB195388D20070C39A /* Frameworks */, 230 | 6003F5AC195388D20070C39A /* Resources */, 231 | ); 232 | buildRules = ( 233 | ); 234 | dependencies = ( 235 | 6003F5B4195388D20070C39A /* PBXTargetDependency */, 236 | ); 237 | name = JCTagListView_Tests; 238 | productName = JCTagListViewTests; 239 | productReference = 6003F5AE195388D20070C39A /* JCTagListView_Tests.xctest */; 240 | productType = "com.apple.product-type.bundle.unit-test"; 241 | }; 242 | /* End PBXNativeTarget section */ 243 | 244 | /* Begin PBXProject section */ 245 | 6003F582195388D10070C39A /* Project object */ = { 246 | isa = PBXProject; 247 | attributes = { 248 | CLASSPREFIX = JC; 249 | LastUpgradeCheck = 1000; 250 | ORGANIZATIONNAME = lijingcheng; 251 | TargetAttributes = { 252 | 6003F589195388D20070C39A = { 253 | ProvisioningStyle = Manual; 254 | }; 255 | 6003F5AD195388D20070C39A = { 256 | TestTargetID = 6003F589195388D20070C39A; 257 | }; 258 | }; 259 | }; 260 | buildConfigurationList = 6003F585195388D10070C39A /* Build configuration list for PBXProject "JCTagListView" */; 261 | compatibilityVersion = "Xcode 3.2"; 262 | developmentRegion = English; 263 | hasScannedForEncodings = 0; 264 | knownRegions = ( 265 | en, 266 | Base, 267 | ); 268 | mainGroup = 6003F581195388D10070C39A; 269 | productRefGroup = 6003F58B195388D20070C39A /* Products */; 270 | projectDirPath = ""; 271 | projectRoot = ""; 272 | targets = ( 273 | 6003F589195388D20070C39A /* JCTagListView_Example */, 274 | 6003F5AD195388D20070C39A /* JCTagListView_Tests */, 275 | ); 276 | }; 277 | /* End PBXProject section */ 278 | 279 | /* Begin PBXResourcesBuildPhase section */ 280 | 6003F588195388D20070C39A /* Resources */ = { 281 | isa = PBXResourcesBuildPhase; 282 | buildActionMask = 2147483647; 283 | files = ( 284 | 71719F9F1E33DC2100824A3D /* LaunchScreen.storyboard in Resources */, 285 | 6003F5A9195388D20070C39A /* Images.xcassets in Resources */, 286 | 6003F598195388D20070C39A /* InfoPlist.strings in Resources */, 287 | F30A848D215CE8E800ED8C59 /* Main.storyboard in Resources */, 288 | ); 289 | runOnlyForDeploymentPostprocessing = 0; 290 | }; 291 | 6003F5AC195388D20070C39A /* Resources */ = { 292 | isa = PBXResourcesBuildPhase; 293 | buildActionMask = 2147483647; 294 | files = ( 295 | 6003F5BA195388D20070C39A /* InfoPlist.strings in Resources */, 296 | ); 297 | runOnlyForDeploymentPostprocessing = 0; 298 | }; 299 | /* End PBXResourcesBuildPhase section */ 300 | 301 | /* Begin PBXShellScriptBuildPhase section */ 302 | 08C474E9460080281216A0CA /* [CP] Check Pods Manifest.lock */ = { 303 | isa = PBXShellScriptBuildPhase; 304 | buildActionMask = 2147483647; 305 | files = ( 306 | ); 307 | inputPaths = ( 308 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 309 | "${PODS_ROOT}/Manifest.lock", 310 | ); 311 | name = "[CP] Check Pods Manifest.lock"; 312 | outputPaths = ( 313 | "$(DERIVED_FILE_DIR)/Pods-JCTagListView_Example-checkManifestLockResult.txt", 314 | ); 315 | runOnlyForDeploymentPostprocessing = 0; 316 | shellPath = /bin/sh; 317 | 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"; 318 | showEnvVarsInLog = 0; 319 | }; 320 | F1F2515A3A7DA22477447E75 /* [CP] Embed Pods Frameworks */ = { 321 | isa = PBXShellScriptBuildPhase; 322 | buildActionMask = 2147483647; 323 | files = ( 324 | ); 325 | inputPaths = ( 326 | "${SRCROOT}/Pods/Target Support Files/Pods-JCTagListView_Example/Pods-JCTagListView_Example-frameworks.sh", 327 | "${BUILT_PRODUCTS_DIR}/JCTagListView/JCTagListView.framework", 328 | ); 329 | name = "[CP] Embed Pods Frameworks"; 330 | outputPaths = ( 331 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/JCTagListView.framework", 332 | ); 333 | runOnlyForDeploymentPostprocessing = 0; 334 | shellPath = /bin/sh; 335 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-JCTagListView_Example/Pods-JCTagListView_Example-frameworks.sh\"\n"; 336 | showEnvVarsInLog = 0; 337 | }; 338 | /* End PBXShellScriptBuildPhase section */ 339 | 340 | /* Begin PBXSourcesBuildPhase section */ 341 | 6003F586195388D20070C39A /* Sources */ = { 342 | isa = PBXSourcesBuildPhase; 343 | buildActionMask = 2147483647; 344 | files = ( 345 | 6003F59E195388D20070C39A /* JCAppDelegate.m in Sources */, 346 | 6003F5A7195388D20070C39A /* JCViewController.m in Sources */, 347 | F37FC7C2215A4D6900CD6447 /* JCTableViewController.m in Sources */, 348 | 6003F59A195388D20070C39A /* main.m in Sources */, 349 | ); 350 | runOnlyForDeploymentPostprocessing = 0; 351 | }; 352 | 6003F5AA195388D20070C39A /* Sources */ = { 353 | isa = PBXSourcesBuildPhase; 354 | buildActionMask = 2147483647; 355 | files = ( 356 | 6003F5BC195388D20070C39A /* Tests.m in Sources */, 357 | ); 358 | runOnlyForDeploymentPostprocessing = 0; 359 | }; 360 | /* End PBXSourcesBuildPhase section */ 361 | 362 | /* Begin PBXTargetDependency section */ 363 | 6003F5B4195388D20070C39A /* PBXTargetDependency */ = { 364 | isa = PBXTargetDependency; 365 | target = 6003F589195388D20070C39A /* JCTagListView_Example */; 366 | targetProxy = 6003F5B3195388D20070C39A /* PBXContainerItemProxy */; 367 | }; 368 | /* End PBXTargetDependency section */ 369 | 370 | /* Begin PBXVariantGroup section */ 371 | 6003F596195388D20070C39A /* InfoPlist.strings */ = { 372 | isa = PBXVariantGroup; 373 | children = ( 374 | 6003F597195388D20070C39A /* en */, 375 | ); 376 | name = InfoPlist.strings; 377 | sourceTree = ""; 378 | }; 379 | 6003F5B8195388D20070C39A /* InfoPlist.strings */ = { 380 | isa = PBXVariantGroup; 381 | children = ( 382 | 6003F5B9195388D20070C39A /* en */, 383 | ); 384 | name = InfoPlist.strings; 385 | sourceTree = ""; 386 | }; 387 | 71719F9D1E33DC2100824A3D /* LaunchScreen.storyboard */ = { 388 | isa = PBXVariantGroup; 389 | children = ( 390 | 71719F9E1E33DC2100824A3D /* Base */, 391 | ); 392 | name = LaunchScreen.storyboard; 393 | sourceTree = ""; 394 | }; 395 | /* End PBXVariantGroup section */ 396 | 397 | /* Begin XCBuildConfiguration section */ 398 | 6003F5BD195388D20070C39A /* Debug */ = { 399 | isa = XCBuildConfiguration; 400 | buildSettings = { 401 | ALWAYS_SEARCH_USER_PATHS = NO; 402 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 403 | CLANG_CXX_LIBRARY = "libc++"; 404 | CLANG_ENABLE_MODULES = YES; 405 | CLANG_ENABLE_OBJC_ARC = YES; 406 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 407 | CLANG_WARN_BOOL_CONVERSION = YES; 408 | CLANG_WARN_COMMA = YES; 409 | CLANG_WARN_CONSTANT_CONVERSION = YES; 410 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 411 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 412 | CLANG_WARN_EMPTY_BODY = YES; 413 | CLANG_WARN_ENUM_CONVERSION = YES; 414 | CLANG_WARN_INFINITE_RECURSION = YES; 415 | CLANG_WARN_INT_CONVERSION = YES; 416 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 417 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 418 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 419 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 420 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 421 | CLANG_WARN_STRICT_PROTOTYPES = YES; 422 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 423 | CLANG_WARN_UNREACHABLE_CODE = YES; 424 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 425 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 426 | COPY_PHASE_STRIP = NO; 427 | ENABLE_STRICT_OBJC_MSGSEND = YES; 428 | ENABLE_TESTABILITY = YES; 429 | GCC_C_LANGUAGE_STANDARD = gnu99; 430 | GCC_DYNAMIC_NO_PIC = NO; 431 | GCC_NO_COMMON_BLOCKS = YES; 432 | GCC_OPTIMIZATION_LEVEL = 0; 433 | GCC_PREPROCESSOR_DEFINITIONS = ( 434 | "DEBUG=1", 435 | "$(inherited)", 436 | ); 437 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 438 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 439 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 440 | GCC_WARN_UNDECLARED_SELECTOR = YES; 441 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 442 | GCC_WARN_UNUSED_FUNCTION = YES; 443 | GCC_WARN_UNUSED_VARIABLE = YES; 444 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 445 | ONLY_ACTIVE_ARCH = YES; 446 | SDKROOT = iphoneos; 447 | TARGETED_DEVICE_FAMILY = "1,2"; 448 | }; 449 | name = Debug; 450 | }; 451 | 6003F5BE195388D20070C39A /* Release */ = { 452 | isa = XCBuildConfiguration; 453 | buildSettings = { 454 | ALWAYS_SEARCH_USER_PATHS = NO; 455 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 456 | CLANG_CXX_LIBRARY = "libc++"; 457 | CLANG_ENABLE_MODULES = YES; 458 | CLANG_ENABLE_OBJC_ARC = YES; 459 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 460 | CLANG_WARN_BOOL_CONVERSION = YES; 461 | CLANG_WARN_COMMA = YES; 462 | CLANG_WARN_CONSTANT_CONVERSION = YES; 463 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 464 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 465 | CLANG_WARN_EMPTY_BODY = YES; 466 | CLANG_WARN_ENUM_CONVERSION = YES; 467 | CLANG_WARN_INFINITE_RECURSION = YES; 468 | CLANG_WARN_INT_CONVERSION = YES; 469 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 470 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 471 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 472 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 473 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 474 | CLANG_WARN_STRICT_PROTOTYPES = YES; 475 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 476 | CLANG_WARN_UNREACHABLE_CODE = YES; 477 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 478 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 479 | COPY_PHASE_STRIP = YES; 480 | ENABLE_NS_ASSERTIONS = NO; 481 | ENABLE_STRICT_OBJC_MSGSEND = YES; 482 | GCC_C_LANGUAGE_STANDARD = gnu99; 483 | GCC_NO_COMMON_BLOCKS = YES; 484 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 485 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 486 | GCC_WARN_UNDECLARED_SELECTOR = YES; 487 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 488 | GCC_WARN_UNUSED_FUNCTION = YES; 489 | GCC_WARN_UNUSED_VARIABLE = YES; 490 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 491 | SDKROOT = iphoneos; 492 | TARGETED_DEVICE_FAMILY = "1,2"; 493 | VALIDATE_PRODUCT = YES; 494 | }; 495 | name = Release; 496 | }; 497 | 6003F5C0195388D20070C39A /* Debug */ = { 498 | isa = XCBuildConfiguration; 499 | baseConfigurationReference = 48DF1CD4B8FD8B29662949F6 /* Pods-JCTagListView_Example.debug.xcconfig */; 500 | buildSettings = { 501 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 502 | CODE_SIGN_STYLE = Manual; 503 | DEVELOPMENT_TEAM = ""; 504 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 505 | GCC_PREFIX_HEADER = "JCTagListView/JCTagListView-Prefix.pch"; 506 | INFOPLIST_FILE = "JCTagListView/JCTagListView-Info.plist"; 507 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 508 | MODULE_NAME = ExampleApp; 509 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; 510 | PRODUCT_NAME = "$(TARGET_NAME)"; 511 | PROVISIONING_PROFILE_SPECIFIER = ""; 512 | TARGETED_DEVICE_FAMILY = 1; 513 | WRAPPER_EXTENSION = app; 514 | }; 515 | name = Debug; 516 | }; 517 | 6003F5C1195388D20070C39A /* Release */ = { 518 | isa = XCBuildConfiguration; 519 | baseConfigurationReference = 8DCB1E289900798FAF3E3906 /* Pods-JCTagListView_Example.release.xcconfig */; 520 | buildSettings = { 521 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 522 | CODE_SIGN_STYLE = Manual; 523 | DEVELOPMENT_TEAM = ""; 524 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 525 | GCC_PREFIX_HEADER = "JCTagListView/JCTagListView-Prefix.pch"; 526 | INFOPLIST_FILE = "JCTagListView/JCTagListView-Info.plist"; 527 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 528 | MODULE_NAME = ExampleApp; 529 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; 530 | PRODUCT_NAME = "$(TARGET_NAME)"; 531 | PROVISIONING_PROFILE_SPECIFIER = ""; 532 | TARGETED_DEVICE_FAMILY = 1; 533 | WRAPPER_EXTENSION = app; 534 | }; 535 | name = Release; 536 | }; 537 | 6003F5C3195388D20070C39A /* Debug */ = { 538 | isa = XCBuildConfiguration; 539 | buildSettings = { 540 | BUNDLE_LOADER = "$(TEST_HOST)"; 541 | FRAMEWORK_SEARCH_PATHS = ( 542 | "$(SDKROOT)/Developer/Library/Frameworks", 543 | "$(inherited)", 544 | "$(DEVELOPER_FRAMEWORKS_DIR)", 545 | ); 546 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 547 | GCC_PREFIX_HEADER = "Tests/Tests-Prefix.pch"; 548 | GCC_PREPROCESSOR_DEFINITIONS = ( 549 | "DEBUG=1", 550 | "$(inherited)", 551 | ); 552 | INFOPLIST_FILE = "Tests/Tests-Info.plist"; 553 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; 554 | PRODUCT_NAME = "$(TARGET_NAME)"; 555 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/JCTagListView_Example.app/JCTagListView_Example"; 556 | WRAPPER_EXTENSION = xctest; 557 | }; 558 | name = Debug; 559 | }; 560 | 6003F5C4195388D20070C39A /* Release */ = { 561 | isa = XCBuildConfiguration; 562 | buildSettings = { 563 | BUNDLE_LOADER = "$(TEST_HOST)"; 564 | FRAMEWORK_SEARCH_PATHS = ( 565 | "$(SDKROOT)/Developer/Library/Frameworks", 566 | "$(inherited)", 567 | "$(DEVELOPER_FRAMEWORKS_DIR)", 568 | ); 569 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 570 | GCC_PREFIX_HEADER = "Tests/Tests-Prefix.pch"; 571 | INFOPLIST_FILE = "Tests/Tests-Info.plist"; 572 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; 573 | PRODUCT_NAME = "$(TARGET_NAME)"; 574 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/JCTagListView_Example.app/JCTagListView_Example"; 575 | WRAPPER_EXTENSION = xctest; 576 | }; 577 | name = Release; 578 | }; 579 | /* End XCBuildConfiguration section */ 580 | 581 | /* Begin XCConfigurationList section */ 582 | 6003F585195388D10070C39A /* Build configuration list for PBXProject "JCTagListView" */ = { 583 | isa = XCConfigurationList; 584 | buildConfigurations = ( 585 | 6003F5BD195388D20070C39A /* Debug */, 586 | 6003F5BE195388D20070C39A /* Release */, 587 | ); 588 | defaultConfigurationIsVisible = 0; 589 | defaultConfigurationName = Release; 590 | }; 591 | 6003F5BF195388D20070C39A /* Build configuration list for PBXNativeTarget "JCTagListView_Example" */ = { 592 | isa = XCConfigurationList; 593 | buildConfigurations = ( 594 | 6003F5C0195388D20070C39A /* Debug */, 595 | 6003F5C1195388D20070C39A /* Release */, 596 | ); 597 | defaultConfigurationIsVisible = 0; 598 | defaultConfigurationName = Release; 599 | }; 600 | 6003F5C2195388D20070C39A /* Build configuration list for PBXNativeTarget "JCTagListView_Tests" */ = { 601 | isa = XCConfigurationList; 602 | buildConfigurations = ( 603 | 6003F5C3195388D20070C39A /* Debug */, 604 | 6003F5C4195388D20070C39A /* Release */, 605 | ); 606 | defaultConfigurationIsVisible = 0; 607 | defaultConfigurationName = Release; 608 | }; 609 | /* End XCConfigurationList section */ 610 | }; 611 | rootObject = 6003F582195388D10070C39A /* Project object */; 612 | } 613 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 38A6D7670AC882F3ABCC29A42CE9F610 /* JCTagListView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = BE0D0CD38B8A831865D5970313F982BB /* JCTagListView-dummy.m */; }; 11 | 395D455A9D25844F910410EED258F273 /* JCTagListView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D5FA2FFBAF9A2B51A6C4129DCE65F6E /* JCTagListView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 12 | 4754F3FDCEE9194EEC08567A4C16336D /* JCTagListViewFlowLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 35C3412351DD3F0F4F99323AB665023E /* JCTagListViewFlowLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; 13 | 492C69D151C12FB59AA0B74F5068CDDC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6604A7D69453B4569E4E4827FB9155A9 /* Foundation.framework */; }; 14 | 553BC696916E660217649A9E0A8FE8A2 /* JCTagCell.h in Headers */ = {isa = PBXBuildFile; fileRef = BA4B7087672F41E4216AF2B8FC74A9A4 /* JCTagCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; 15 | A44C82A5DC1B1B579BD2AD1FD11C3CE2 /* Pods-JCTagListView_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 2CAFD9E8EB24CAA3C3E6C2682A97AEBC /* Pods-JCTagListView_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 16 | A9CC48F176D91D2EA376833D5D6C61DE /* JCTagCell.m in Sources */ = {isa = PBXBuildFile; fileRef = B9E6C80BF94A10C1B1A2918005749EE5 /* JCTagCell.m */; }; 17 | B1F9DB556BD5235CEDF02465B726ACAE /* Pods-JCTagListView_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 39E4671F88E47306D70821BB21F0972B /* Pods-JCTagListView_Example-dummy.m */; }; 18 | B5CC923B0F5083514D589D1CCDD3CB59 /* JCTagListView.h in Headers */ = {isa = PBXBuildFile; fileRef = 017BED53434ADB4A140A878FC28C43EA /* JCTagListView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 19 | ECC800CBA25B8CBDC23848E60AB91F24 /* JCTagListViewFlowLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = C660BC907F1526A455962B416052BBAD /* JCTagListViewFlowLayout.m */; }; 20 | F8691FAE544D717CD11F379D84E2A9C9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6604A7D69453B4569E4E4827FB9155A9 /* Foundation.framework */; }; 21 | FCC4D5BE30D75BD4CB2072059BBF668E /* JCTagListView.m in Sources */ = {isa = PBXBuildFile; fileRef = 350964841D08A8C30E2DC1FAEA349419 /* JCTagListView.m */; }; 22 | /* End PBXBuildFile section */ 23 | 24 | /* Begin PBXContainerItemProxy section */ 25 | 30F88F74F1FEEBE35C844AC73555F7D0 /* PBXContainerItemProxy */ = { 26 | isa = PBXContainerItemProxy; 27 | containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 28 | proxyType = 1; 29 | remoteGlobalIDString = 2987BF55D74109B00676F13EC5A055A0; 30 | remoteInfo = JCTagListView; 31 | }; 32 | /* End PBXContainerItemProxy section */ 33 | 34 | /* Begin PBXFileReference section */ 35 | 017BED53434ADB4A140A878FC28C43EA /* JCTagListView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = JCTagListView.h; path = JCTagListView/Classes/JCTagListView.h; sourceTree = ""; }; 36 | 02BD6E299A09D69D689EBB1336C7A6BB /* JCTagListView.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = JCTagListView.xcconfig; sourceTree = ""; }; 37 | 0B4E094E15512BC99D5ABF0EF49559BE /* Pods_JCTagListView_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_JCTagListView_Example.framework; path = "Pods-JCTagListView_Example.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 38 | 277A5FF442BB2E8D4909B603517DBCEA /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 39 | 2BE2D37F3BA63D47FCEC84859C2DDB60 /* Pods-JCTagListView_Example-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-JCTagListView_Example-resources.sh"; sourceTree = ""; }; 40 | 2CAFD9E8EB24CAA3C3E6C2682A97AEBC /* Pods-JCTagListView_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-JCTagListView_Example-umbrella.h"; sourceTree = ""; }; 41 | 350964841D08A8C30E2DC1FAEA349419 /* JCTagListView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = JCTagListView.m; path = JCTagListView/Classes/JCTagListView.m; sourceTree = ""; }; 42 | 35C3412351DD3F0F4F99323AB665023E /* JCTagListViewFlowLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = JCTagListViewFlowLayout.h; path = JCTagListView/Classes/JCTagListViewFlowLayout.h; sourceTree = ""; }; 43 | 39E4671F88E47306D70821BB21F0972B /* Pods-JCTagListView_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-JCTagListView_Example-dummy.m"; sourceTree = ""; }; 44 | 3D5FA2FFBAF9A2B51A6C4129DCE65F6E /* JCTagListView-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "JCTagListView-umbrella.h"; sourceTree = ""; }; 45 | 563188FC68007651834E1C9B256728A1 /* Pods-JCTagListView_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JCTagListView_Example.debug.xcconfig"; sourceTree = ""; }; 46 | 65EBECD791F192EF0B8ADB84E7A8FA2A /* Pods-JCTagListView_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-JCTagListView_Example.modulemap"; sourceTree = ""; }; 47 | 6604A7D69453B4569E4E4827FB9155A9 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 48 | 7963086929A7C64308A26E7170186CE6 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 49 | 7C377673638DF0F6C0C726416160C134 /* JCTagListView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = JCTagListView.framework; path = JCTagListView.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 50 | 8E312F3810E768925F0A178D4973AD3F /* Pods-JCTagListView_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JCTagListView_Example.release.xcconfig"; sourceTree = ""; }; 51 | 8E6ED3FE2D7E1633877629B5F265F683 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; 52 | 8EFE9289E5931BED772FC546D82AF419 /* JCTagListView.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; path = JCTagListView.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 53 | 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 54 | 98478425DD139A7AB5B42B307E54477D /* Pods-JCTagListView_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-JCTagListView_Example-frameworks.sh"; sourceTree = ""; }; 55 | B19C3D26BEE226FBA2BA304A568C5751 /* JCTagListView-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "JCTagListView-prefix.pch"; sourceTree = ""; }; 56 | B9E6C80BF94A10C1B1A2918005749EE5 /* JCTagCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = JCTagCell.m; path = JCTagListView/Classes/JCTagCell.m; sourceTree = ""; }; 57 | BA4B7087672F41E4216AF2B8FC74A9A4 /* JCTagCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = JCTagCell.h; path = JCTagListView/Classes/JCTagCell.h; sourceTree = ""; }; 58 | BE0D0CD38B8A831865D5970313F982BB /* JCTagListView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "JCTagListView-dummy.m"; sourceTree = ""; }; 59 | C13BE45C2B2BA967CE5BA0983A076F9F /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = ""; }; 60 | C660BC907F1526A455962B416052BBAD /* JCTagListViewFlowLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = JCTagListViewFlowLayout.m; path = JCTagListView/Classes/JCTagListViewFlowLayout.m; sourceTree = ""; }; 61 | D118B03FE44AF0550E3975DA84DCA1CC /* Pods-JCTagListView_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-JCTagListView_Example-acknowledgements.markdown"; sourceTree = ""; }; 62 | D15710B2093143643C7B6084FDD49D9D /* Pods-JCTagListView_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-JCTagListView_Example-acknowledgements.plist"; sourceTree = ""; }; 63 | DF8E6E38B628EF565E62EABF28E266AF /* JCTagListView.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = JCTagListView.modulemap; sourceTree = ""; }; 64 | /* End PBXFileReference section */ 65 | 66 | /* Begin PBXFrameworksBuildPhase section */ 67 | 82359864094C20B4E3BEF790813FAD15 /* Frameworks */ = { 68 | isa = PBXFrameworksBuildPhase; 69 | buildActionMask = 2147483647; 70 | files = ( 71 | 492C69D151C12FB59AA0B74F5068CDDC /* Foundation.framework in Frameworks */, 72 | ); 73 | runOnlyForDeploymentPostprocessing = 0; 74 | }; 75 | B6526BFF3B005399F1F9740A1BD56723 /* Frameworks */ = { 76 | isa = PBXFrameworksBuildPhase; 77 | buildActionMask = 2147483647; 78 | files = ( 79 | F8691FAE544D717CD11F379D84E2A9C9 /* Foundation.framework in Frameworks */, 80 | ); 81 | runOnlyForDeploymentPostprocessing = 0; 82 | }; 83 | /* End PBXFrameworksBuildPhase section */ 84 | 85 | /* Begin PBXGroup section */ 86 | 0B913F247DDD19701FD36296EC37796C /* Products */ = { 87 | isa = PBXGroup; 88 | children = ( 89 | 7C377673638DF0F6C0C726416160C134 /* JCTagListView.framework */, 90 | 0B4E094E15512BC99D5ABF0EF49559BE /* Pods_JCTagListView_Example.framework */, 91 | ); 92 | name = Products; 93 | sourceTree = ""; 94 | }; 95 | 393B0E22DD9B2ADB39DC8EB5001D0870 /* Targets Support Files */ = { 96 | isa = PBXGroup; 97 | children = ( 98 | 6D4D55678B0F6D0A387DCF7389207AF6 /* Pods-JCTagListView_Example */, 99 | ); 100 | name = "Targets Support Files"; 101 | sourceTree = ""; 102 | }; 103 | 4599AC514ED979CCDB8C2E087CB52AB2 /* Development Pods */ = { 104 | isa = PBXGroup; 105 | children = ( 106 | CE2062FE4B4C436FEBB8A42C5AC9122C /* JCTagListView */, 107 | ); 108 | name = "Development Pods"; 109 | sourceTree = ""; 110 | }; 111 | 4D49A3502369B4A32F50D85C8CFF6BFF /* Pod */ = { 112 | isa = PBXGroup; 113 | children = ( 114 | 8EFE9289E5931BED772FC546D82AF419 /* JCTagListView.podspec */, 115 | C13BE45C2B2BA967CE5BA0983A076F9F /* LICENSE */, 116 | 8E6ED3FE2D7E1633877629B5F265F683 /* README.md */, 117 | ); 118 | name = Pod; 119 | sourceTree = ""; 120 | }; 121 | 6D4D55678B0F6D0A387DCF7389207AF6 /* Pods-JCTagListView_Example */ = { 122 | isa = PBXGroup; 123 | children = ( 124 | 277A5FF442BB2E8D4909B603517DBCEA /* Info.plist */, 125 | 65EBECD791F192EF0B8ADB84E7A8FA2A /* Pods-JCTagListView_Example.modulemap */, 126 | D118B03FE44AF0550E3975DA84DCA1CC /* Pods-JCTagListView_Example-acknowledgements.markdown */, 127 | D15710B2093143643C7B6084FDD49D9D /* Pods-JCTagListView_Example-acknowledgements.plist */, 128 | 39E4671F88E47306D70821BB21F0972B /* Pods-JCTagListView_Example-dummy.m */, 129 | 98478425DD139A7AB5B42B307E54477D /* Pods-JCTagListView_Example-frameworks.sh */, 130 | 2BE2D37F3BA63D47FCEC84859C2DDB60 /* Pods-JCTagListView_Example-resources.sh */, 131 | 2CAFD9E8EB24CAA3C3E6C2682A97AEBC /* Pods-JCTagListView_Example-umbrella.h */, 132 | 563188FC68007651834E1C9B256728A1 /* Pods-JCTagListView_Example.debug.xcconfig */, 133 | 8E312F3810E768925F0A178D4973AD3F /* Pods-JCTagListView_Example.release.xcconfig */, 134 | ); 135 | name = "Pods-JCTagListView_Example"; 136 | path = "Target Support Files/Pods-JCTagListView_Example"; 137 | sourceTree = ""; 138 | }; 139 | 7A423F7F9F4E4462C335667EEBC9D903 /* Support Files */ = { 140 | isa = PBXGroup; 141 | children = ( 142 | 7963086929A7C64308A26E7170186CE6 /* Info.plist */, 143 | DF8E6E38B628EF565E62EABF28E266AF /* JCTagListView.modulemap */, 144 | 02BD6E299A09D69D689EBB1336C7A6BB /* JCTagListView.xcconfig */, 145 | BE0D0CD38B8A831865D5970313F982BB /* JCTagListView-dummy.m */, 146 | B19C3D26BEE226FBA2BA304A568C5751 /* JCTagListView-prefix.pch */, 147 | 3D5FA2FFBAF9A2B51A6C4129DCE65F6E /* JCTagListView-umbrella.h */, 148 | ); 149 | name = "Support Files"; 150 | path = "Example/Pods/Target Support Files/JCTagListView"; 151 | sourceTree = ""; 152 | }; 153 | 7DB346D0F39D3F0E887471402A8071AB = { 154 | isa = PBXGroup; 155 | children = ( 156 | 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, 157 | 4599AC514ED979CCDB8C2E087CB52AB2 /* Development Pods */, 158 | BC3CA7F9E30CC8F7E2DD044DD34432FC /* Frameworks */, 159 | 0B913F247DDD19701FD36296EC37796C /* Products */, 160 | 393B0E22DD9B2ADB39DC8EB5001D0870 /* Targets Support Files */, 161 | ); 162 | sourceTree = ""; 163 | }; 164 | BC3CA7F9E30CC8F7E2DD044DD34432FC /* Frameworks */ = { 165 | isa = PBXGroup; 166 | children = ( 167 | D35AF013A5F0BAD4F32504907A52519E /* iOS */, 168 | ); 169 | name = Frameworks; 170 | sourceTree = ""; 171 | }; 172 | CE2062FE4B4C436FEBB8A42C5AC9122C /* JCTagListView */ = { 173 | isa = PBXGroup; 174 | children = ( 175 | BA4B7087672F41E4216AF2B8FC74A9A4 /* JCTagCell.h */, 176 | B9E6C80BF94A10C1B1A2918005749EE5 /* JCTagCell.m */, 177 | 017BED53434ADB4A140A878FC28C43EA /* JCTagListView.h */, 178 | 350964841D08A8C30E2DC1FAEA349419 /* JCTagListView.m */, 179 | 35C3412351DD3F0F4F99323AB665023E /* JCTagListViewFlowLayout.h */, 180 | C660BC907F1526A455962B416052BBAD /* JCTagListViewFlowLayout.m */, 181 | 4D49A3502369B4A32F50D85C8CFF6BFF /* Pod */, 182 | 7A423F7F9F4E4462C335667EEBC9D903 /* Support Files */, 183 | ); 184 | name = JCTagListView; 185 | path = ../..; 186 | sourceTree = ""; 187 | }; 188 | D35AF013A5F0BAD4F32504907A52519E /* iOS */ = { 189 | isa = PBXGroup; 190 | children = ( 191 | 6604A7D69453B4569E4E4827FB9155A9 /* Foundation.framework */, 192 | ); 193 | name = iOS; 194 | sourceTree = ""; 195 | }; 196 | /* End PBXGroup section */ 197 | 198 | /* Begin PBXHeadersBuildPhase section */ 199 | 1C61B5A95AD20C8684BEEC117BD1686E /* Headers */ = { 200 | isa = PBXHeadersBuildPhase; 201 | buildActionMask = 2147483647; 202 | files = ( 203 | 553BC696916E660217649A9E0A8FE8A2 /* JCTagCell.h in Headers */, 204 | 395D455A9D25844F910410EED258F273 /* JCTagListView-umbrella.h in Headers */, 205 | B5CC923B0F5083514D589D1CCDD3CB59 /* JCTagListView.h in Headers */, 206 | 4754F3FDCEE9194EEC08567A4C16336D /* JCTagListViewFlowLayout.h in Headers */, 207 | ); 208 | runOnlyForDeploymentPostprocessing = 0; 209 | }; 210 | 6A1BA6A3A8D80A928090B9990E5B7C0F /* Headers */ = { 211 | isa = PBXHeadersBuildPhase; 212 | buildActionMask = 2147483647; 213 | files = ( 214 | A44C82A5DC1B1B579BD2AD1FD11C3CE2 /* Pods-JCTagListView_Example-umbrella.h in Headers */, 215 | ); 216 | runOnlyForDeploymentPostprocessing = 0; 217 | }; 218 | /* End PBXHeadersBuildPhase section */ 219 | 220 | /* Begin PBXNativeTarget section */ 221 | 2987BF55D74109B00676F13EC5A055A0 /* JCTagListView */ = { 222 | isa = PBXNativeTarget; 223 | buildConfigurationList = B4076BFF5F07EE6CD2C57E55D053EDE4 /* Build configuration list for PBXNativeTarget "JCTagListView" */; 224 | buildPhases = ( 225 | A3DEC96C5EFAF4F00A2A89C9DD889827 /* Sources */, 226 | 82359864094C20B4E3BEF790813FAD15 /* Frameworks */, 227 | 1C61B5A95AD20C8684BEEC117BD1686E /* Headers */, 228 | ); 229 | buildRules = ( 230 | ); 231 | dependencies = ( 232 | ); 233 | name = JCTagListView; 234 | productName = JCTagListView; 235 | productReference = 7C377673638DF0F6C0C726416160C134 /* JCTagListView.framework */; 236 | productType = "com.apple.product-type.framework"; 237 | }; 238 | 561E8C0C6F95F22821D10F8F77511B20 /* Pods-JCTagListView_Example */ = { 239 | isa = PBXNativeTarget; 240 | buildConfigurationList = 2EBFB37DA6C46B18497BA7F70AE8CD4A /* Build configuration list for PBXNativeTarget "Pods-JCTagListView_Example" */; 241 | buildPhases = ( 242 | 0D73727354FCDD307D498FBFEF080A62 /* Sources */, 243 | B6526BFF3B005399F1F9740A1BD56723 /* Frameworks */, 244 | 6A1BA6A3A8D80A928090B9990E5B7C0F /* Headers */, 245 | ); 246 | buildRules = ( 247 | ); 248 | dependencies = ( 249 | C672F2CE884143FDD727367B0EA2AD38 /* PBXTargetDependency */, 250 | ); 251 | name = "Pods-JCTagListView_Example"; 252 | productName = "Pods-JCTagListView_Example"; 253 | productReference = 0B4E094E15512BC99D5ABF0EF49559BE /* Pods_JCTagListView_Example.framework */; 254 | productType = "com.apple.product-type.framework"; 255 | }; 256 | /* End PBXNativeTarget section */ 257 | 258 | /* Begin PBXProject section */ 259 | D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { 260 | isa = PBXProject; 261 | attributes = { 262 | LastSwiftUpdateCheck = 0930; 263 | LastUpgradeCheck = 0930; 264 | }; 265 | buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; 266 | compatibilityVersion = "Xcode 3.2"; 267 | developmentRegion = English; 268 | hasScannedForEncodings = 0; 269 | knownRegions = ( 270 | en, 271 | ); 272 | mainGroup = 7DB346D0F39D3F0E887471402A8071AB; 273 | productRefGroup = 0B913F247DDD19701FD36296EC37796C /* Products */; 274 | projectDirPath = ""; 275 | projectRoot = ""; 276 | targets = ( 277 | 2987BF55D74109B00676F13EC5A055A0 /* JCTagListView */, 278 | 561E8C0C6F95F22821D10F8F77511B20 /* Pods-JCTagListView_Example */, 279 | ); 280 | }; 281 | /* End PBXProject section */ 282 | 283 | /* Begin PBXSourcesBuildPhase section */ 284 | 0D73727354FCDD307D498FBFEF080A62 /* Sources */ = { 285 | isa = PBXSourcesBuildPhase; 286 | buildActionMask = 2147483647; 287 | files = ( 288 | B1F9DB556BD5235CEDF02465B726ACAE /* Pods-JCTagListView_Example-dummy.m in Sources */, 289 | ); 290 | runOnlyForDeploymentPostprocessing = 0; 291 | }; 292 | A3DEC96C5EFAF4F00A2A89C9DD889827 /* Sources */ = { 293 | isa = PBXSourcesBuildPhase; 294 | buildActionMask = 2147483647; 295 | files = ( 296 | A9CC48F176D91D2EA376833D5D6C61DE /* JCTagCell.m in Sources */, 297 | 38A6D7670AC882F3ABCC29A42CE9F610 /* JCTagListView-dummy.m in Sources */, 298 | FCC4D5BE30D75BD4CB2072059BBF668E /* JCTagListView.m in Sources */, 299 | ECC800CBA25B8CBDC23848E60AB91F24 /* JCTagListViewFlowLayout.m in Sources */, 300 | ); 301 | runOnlyForDeploymentPostprocessing = 0; 302 | }; 303 | /* End PBXSourcesBuildPhase section */ 304 | 305 | /* Begin PBXTargetDependency section */ 306 | C672F2CE884143FDD727367B0EA2AD38 /* PBXTargetDependency */ = { 307 | isa = PBXTargetDependency; 308 | name = JCTagListView; 309 | target = 2987BF55D74109B00676F13EC5A055A0 /* JCTagListView */; 310 | targetProxy = 30F88F74F1FEEBE35C844AC73555F7D0 /* PBXContainerItemProxy */; 311 | }; 312 | /* End PBXTargetDependency section */ 313 | 314 | /* Begin XCBuildConfiguration section */ 315 | 199D972A13F2B4C56847F7A89CCA83BC /* Debug */ = { 316 | isa = XCBuildConfiguration; 317 | buildSettings = { 318 | ALWAYS_SEARCH_USER_PATHS = NO; 319 | CLANG_ANALYZER_NONNULL = YES; 320 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 321 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 322 | CLANG_CXX_LIBRARY = "libc++"; 323 | CLANG_ENABLE_MODULES = YES; 324 | CLANG_ENABLE_OBJC_ARC = YES; 325 | CLANG_ENABLE_OBJC_WEAK = YES; 326 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 327 | CLANG_WARN_BOOL_CONVERSION = YES; 328 | CLANG_WARN_COMMA = YES; 329 | CLANG_WARN_CONSTANT_CONVERSION = YES; 330 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 331 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 332 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 333 | CLANG_WARN_EMPTY_BODY = YES; 334 | CLANG_WARN_ENUM_CONVERSION = YES; 335 | CLANG_WARN_INFINITE_RECURSION = YES; 336 | CLANG_WARN_INT_CONVERSION = YES; 337 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 338 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 339 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 340 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 341 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 342 | CLANG_WARN_STRICT_PROTOTYPES = YES; 343 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 344 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 345 | CLANG_WARN_UNREACHABLE_CODE = YES; 346 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 347 | CODE_SIGNING_ALLOWED = NO; 348 | CODE_SIGNING_REQUIRED = NO; 349 | COPY_PHASE_STRIP = NO; 350 | DEBUG_INFORMATION_FORMAT = dwarf; 351 | ENABLE_STRICT_OBJC_MSGSEND = YES; 352 | ENABLE_TESTABILITY = YES; 353 | GCC_C_LANGUAGE_STANDARD = gnu11; 354 | GCC_DYNAMIC_NO_PIC = NO; 355 | GCC_NO_COMMON_BLOCKS = YES; 356 | GCC_OPTIMIZATION_LEVEL = 0; 357 | GCC_PREPROCESSOR_DEFINITIONS = ( 358 | "POD_CONFIGURATION_DEBUG=1", 359 | "DEBUG=1", 360 | "$(inherited)", 361 | ); 362 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 363 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 364 | GCC_WARN_UNDECLARED_SELECTOR = YES; 365 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 366 | GCC_WARN_UNUSED_FUNCTION = YES; 367 | GCC_WARN_UNUSED_VARIABLE = YES; 368 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 369 | MTL_ENABLE_DEBUG_INFO = YES; 370 | ONLY_ACTIVE_ARCH = YES; 371 | PRODUCT_NAME = "$(TARGET_NAME)"; 372 | STRIP_INSTALLED_PRODUCT = NO; 373 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 374 | SYMROOT = "${SRCROOT}/../build"; 375 | }; 376 | name = Debug; 377 | }; 378 | 2B1570D9E9A8D7420EAF515472B353A9 /* Debug */ = { 379 | isa = XCBuildConfiguration; 380 | baseConfigurationReference = 02BD6E299A09D69D689EBB1336C7A6BB /* JCTagListView.xcconfig */; 381 | buildSettings = { 382 | CODE_SIGN_IDENTITY = ""; 383 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 384 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 385 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 386 | CURRENT_PROJECT_VERSION = 1; 387 | DEFINES_MODULE = YES; 388 | DYLIB_COMPATIBILITY_VERSION = 1; 389 | DYLIB_CURRENT_VERSION = 1; 390 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 391 | GCC_PREFIX_HEADER = "Target Support Files/JCTagListView/JCTagListView-prefix.pch"; 392 | INFOPLIST_FILE = "Target Support Files/JCTagListView/Info.plist"; 393 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 394 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 395 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 396 | MODULEMAP_FILE = "Target Support Files/JCTagListView/JCTagListView.modulemap"; 397 | PRODUCT_MODULE_NAME = JCTagListView; 398 | PRODUCT_NAME = JCTagListView; 399 | SDKROOT = iphoneos; 400 | SKIP_INSTALL = YES; 401 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 402 | TARGETED_DEVICE_FAMILY = "1,2"; 403 | VERSIONING_SYSTEM = "apple-generic"; 404 | VERSION_INFO_PREFIX = ""; 405 | }; 406 | name = Debug; 407 | }; 408 | 3890C879D857DD2681EAAE2E961BB89C /* Release */ = { 409 | isa = XCBuildConfiguration; 410 | baseConfigurationReference = 02BD6E299A09D69D689EBB1336C7A6BB /* JCTagListView.xcconfig */; 411 | buildSettings = { 412 | CODE_SIGN_IDENTITY = ""; 413 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 414 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 415 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 416 | CURRENT_PROJECT_VERSION = 1; 417 | DEFINES_MODULE = YES; 418 | DYLIB_COMPATIBILITY_VERSION = 1; 419 | DYLIB_CURRENT_VERSION = 1; 420 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 421 | GCC_PREFIX_HEADER = "Target Support Files/JCTagListView/JCTagListView-prefix.pch"; 422 | INFOPLIST_FILE = "Target Support Files/JCTagListView/Info.plist"; 423 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 424 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 425 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 426 | MODULEMAP_FILE = "Target Support Files/JCTagListView/JCTagListView.modulemap"; 427 | PRODUCT_MODULE_NAME = JCTagListView; 428 | PRODUCT_NAME = JCTagListView; 429 | SDKROOT = iphoneos; 430 | SKIP_INSTALL = YES; 431 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 432 | TARGETED_DEVICE_FAMILY = "1,2"; 433 | VALIDATE_PRODUCT = YES; 434 | VERSIONING_SYSTEM = "apple-generic"; 435 | VERSION_INFO_PREFIX = ""; 436 | }; 437 | name = Release; 438 | }; 439 | 7C8A90B1CD1C746364F535229693400C /* Debug */ = { 440 | isa = XCBuildConfiguration; 441 | baseConfigurationReference = 563188FC68007651834E1C9B256728A1 /* Pods-JCTagListView_Example.debug.xcconfig */; 442 | buildSettings = { 443 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 444 | CODE_SIGN_IDENTITY = ""; 445 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 446 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 447 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 448 | CURRENT_PROJECT_VERSION = 1; 449 | DEFINES_MODULE = YES; 450 | DYLIB_COMPATIBILITY_VERSION = 1; 451 | DYLIB_CURRENT_VERSION = 1; 452 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 453 | INFOPLIST_FILE = "Target Support Files/Pods-JCTagListView_Example/Info.plist"; 454 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 455 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 456 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 457 | MACH_O_TYPE = staticlib; 458 | MODULEMAP_FILE = "Target Support Files/Pods-JCTagListView_Example/Pods-JCTagListView_Example.modulemap"; 459 | OTHER_LDFLAGS = ""; 460 | OTHER_LIBTOOLFLAGS = ""; 461 | PODS_ROOT = "$(SRCROOT)"; 462 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 463 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 464 | SDKROOT = iphoneos; 465 | SKIP_INSTALL = YES; 466 | TARGETED_DEVICE_FAMILY = "1,2"; 467 | VERSIONING_SYSTEM = "apple-generic"; 468 | VERSION_INFO_PREFIX = ""; 469 | }; 470 | name = Debug; 471 | }; 472 | E07147B37F5A1312F4D1368DF5E26D0B /* Release */ = { 473 | isa = XCBuildConfiguration; 474 | baseConfigurationReference = 8E312F3810E768925F0A178D4973AD3F /* Pods-JCTagListView_Example.release.xcconfig */; 475 | buildSettings = { 476 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 477 | CODE_SIGN_IDENTITY = ""; 478 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 479 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 480 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 481 | CURRENT_PROJECT_VERSION = 1; 482 | DEFINES_MODULE = YES; 483 | DYLIB_COMPATIBILITY_VERSION = 1; 484 | DYLIB_CURRENT_VERSION = 1; 485 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 486 | INFOPLIST_FILE = "Target Support Files/Pods-JCTagListView_Example/Info.plist"; 487 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 488 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 489 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 490 | MACH_O_TYPE = staticlib; 491 | MODULEMAP_FILE = "Target Support Files/Pods-JCTagListView_Example/Pods-JCTagListView_Example.modulemap"; 492 | OTHER_LDFLAGS = ""; 493 | OTHER_LIBTOOLFLAGS = ""; 494 | PODS_ROOT = "$(SRCROOT)"; 495 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 496 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 497 | SDKROOT = iphoneos; 498 | SKIP_INSTALL = YES; 499 | TARGETED_DEVICE_FAMILY = "1,2"; 500 | VALIDATE_PRODUCT = YES; 501 | VERSIONING_SYSTEM = "apple-generic"; 502 | VERSION_INFO_PREFIX = ""; 503 | }; 504 | name = Release; 505 | }; 506 | FDB2FC4A1E5891381CD9D922145497F1 /* Release */ = { 507 | isa = XCBuildConfiguration; 508 | buildSettings = { 509 | ALWAYS_SEARCH_USER_PATHS = NO; 510 | CLANG_ANALYZER_NONNULL = YES; 511 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 512 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 513 | CLANG_CXX_LIBRARY = "libc++"; 514 | CLANG_ENABLE_MODULES = YES; 515 | CLANG_ENABLE_OBJC_ARC = YES; 516 | CLANG_ENABLE_OBJC_WEAK = YES; 517 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 518 | CLANG_WARN_BOOL_CONVERSION = YES; 519 | CLANG_WARN_COMMA = YES; 520 | CLANG_WARN_CONSTANT_CONVERSION = YES; 521 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_NON_LITERAL_NULL_CONVERSION = YES; 529 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 530 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 531 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 532 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 533 | CLANG_WARN_STRICT_PROTOTYPES = YES; 534 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 535 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 536 | CLANG_WARN_UNREACHABLE_CODE = YES; 537 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 538 | CODE_SIGNING_ALLOWED = NO; 539 | CODE_SIGNING_REQUIRED = NO; 540 | COPY_PHASE_STRIP = NO; 541 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 542 | ENABLE_NS_ASSERTIONS = NO; 543 | ENABLE_STRICT_OBJC_MSGSEND = YES; 544 | GCC_C_LANGUAGE_STANDARD = gnu11; 545 | GCC_NO_COMMON_BLOCKS = YES; 546 | GCC_PREPROCESSOR_DEFINITIONS = ( 547 | "POD_CONFIGURATION_RELEASE=1", 548 | "$(inherited)", 549 | ); 550 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 551 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 552 | GCC_WARN_UNDECLARED_SELECTOR = YES; 553 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 554 | GCC_WARN_UNUSED_FUNCTION = YES; 555 | GCC_WARN_UNUSED_VARIABLE = YES; 556 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 557 | MTL_ENABLE_DEBUG_INFO = NO; 558 | PRODUCT_NAME = "$(TARGET_NAME)"; 559 | STRIP_INSTALLED_PRODUCT = NO; 560 | SYMROOT = "${SRCROOT}/../build"; 561 | }; 562 | name = Release; 563 | }; 564 | /* End XCBuildConfiguration section */ 565 | 566 | /* Begin XCConfigurationList section */ 567 | 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { 568 | isa = XCConfigurationList; 569 | buildConfigurations = ( 570 | 199D972A13F2B4C56847F7A89CCA83BC /* Debug */, 571 | FDB2FC4A1E5891381CD9D922145497F1 /* Release */, 572 | ); 573 | defaultConfigurationIsVisible = 0; 574 | defaultConfigurationName = Release; 575 | }; 576 | 2EBFB37DA6C46B18497BA7F70AE8CD4A /* Build configuration list for PBXNativeTarget "Pods-JCTagListView_Example" */ = { 577 | isa = XCConfigurationList; 578 | buildConfigurations = ( 579 | 7C8A90B1CD1C746364F535229693400C /* Debug */, 580 | E07147B37F5A1312F4D1368DF5E26D0B /* Release */, 581 | ); 582 | defaultConfigurationIsVisible = 0; 583 | defaultConfigurationName = Release; 584 | }; 585 | B4076BFF5F07EE6CD2C57E55D053EDE4 /* Build configuration list for PBXNativeTarget "JCTagListView" */ = { 586 | isa = XCConfigurationList; 587 | buildConfigurations = ( 588 | 2B1570D9E9A8D7420EAF515472B353A9 /* Debug */, 589 | 3890C879D857DD2681EAAE2E961BB89C /* Release */, 590 | ); 591 | defaultConfigurationIsVisible = 0; 592 | defaultConfigurationName = Release; 593 | }; 594 | /* End XCConfigurationList section */ 595 | }; 596 | rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 597 | } 598 | --------------------------------------------------------------------------------