├── SDTagsView ├── SDTagsView.gif ├── SDTagsView.png ├── SDEditTagsView.gif ├── MainViewController.h ├── APPDelegate │ ├── ViewController.h │ ├── AppDelegate.h │ ├── ViewController.m │ └── AppDelegate.m ├── SDLabTags │ ├── LabelTagsViewController.h │ ├── SDLabTagsView.h │ ├── LabelTagsViewController.m │ └── SDLabTagsView.m ├── SDEditTagsView │ ├── SDEditTagsViewController.h │ ├── SDCollectionTagsViewCell.h │ ├── SDCollectionTagsFlowLayout.h │ ├── SDCollectionTagsView.h │ ├── SDCollectionTagsViewCell.m │ ├── SDCollectionTagsView.m │ ├── SDCollectionTagsFlowLayout.m │ └── SDEditTagsViewController.m ├── SDCollectionTags │ ├── SDTagsView.h │ ├── CollectionTagsViewController.h │ ├── CollectionTagsViewController.m │ └── SDTagsView.m ├── main.m ├── SDTagsModel │ ├── TagsModel.h │ ├── TagsModel.m │ └── tagsData.plist ├── SDHelper.h ├── Assets.xcassets │ └── AppIcon.appiconset │ │ └── Contents.json ├── SDHelper.m ├── Info.plist ├── SDHeader.h ├── Base.lproj │ ├── Main.storyboard │ └── LaunchScreen.storyboard └── MainViewController.m ├── SDTagsView.xcodeproj ├── xcuserdata │ ├── apple.xcuserdatad │ │ ├── xcdebugger │ │ │ └── Breakpoints_v2.xcbkptlist │ │ └── xcschemes │ │ │ ├── xcschememanagement.plist │ │ │ └── SDTagsView.xcscheme │ └── slowdony.xcuserdatad │ │ ├── xcdebugger │ │ └── Breakpoints_v2.xcbkptlist │ │ └── xcschemes │ │ ├── xcschememanagement.plist │ │ └── SDTagsView.xcscheme ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcuserdata │ │ ├── apple.xcuserdatad │ │ └── UserInterfaceState.xcuserstate │ │ └── slowdony.xcuserdatad │ │ └── UserInterfaceState.xcuserstate └── project.pbxproj ├── README.md ├── SDTagsViewTests ├── Info.plist └── SDTagsViewTests.m └── SDTagsViewUITests ├── Info.plist └── SDTagsViewUITests.m /SDTagsView/SDTagsView.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SlowDony/SDTagsView/HEAD/SDTagsView/SDTagsView.gif -------------------------------------------------------------------------------- /SDTagsView/SDTagsView.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SlowDony/SDTagsView/HEAD/SDTagsView/SDTagsView.png -------------------------------------------------------------------------------- /SDTagsView/SDEditTagsView.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SlowDony/SDTagsView/HEAD/SDTagsView/SDEditTagsView.gif -------------------------------------------------------------------------------- /SDTagsView.xcodeproj/xcuserdata/apple.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /SDTagsView.xcodeproj/xcuserdata/slowdony.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /SDTagsView.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /SDTagsView.xcodeproj/project.xcworkspace/xcuserdata/apple.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SlowDony/SDTagsView/HEAD/SDTagsView.xcodeproj/project.xcworkspace/xcuserdata/apple.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /SDTagsView.xcodeproj/project.xcworkspace/xcuserdata/slowdony.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SlowDony/SDTagsView/HEAD/SDTagsView.xcodeproj/project.xcworkspace/xcuserdata/slowdony.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /SDTagsView/MainViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // MainViewController.h 3 | // SDTagsView 4 | // 5 | // Created by apple on 2017/2/22. 6 | // Copyright © 2017年 slowdony. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface MainViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /SDTagsView/APPDelegate/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.h 3 | // SDTagsView 4 | // 5 | // Created by apple on 2017/2/20. 6 | // Copyright © 2017年 slowdony. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ViewController : UIViewController 12 | 13 | 14 | @end 15 | 16 | -------------------------------------------------------------------------------- /SDTagsView/SDLabTags/LabelTagsViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // LabelTagsViewController.h 3 | // SDTagsView 4 | // 5 | // Created by apple on 2017/2/22. 6 | // Copyright © 2017年 slowdony. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface LabelTagsViewController : UIViewController 12 | 13 | @property (nonatomic,strong)NSString *navTitle; 14 | @end 15 | -------------------------------------------------------------------------------- /SDTagsView/APPDelegate/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // SDTagsView 4 | // 5 | // Created by apple on 2017/2/20. 6 | // Copyright © 2017年 slowdony. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | 16 | @end 17 | 18 | -------------------------------------------------------------------------------- /SDTagsView/SDEditTagsView/SDEditTagsViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // SDEditTagsViewController.h 3 | // SDTagsView 4 | // 5 | // Created by slowdony on 2017/7/19. 6 | // Copyright © 2017年 slowdony. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface SDEditTagsViewController : UIViewController 12 | @property (nonatomic,strong)NSString *navTitle; 13 | @end 14 | -------------------------------------------------------------------------------- /SDTagsView/SDCollectionTags/SDTagsView.h: -------------------------------------------------------------------------------- 1 | // 2 | // SDTagsView.h 3 | // SDTagsView 4 | // 5 | // Created by apple on 2017/2/20. 6 | // Copyright © 2017年 slowdony. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface SDTagsView : UIView 12 | @property (nonatomic,strong)NSArray *tagsArr; 13 | +(instancetype)sdTagsViewWithTagsArr:(NSArray*)tagsArr; 14 | @end 15 | -------------------------------------------------------------------------------- /SDTagsView/SDCollectionTags/CollectionTagsViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // CollectionTagsViewController.h 3 | // SDTagsView 4 | // 5 | // Created by apple on 2017/2/22. 6 | // Copyright © 2017年 slowdony. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface CollectionTagsViewController : UIViewController 12 | @property (nonatomic,strong)NSString *navTitle; 13 | @end 14 | -------------------------------------------------------------------------------- /SDTagsView/SDLabTags/SDLabTagsView.h: -------------------------------------------------------------------------------- 1 | // 2 | // SDLabTagsView.h 3 | // SDTagsView 4 | // 5 | // Created by apple on 2017/2/22. 6 | // Copyright © 2017年 slowdony. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface SDLabTagsView : UIView 12 | @property (nonatomic,strong)NSArray *tagsArr; 13 | +(instancetype)sdLabTagsViewWithTagsArr:(NSArray *)tagsArr; 14 | @end 15 | -------------------------------------------------------------------------------- /SDTagsView/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // SDTagsView 4 | // 5 | // Created by apple on 2017/2/20. 6 | // Copyright © 2017年 slowdony. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) { 13 | @autoreleasepool { 14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /SDTagsView/SDEditTagsView/SDCollectionTagsViewCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // SDCollectionTagsViewCell.h 3 | // SDTagsView 4 | // 5 | // Created by slowdony on 2017/9/9. 6 | // Copyright © 2017年 slowdony. All rights reserved. 7 | // 8 | 9 | #import 10 | @class TagsModel; 11 | @interface SDCollectionTagsViewCell : UICollectionViewCell 12 | //标签 13 | @property (nonatomic,strong)UILabel *title; 14 | -(void)setValueWithModel:(TagsModel *)model; 15 | @end 16 | -------------------------------------------------------------------------------- /SDTagsView/SDTagsModel/TagsModel.h: -------------------------------------------------------------------------------- 1 | // 2 | // TagsModel.h 3 | // SDTagsView 4 | // 5 | // Created by apple on 2017/2/22. 6 | // Copyright © 2017年 slowdony. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TagsModel : NSObject 12 | 13 | 14 | /** 15 | 标签标题 16 | */ 17 | @property (nonatomic,strong)NSString *title; 18 | 19 | /** 20 | 标签颜色 21 | */ 22 | @property (nonatomic,strong)NSString *color; 23 | 24 | -(instancetype )initWithTagsDict:(NSDictionary *)dict; 25 | +(instancetype)tagsModelWithDict:(NSDictionary *)dict; 26 | @end 27 | -------------------------------------------------------------------------------- /SDTagsView/SDHelper.h: -------------------------------------------------------------------------------- 1 | // 2 | // SDHelper.h 3 | // SDTagsView 4 | // 5 | // Created by slowdony on 2017/7/19. 6 | // Copyright © 2017年 slowdony. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | @interface SDHelper : NSObject 12 | 13 | /** 14 | 计算文字长度 15 | 16 | @param text 文字 17 | @param font 字体 18 | @return 长度 19 | */ 20 | + (CGFloat )widthForLabel:(NSString *)text fontSize:(CGFloat)font; 21 | 22 | /** 23 | 16进制转换 颜色 24 | 25 | @param hexColor 颜色 26 | @return 转换后的颜色 27 | */ 28 | +(UIColor *) getColor:(NSString *)hexColor; 29 | @end 30 | -------------------------------------------------------------------------------- /SDTagsView/APPDelegate/ViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.m 3 | // SDTagsView 4 | // 5 | // Created by apple on 2017/2/20. 6 | // Copyright © 2017年 slowdony. All rights reserved. 7 | // 8 | 9 | #import "ViewController.h" 10 | 11 | @interface ViewController () 12 | 13 | @end 14 | 15 | @implementation ViewController 16 | 17 | - (void)viewDidLoad { 18 | [super viewDidLoad]; 19 | 20 | // Do any additional setup after loading the view, typically from a nib. 21 | } 22 | 23 | 24 | - (void)didReceiveMemoryWarning { 25 | [super didReceiveMemoryWarning]; 26 | // Dispose of any resources that can be recreated. 27 | } 28 | 29 | 30 | @end 31 | -------------------------------------------------------------------------------- /SDTagsView/SDEditTagsView/SDCollectionTagsFlowLayout.h: -------------------------------------------------------------------------------- 1 | // 2 | // SDCollectionTagsFlowLayout.h 3 | // SDTagsView 4 | // 5 | // Created by slowdony on 2017/9/23. 6 | // Copyright © 2017年 slowdony. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | 12 | typedef NS_ENUM(NSInteger,TagsType){ 13 | TagsTypeWithLeft, 14 | TagsTypeWithCenter, 15 | TagsTypeWithRight 16 | }; 17 | @interface SDCollectionTagsFlowLayout : UICollectionViewFlowLayout 18 | //两个Cell之间的距离 19 | @property (nonatomic,assign)CGFloat betweenOfCell; 20 | //cell对齐方式 21 | @property (nonatomic,assign)TagsType cellType; 22 | 23 | -(instancetype)initWthType : (TagsType)cellType; 24 | @end 25 | -------------------------------------------------------------------------------- /SDTagsView/SDEditTagsView/SDCollectionTagsView.h: -------------------------------------------------------------------------------- 1 | // 2 | // SDCollectionTagsView.h 3 | // SDTagsView 4 | // 5 | // Created by slowdony on 2017/7/19. 6 | // Copyright © 2017年 slowdony. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | 12 | @protocol SDCollectionTagsViewDelegate 13 | 14 | - (void)SDCollectionTagsView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath; 15 | 16 | @end 17 | @interface SDCollectionTagsView : UICollectionView 18 | 19 | 20 | 21 | 22 | /** 23 | 数据源 24 | */ 25 | @property (nonatomic,strong)NSMutableArray *dataArr; 26 | 27 | @property (nonatomic,weak) idsd_delegate; 28 | @end 29 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SDTagsView1.0 2 | 3 | 4 | 5 | 6 | 7 | 项目预览: 8 | 布局标签 9 | 10 | 11 | 12 | 13 | 14 | 添加删除标签 15 | 16 | 17 | 18 | 19 | 标签使我们日常项目开发中经常遇见的,SDTagsView两种布局方式 20 | 21 | * UILabel 22 | * UICollectionView (推荐使用) 23 | 24 | 25 | 展示标签,自适应标签宽度. 26 | 27 | 点击新增标签,删除标签. 28 | 29 | 30 | 我的邮箱:devslowdony@gmail.com 31 | 32 | 我的微博: [slowdony](https://weibo.com/u/2428779285) 33 | 34 | 如果有好的建议或者意见 ,欢迎指出 , 您的支持是对我最大的鼓励,谢谢. 求STAR ..😆 35 | 36 | -------------------------------------------------------------------------------- /SDTagsViewTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /SDTagsViewUITests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /SDTagsView.xcodeproj/xcuserdata/apple.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | SDTagsView.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 18BE89BE1E5ADCBD00BA5AC9 16 | 17 | primary 18 | 19 | 20 | 18BE89D71E5ADCBD00BA5AC9 21 | 22 | primary 23 | 24 | 25 | 18BE89E21E5ADCBD00BA5AC9 26 | 27 | primary 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /SDTagsView.xcodeproj/xcuserdata/slowdony.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | SDTagsView.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 18BE89BE1E5ADCBD00BA5AC9 16 | 17 | primary 18 | 19 | 20 | 18BE89D71E5ADCBD00BA5AC9 21 | 22 | primary 23 | 24 | 25 | 18BE89E21E5ADCBD00BA5AC9 26 | 27 | primary 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /SDTagsView/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | } 43 | ], 44 | "info" : { 45 | "version" : 1, 46 | "author" : "xcode" 47 | } 48 | } -------------------------------------------------------------------------------- /SDTagsView/SDTagsModel/TagsModel.m: -------------------------------------------------------------------------------- 1 | // 2 | // TagsModel.m 3 | // SDTagsView 4 | // 5 | // Created by apple on 2017/2/22. 6 | // Copyright © 2017年 slowdony. All rights reserved. 7 | // 8 | 9 | #import "TagsModel.h" 10 | 11 | @implementation TagsModel 12 | 13 | -(instancetype )initWithTagsDict:(NSDictionary *)dict{ 14 | self =[super init]; 15 | if(self ){ 16 | [self setValuesForKeysWithDictionary:dict]; 17 | } 18 | return self; 19 | } 20 | 21 | +(instancetype)tagsModelWithDict:(NSDictionary *)dict{ 22 | return [[self alloc]initWithTagsDict:dict]; 23 | } 24 | //解档 25 | - (instancetype)initWithCoder:(NSCoder *)coder 26 | { 27 | self = [super init]; 28 | if (self) { 29 | self.title = [coder decodeObjectForKey:@"title"]; 30 | self.color = [coder decodeObjectForKey:@"color"]; 31 | } 32 | return self; 33 | } 34 | //归档 35 | -(void)encodeWithCoder:(NSCoder *)aCoder{ 36 | [aCoder encodeObject:self.title forKey:@"title"]; 37 | [aCoder encodeObject:self.color forKey:@"color"]; 38 | 39 | } 40 | 41 | @end 42 | -------------------------------------------------------------------------------- /SDTagsViewTests/SDTagsViewTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // SDTagsViewTests.m 3 | // SDTagsViewTests 4 | // 5 | // Created by apple on 2017/2/20. 6 | // Copyright © 2017年 slowdony. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface SDTagsViewTests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation SDTagsViewTests 16 | 17 | - (void)setUp { 18 | [super setUp]; 19 | // Put setup code here. This method is called before the invocation of each test method in the class. 20 | } 21 | 22 | - (void)tearDown { 23 | // Put teardown code here. This method is called after the invocation of each test method in the class. 24 | [super tearDown]; 25 | } 26 | 27 | - (void)testExample { 28 | // This is an example of a functional test case. 29 | // Use XCTAssert and related functions to verify your tests produce the correct results. 30 | } 31 | 32 | - (void)testPerformanceExample { 33 | // This is an example of a performance test case. 34 | [self measureBlock:^{ 35 | // Put the code you want to measure the time of here. 36 | }]; 37 | } 38 | 39 | @end 40 | -------------------------------------------------------------------------------- /SDTagsView/SDHelper.m: -------------------------------------------------------------------------------- 1 | // 2 | // SDHelper.m 3 | // SDTagsView 4 | // 5 | // Created by slowdony on 2017/7/19. 6 | // Copyright © 2017年 slowdony. All rights reserved. 7 | // 8 | 9 | #import "SDHelper.h" 10 | 11 | @implementation SDHelper 12 | /** 13 | * 计算文字长度 14 | */ 15 | + (CGFloat )widthForLabel:(NSString *)text fontSize:(CGFloat)font 16 | { 17 | CGSize size = [text sizeWithAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIFont systemFontOfSize:font], NSFontAttributeName, nil]]; 18 | return size.width; 19 | } 20 | 21 | /** 22 | 转换颜色 23 | */ 24 | +(UIColor *) getColor:(NSString *)hexColor 25 | { 26 | unsigned int red, green, blue; 27 | NSRange range; 28 | range.length =2; 29 | 30 | range.location =0; 31 | [[NSScanner scannerWithString:[hexColor substringWithRange:range]]scanHexInt:&red]; 32 | range.location =2; 33 | [[NSScanner scannerWithString:[hexColor substringWithRange:range]]scanHexInt:&green]; 34 | range.location =4; 35 | [[NSScanner scannerWithString:[hexColor substringWithRange:range]]scanHexInt:&blue]; 36 | 37 | return [UIColor colorWithRed:(float)(red/255.0f)green:(float)(green/255.0f)blue:(float)(blue/255.0f)alpha:1.0f]; 38 | } 39 | 40 | @end 41 | -------------------------------------------------------------------------------- /SDTagsView/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UILaunchStoryboardName 24 | LaunchScreen 25 | UIMainStoryboardFile 26 | Main 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /SDTagsView/SDEditTagsView/SDCollectionTagsViewCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // SDCollectionTagsViewCell.m 3 | // SDTagsView 4 | // 5 | // Created by slowdony on 2017/9/9. 6 | // Copyright © 2017年 slowdony. All rights reserved. 7 | // 8 | 9 | #import "SDCollectionTagsViewCell.h" 10 | 11 | 12 | #import "SDHelper.h" 13 | #import "TagsModel.h" 14 | @implementation SDCollectionTagsViewCell 15 | 16 | -(instancetype)initWithFrame:(CGRect)frame{ 17 | self = [super initWithFrame:frame]; 18 | if (self) { 19 | [self setupUI]; 20 | } 21 | return self; 22 | } 23 | -(void)setupUI{ 24 | 25 | UILabel *title = [[UILabel alloc] init]; 26 | 27 | title.font = [UIFont systemFontOfSize:16]; 28 | title.layer.cornerRadius = 2.0; 29 | title.layer.masksToBounds = YES; 30 | title.layer.borderWidth = 1.0; 31 | title.textAlignment = NSTextAlignmentCenter; 32 | 33 | self.title = title; 34 | [self.contentView addSubview:title]; 35 | } 36 | 37 | -(void)setValueWithModel:(TagsModel *)model{ 38 | 39 | self.title.text = [NSString stringWithFormat:@"%@",model.title]; 40 | self.title.frame = CGRectMake(0, 10, ([SDHelper widthForLabel:model.title fontSize:16] + 10), 22); 41 | self.title.textColor = [SDHelper getColor:model.color]; 42 | self.title.layer.borderColor = [SDHelper getColor:model.color].CGColor; 43 | } 44 | 45 | @end 46 | -------------------------------------------------------------------------------- /SDTagsView/SDHeader.h: -------------------------------------------------------------------------------- 1 | // 2 | // SDHeader.h 3 | // SDTagsView 4 | // 5 | // Created by apple on 2017/2/20. 6 | // Copyright © 2017年 slowdony. All rights reserved. 7 | // 8 | 9 | #ifndef SDHeader_h 10 | #define SDHeader_h 11 | 12 | #define mDeviceWidth [UIScreen mainScreen].bounds.size.width //屏幕宽 13 | #define mDeviceHeight [UIScreen mainScreen].bounds.size.height //屏幕高 14 | //color 15 | #define mRGB(r,g,b,a) [UIColor colorWithRed:(r)/255.0f green:(g)/255.0f blue:(b)/255.0f alpha:a] 16 | #define mHexRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0] 17 | #define mHexRGBAlpha(rgbValue,a) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:(a)] 18 | #define fontHightColor mHexRGB(0x3c3c3c) //字体深色 19 | #define fontNomalColor mHexRGB(0xa0a0a0) //字体浅色 20 | 21 | #define bjColor mHexRGB(0xe4e4e4) //背景灰色 22 | 23 | #define borderCol mHexRGB(0xe4e4e4) //border颜色 24 | 25 | 26 | #ifdef DEBUG 27 | # define SDLog(fmt, ...) {NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);} 28 | # define ELog(err) {if(err) DLog(@"%@", err)} 29 | #else 30 | # define SDLog(...) 31 | # define ELog(err) 32 | #endif 33 | #endif /* SDHeader_h */ 34 | -------------------------------------------------------------------------------- /SDTagsViewUITests/SDTagsViewUITests.m: -------------------------------------------------------------------------------- 1 | // 2 | // SDTagsViewUITests.m 3 | // SDTagsViewUITests 4 | // 5 | // Created by apple on 2017/2/20. 6 | // Copyright © 2017年 slowdony. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface SDTagsViewUITests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation SDTagsViewUITests 16 | 17 | - (void)setUp { 18 | [super setUp]; 19 | 20 | // Put setup code here. This method is called before the invocation of each test method in the class. 21 | 22 | // In UI tests it is usually best to stop immediately when a failure occurs. 23 | self.continueAfterFailure = NO; 24 | // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. 25 | [[[XCUIApplication alloc] init] launch]; 26 | 27 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. 28 | } 29 | 30 | - (void)tearDown { 31 | // Put teardown code here. This method is called after the invocation of each test method in the class. 32 | [super tearDown]; 33 | } 34 | 35 | - (void)testExample { 36 | // Use recording to get started writing UI tests. 37 | // Use XCTAssert and related functions to verify your tests produce the correct results. 38 | } 39 | 40 | @end 41 | -------------------------------------------------------------------------------- /SDTagsView/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /SDTagsView/SDLabTags/LabelTagsViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // LabelTagsViewController.m 3 | // SDTagsView 4 | // 5 | // Created by apple on 2017/2/22. 6 | // Copyright © 2017年 slowdony. All rights reserved. 7 | // 8 | 9 | /* 10 | 11 | github地址https://github.com/SlowDony/SDTagsView 12 | 13 | 标签使我们日常项目开发中经常遇见的,SDTagsView两种布局方式 14 | 15 | .UILabel 16 | .UICollectionView (推荐使用) 17 | 18 | 目前支持展示标签,自适应标签宽度. 19 | 点击新增标签,删除标签 20 | 21 | 我的邮箱:devslowdony@gmail.com 22 | 23 | 如果有好的建议或者意见 ,欢迎指出 , 您的支持是对我最大的鼓励,谢谢. 求STAR ..😆 24 | */ 25 | 26 | 27 | #import "LabelTagsViewController.h" 28 | #import "SDHeader.h" 29 | #import "SDLabTagsView.h" 30 | #import "TagsModel.h" 31 | @interface LabelTagsViewController () 32 | 33 | /** 34 | 数据源 35 | */ 36 | @property (nonatomic,strong)NSMutableArray *dataArr; 37 | @end 38 | 39 | @implementation LabelTagsViewController 40 | 41 | - (void)viewDidLoad { 42 | [super viewDidLoad]; 43 | [self.navigationItem setTitle:self.navTitle]; 44 | [self.view setBackgroundColor:[UIColor whiteColor]]; 45 | 46 | [self setUp]; 47 | // Do any additional setup after loading the view. 48 | } 49 | 50 | - (void)didReceiveMemoryWarning { 51 | [super didReceiveMemoryWarning]; 52 | // Dispose of any resources that can be recreated. 53 | } 54 | -(NSMutableArray *)dataArr{ 55 | if (!_dataArr){ 56 | NSString *path =[[NSBundle mainBundle ]pathForResource:@"tagsData.plist" ofType:nil]; 57 | NSArray *dataArr =[NSArray arrayWithContentsOfFile:path]; 58 | NSMutableArray *tempArr =[NSMutableArray array]; 59 | for (NSDictionary *dict in dataArr){ 60 | TagsModel *model =[[TagsModel alloc]initWithTagsDict:dict]; 61 | [tempArr addObject:model]; 62 | } 63 | _dataArr =[tempArr copy]; 64 | } 65 | return _dataArr; 66 | } 67 | -(void)setUp{ 68 | 69 | SDLabTagsView *sdTagsView =[SDLabTagsView sdLabTagsViewWithTagsArr:self.dataArr]; 70 | sdTagsView.frame =CGRectMake(0,30,mDeviceWidth,300); 71 | [self.view addSubview:sdTagsView]; 72 | 73 | } 74 | 75 | /* 76 | #pragma mark - Navigation 77 | 78 | // In a storyboard-based application, you will often want to do a little preparation before navigation 79 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 80 | // Get the new view controller using [segue destinationViewController]. 81 | // Pass the selected object to the new view controller. 82 | } 83 | */ 84 | 85 | @end 86 | -------------------------------------------------------------------------------- /SDTagsView/SDCollectionTags/CollectionTagsViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // CollectionTagsViewController.m 3 | // SDTagsView 4 | // 5 | // Created by apple on 2017/2/22. 6 | // Copyright © 2017年 slowdony. All rights reserved. 7 | // 8 | /* 9 | 10 | github地址https://github.com/SlowDony/SDTagsView 11 | 12 | 标签使我们日常项目开发中经常遇见的,SDTagsView两种布局方式 13 | 14 | .UILabel 15 | .UICollectionView (推荐使用) 16 | 17 | 目前支持展示标签,自适应标签宽度. 18 | 点击新增标签,删除标签 19 | 20 | 我的邮箱:devslowdony@gmail.com 21 | 22 | 如果有好的建议或者意见 ,欢迎指出 , 您的支持是对我最大的鼓励,谢谢. 求STAR ..😆 23 | */ 24 | 25 | 26 | #import "CollectionTagsViewController.h" 27 | #import "SDHeader.h" 28 | #import "SDTagsView.h" 29 | #import "TagsModel.h" 30 | 31 | 32 | 33 | @interface CollectionTagsViewController () 34 | 35 | @property (nonatomic,strong)NSMutableArray *dataArr; 36 | @end 37 | 38 | @implementation CollectionTagsViewController 39 | 40 | - (void)viewDidLoad { 41 | [super viewDidLoad]; 42 | [self.navigationItem setTitle:self.navTitle]; 43 | [self.view setBackgroundColor:[UIColor whiteColor]]; 44 | 45 | [self setUp]; 46 | // Do any additional setup after loading the view. 47 | } 48 | 49 | - (void)didReceiveMemoryWarning { 50 | [super didReceiveMemoryWarning]; 51 | // Dispose of any resources that can be recreated. 52 | } 53 | 54 | -(NSMutableArray *)dataArr{ 55 | if (!_dataArr){ 56 | NSString *path =[[NSBundle mainBundle ]pathForResource:@"tagsData.plist" ofType:nil]; 57 | NSArray *dataArr =[NSArray arrayWithContentsOfFile:path]; 58 | NSMutableArray *tempArr =[NSMutableArray array]; 59 | for (NSDictionary *dict in dataArr){ 60 | TagsModel *model =[[TagsModel alloc]initWithTagsDict:dict]; 61 | [tempArr addObject:model]; 62 | } 63 | _dataArr =[tempArr copy]; 64 | } 65 | return _dataArr; 66 | } 67 | 68 | -(void)setUp{ 69 | 70 | SDTagsView *sdTagsView =[SDTagsView sdTagsViewWithTagsArr:self.dataArr]; 71 | sdTagsView.frame =CGRectMake(0,0,mDeviceWidth,300); 72 | [self.view addSubview:sdTagsView]; 73 | 74 | } 75 | /* 76 | #pragma mark - Navigation 77 | 78 | // In a storyboard-based application, you will often want to do a little preparation before navigation 79 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 80 | // Get the new view controller using [segue destinationViewController]. 81 | // Pass the selected object to the new view controller. 82 | } 83 | */ 84 | 85 | @end 86 | -------------------------------------------------------------------------------- /SDTagsView/APPDelegate/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // SDTagsView 4 | // 5 | // Created by apple on 2017/2/20. 6 | // Copyright © 2017年 slowdony. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | #import "MainViewController.h" 11 | @interface AppDelegate () 12 | 13 | @end 14 | 15 | @implementation AppDelegate 16 | 17 | 18 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 19 | // Override point for customization after application launch. 20 | MainViewController *v =[[MainViewController alloc]init]; 21 | UINavigationController *nav =[[UINavigationController alloc]init]; 22 | [nav addChildViewController:v]; 23 | self.window.rootViewController =nav; 24 | return YES; 25 | } 26 | 27 | 28 | - (void)applicationWillResignActive:(UIApplication *)application { 29 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 30 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. 31 | } 32 | 33 | 34 | - (void)applicationDidEnterBackground:(UIApplication *)application { 35 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 36 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 37 | } 38 | 39 | 40 | - (void)applicationWillEnterForeground:(UIApplication *)application { 41 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 42 | } 43 | 44 | 45 | - (void)applicationDidBecomeActive:(UIApplication *)application { 46 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 47 | } 48 | 49 | 50 | - (void)applicationWillTerminate:(UIApplication *)application { 51 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 52 | } 53 | 54 | 55 | @end 56 | -------------------------------------------------------------------------------- /SDTagsView/SDLabTags/SDLabTagsView.m: -------------------------------------------------------------------------------- 1 | // 2 | // SDLabTagsView.m 3 | // SDTagsView 4 | // 5 | // Created by apple on 2017/2/22. 6 | // Copyright © 2017年 slowdony. All rights reserved. 7 | // 8 | 9 | #import "SDLabTagsView.h" 10 | #import "SDHeader.h" 11 | #import "TagsModel.h" 12 | #import "SDHelper.h" 13 | @interface SDLabTagsView () 14 | { 15 | UIView *sdTagsView; 16 | } 17 | @property (nonatomic,strong)UILabel *tagsLab; 18 | @end 19 | @implementation SDLabTagsView 20 | 21 | /* 22 | // Only override drawRect: if you perform custom drawing. 23 | // An empty implementation adversely affects performance during animation. 24 | - (void)drawRect:(CGRect)rect { 25 | // Drawing code 26 | } 27 | */ 28 | 29 | - (instancetype)init 30 | { 31 | self = [super init]; 32 | if (self) { 33 | [self setUP]; 34 | 35 | } 36 | return self; 37 | } 38 | 39 | -(void)setUP{ 40 | // 创建标签容器 41 | sdTagsView = [[UIView alloc] init]; 42 | sdTagsView.frame = CGRectMake(0, 64, mDeviceWidth, 300); 43 | 44 | sdTagsView.autoresizingMask = UIViewAutoresizingFlexibleWidth; 45 | [self addSubview:sdTagsView]; 46 | } 47 | 48 | +(instancetype)sdLabTagsViewWithTagsArr:(NSArray *)tagsArr{ 49 | SDLabTagsView *sdLabTagsView =[[SDLabTagsView alloc]init]; 50 | sdLabTagsView.tagsArr =tagsArr; 51 | [sdLabTagsView setUItags:tagsArr]; 52 | return sdLabTagsView; 53 | } 54 | 55 | -(void)setUItags:(NSArray *)arr{ 56 | 57 | int width = 10; 58 | 59 | int j = 0; 60 | 61 | int row = 1; 62 | 63 | 64 | for (int i = 0 ; i < arr.count; i++) { 65 | 66 | TagsModel *model =arr[i]; 67 | 68 | int labWidth = [SDHelper widthForLabel:model.title fontSize:16]+10; 69 | UILabel *label = [[UILabel alloc] init]; 70 | label.frame = CGRectMake(5*j + width, row * 30, labWidth, 22); 71 | label.backgroundColor = [UIColor clearColor]; 72 | label.textColor = [UIColor blackColor]; 73 | label.text =model.title; 74 | label.textAlignment = NSTextAlignmentCenter; 75 | label.font = [UIFont systemFontOfSize:16]; 76 | label.numberOfLines = 1; 77 | label.layer.borderWidth = 1; 78 | label.textColor = [SDHelper getColor:model.color]; 79 | label.layer.borderColor = [SDHelper getColor:model.color].CGColor; 80 | 81 | 82 | 83 | 84 | [sdTagsView addSubview:label]; 85 | 86 | width = width + labWidth; 87 | 88 | j++; 89 | 90 | if (width > mDeviceWidth - 50) { 91 | 92 | j = 0; 93 | 94 | width = 10; 95 | 96 | row++; 97 | 98 | label.frame = CGRectMake(5*j + width,row * 30, labWidth, 22); 99 | 100 | width = width + labWidth; 101 | 102 | j++; 103 | 104 | } 105 | 106 | } 107 | 108 | } 109 | 110 | 111 | 112 | @end 113 | -------------------------------------------------------------------------------- /SDTagsView/SDCollectionTags/SDTagsView.m: -------------------------------------------------------------------------------- 1 | // 2 | // SDTagsView.m 3 | // SDTagsView 4 | // 5 | // Created by apple on 2017/2/20. 6 | // Copyright © 2017年 slowdony. All rights reserved. 7 | // 8 | 9 | #import "SDTagsView.h" 10 | 11 | #import "SDCollectionTagsViewCell.h" 12 | #import "SDHeader.h" 13 | #import "SDHelper.h" 14 | #import "TagsModel.h" 15 | #define SDRectangleTagMaxCoult 3 // 矩阵标签时,最多列数 16 | 17 | #define SDtagsView @"SDtagsView" 18 | @interface SDTagsView () 19 | < 20 | UICollectionViewDelegate, 21 | UICollectionViewDataSource, 22 | UICollectionViewDelegateFlowLayout 23 | > 24 | 25 | 26 | @property (nonatomic,strong)UICollectionView *collectionView; 27 | 28 | @property (nonatomic,strong)UIView *sdTagsView; 29 | @end 30 | @implementation SDTagsView 31 | 32 | /* 33 | // Only override drawRect: if you perform custom drawing. 34 | // An empty implementation adversely affects performance during animation. 35 | - (void)drawRect:(CGRect)rect { 36 | // Drawing code 37 | } 38 | */ 39 | +(instancetype)sdTagsViewWithTagsArr:(NSArray*)tagsArr{ 40 | SDTagsView *sdTagsView =[[SDTagsView alloc]init]; 41 | sdTagsView.tagsArr =[[NSArray alloc]initWithArray:tagsArr]; 42 | return sdTagsView; 43 | } 44 | - (instancetype)init 45 | { 46 | self = [super init]; 47 | if (self) { 48 | [self setUP]; 49 | } 50 | return self; 51 | } 52 | 53 | -(void)setUP{ 54 | 55 | [self addSubview:self.collectionView]; 56 | } 57 | 58 | 59 | 60 | - (UICollectionView *)collectionView { 61 | if (!_collectionView) { 62 | UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init]; 63 | flowLayout.minimumLineSpacing = 5; 64 | flowLayout.minimumInteritemSpacing = 5; 65 | _collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(15, 20, mDeviceWidth-30, mDeviceHeight-44) collectionViewLayout:flowLayout]; 66 | _collectionView.delegate = self; 67 | _collectionView.dataSource = self; 68 | 69 | [_collectionView setBackgroundColor:[UIColor clearColor]]; 70 | //注册 71 | [_collectionView registerClass:[SDCollectionTagsViewCell class] forCellWithReuseIdentifier:SDtagsView]; 72 | } 73 | return _collectionView; 74 | } 75 | - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section 76 | { 77 | return self.tagsArr.count; 78 | } 79 | 80 | - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 81 | { 82 | 83 | TagsModel *model =self.tagsArr[indexPath.row]; 84 | CGFloat width = [SDHelper widthForLabel:[NSString stringWithFormat:@"%@",model.title] fontSize:16]; 85 | return CGSizeMake(width+10,22); 86 | } 87 | - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 88 | { 89 | SDCollectionTagsViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:SDtagsView forIndexPath:indexPath]; 90 | TagsModel *model =self.tagsArr[indexPath.row]; 91 | 92 | [cell setValueWithModel:model]; 93 | return cell; 94 | } 95 | 96 | - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath 97 | { 98 | TagsModel *model =self.tagsArr[indexPath.row]; 99 | SDLog(@"index:%@",model.title); 100 | } 101 | 102 | @end 103 | -------------------------------------------------------------------------------- /SDTagsView/SDTagsModel/tagsData.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | title 7 | MATLAB 8 | color 9 | eb3027 10 | 11 | 12 | title 13 | JavaScript 14 | color 15 | 22b6ff 16 | 17 | 18 | title 19 | Java 20 | color 21 | 51b20a 22 | 23 | 24 | title 25 | Swift 26 | color 27 | 897be2 28 | 29 | 30 | title 31 | Java 32 | color 33 | eb3027 34 | 35 | 36 | title 37 | C 38 | color 39 | fa4040 40 | 41 | 42 | title 43 | Java 44 | color 45 | eb3027 46 | 47 | 48 | title 49 | Go 50 | color 51 | 22b6ff 52 | 53 | 54 | title 55 | C++ 56 | color 57 | 51b20a 58 | 59 | 60 | title 61 | PHP 62 | color 63 | 897be2 64 | 65 | 66 | title 67 | Swift 68 | color 69 | fa4040 70 | 71 | 72 | title 73 | Python 74 | color 75 | eb3027 76 | 77 | 78 | title 79 | Objective-C 80 | color 81 | fa4040 82 | 83 | 84 | title 85 | Java 86 | color 87 | 22b6ff 88 | 89 | 90 | title 91 | Objective-C 92 | color 93 | fd563b 94 | 95 | 96 | title 97 | Swift 98 | color 99 | 51b20a 100 | 101 | 102 | title 103 | C 104 | color 105 | 897be2 106 | 107 | 108 | title 109 | C++ 110 | color 111 | fa4040 112 | 113 | 114 | title 115 | C# 116 | color 117 | B1B1B1 118 | 119 | 120 | title 121 | Perl 122 | color 123 | 787878 124 | 125 | 126 | title 127 | Go 128 | color 129 | 3E3D3D 130 | 131 | 132 | title 133 | JavaScript 134 | color 135 | CC6600 136 | 137 | 138 | title 139 | R 140 | color 141 | CCFF00 142 | 143 | 144 | title 145 | Ruby 146 | color 147 | EDEBEA 148 | 149 | 150 | title 151 | MATLAB 152 | color 153 | 989799 154 | 155 | 156 | title 157 | PHP 158 | color 159 | 69A5EC 160 | 161 | 162 | 163 | -------------------------------------------------------------------------------- /SDTagsView.xcodeproj/xcuserdata/apple.xcuserdatad/xcschemes/SDTagsView.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 43 | 49 | 50 | 51 | 52 | 53 | 59 | 60 | 61 | 62 | 63 | 64 | 74 | 76 | 82 | 83 | 84 | 85 | 86 | 87 | 93 | 95 | 101 | 102 | 103 | 104 | 106 | 107 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /SDTagsView.xcodeproj/xcuserdata/slowdony.xcuserdatad/xcschemes/SDTagsView.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 43 | 49 | 50 | 51 | 52 | 53 | 59 | 60 | 61 | 62 | 63 | 64 | 74 | 76 | 82 | 83 | 84 | 85 | 86 | 87 | 93 | 95 | 101 | 102 | 103 | 104 | 106 | 107 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /SDTagsView/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 | 34 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /SDTagsView/MainViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // MainViewController.m 3 | // SDTagsView 4 | // 5 | // Created by apple on 2017/2/22. 6 | // Copyright © 2017年 slowdony. All rights reserved. 7 | // 8 | 9 | /* 10 | 11 | github地址https://github.com/SlowDony/SDTagsView 12 | 13 | 标签使我们日常项目开发中经常遇见的,SDTagsView两种布局方式 14 | 15 | .UILabel 16 | .UICollectionView (推荐使用) 17 | 18 | 目前支持展示标签,自适应标签宽度. 19 | 点击新增标签,删除标签 20 | 21 | 我的邮箱:devslowdony@gmail.com 22 | 23 | 如果有好的建议或者意见 ,欢迎指出 , 您的支持是对我最大的鼓励,谢谢. 求STAR ..😆 24 | */ 25 | 26 | 27 | #import "MainViewController.h" 28 | #import "SDHeader.h" 29 | #import "CollectionTagsViewController.h" 30 | #import "LabelTagsViewController.h" 31 | #import "SDEditTagsViewController.h" 32 | @interface MainViewController () 33 | < 34 | UITableViewDelegate, 35 | UITableViewDataSource 36 | > 37 | 38 | 39 | @property (nonatomic,strong)NSMutableArray *dataArr; 40 | @end 41 | 42 | @implementation MainViewController 43 | 44 | - (void)viewDidLoad { 45 | [super viewDidLoad]; 46 | [self.view setBackgroundColor:[UIColor whiteColor]]; 47 | self.navigationItem.title=@"标签列表"; 48 | self.view.backgroundColor=bjColor; 49 | [self setui]; 50 | // Do any additional setup after loading the view. 51 | } 52 | 53 | - (void)didReceiveMemoryWarning { 54 | [super didReceiveMemoryWarning]; 55 | // Dispose of any resources that can be recreated. 56 | } 57 | 58 | -(NSMutableArray *)dataArr{ 59 | if (!_dataArr) { 60 | NSArray * arr=@[@[@"利用collectionView布局tagsView",@"利用label布局tagsView"],@[@"编辑tagsView"]]; 61 | _dataArr =[NSMutableArray arrayWithArray:arr]; 62 | 63 | 64 | } 65 | return _dataArr; 66 | } 67 | 68 | -(void)setui{ 69 | 70 | // 71 | UITableView *tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, mDeviceWidth, mDeviceHeight) style:UITableViewStyleGrouped]; 72 | 73 | tableView.delegate = self; 74 | tableView.dataSource = self; 75 | tableView.showsVerticalScrollIndicator = NO; 76 | tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine; 77 | tableView.backgroundColor = [UIColor clearColor]; 78 | [self.view addSubview:tableView]; 79 | } 80 | #pragma mark ----------UITabelViewDataSource---------- 81 | -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 82 | { 83 | return self.dataArr.count; 84 | } 85 | 86 | -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 87 | { 88 | NSArray *arr =self.dataArr[section]; 89 | return arr.count; 90 | } 91 | 92 | -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 93 | { 94 | static NSString *cellId = @"cellID"; 95 | UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId]; 96 | if (cell == nil) { 97 | 98 | cell =[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId]; 99 | } 100 | //配置数据 101 | NSArray *arr =self.dataArr[indexPath.section]; 102 | cell.textLabel.text =arr[indexPath.row]; 103 | return cell; 104 | } 105 | 106 | 107 | #pragma mark ----------UITabelViewDelegate---------- 108 | -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 109 | { 110 | [tableView deselectRowAtIndexPath:indexPath animated:YES]; 111 | 112 | NSArray *arr =self.dataArr[indexPath.section]; 113 | if (indexPath.section==0){ 114 | switch (indexPath.row) { 115 | case 0: 116 | { 117 | CollectionTagsViewController *v =[[CollectionTagsViewController alloc]init]; 118 | v.navTitle =arr[indexPath.row]; 119 | [self.navigationController pushViewController:v animated:YES]; 120 | } 121 | break; 122 | case 1: 123 | { 124 | LabelTagsViewController *v =[[LabelTagsViewController alloc]init]; 125 | v.navTitle =arr[indexPath.row]; 126 | [self.navigationController pushViewController:v animated:YES]; 127 | } 128 | break; 129 | 130 | default: 131 | break; 132 | 133 | } 134 | }else { 135 | SDEditTagsViewController *v =[[SDEditTagsViewController alloc]init]; 136 | v.navTitle =arr[indexPath.row]; 137 | [self.navigationController pushViewController:v animated:YES]; 138 | } 139 | 140 | 141 | } 142 | 143 | - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 144 | { 145 | return 50; 146 | } 147 | 148 | -(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{ 149 | return 20; 150 | } 151 | -(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{ 152 | return 0.1; 153 | } 154 | 155 | /* 156 | #pragma mark - Navigation 157 | 158 | // In a storyboard-based application, you will often want to do a little preparation before navigation 159 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 160 | // Get the new view controller using [segue destinationViewController]. 161 | // Pass the selected object to the new view controller. 162 | } 163 | */ 164 | 165 | @end 166 | -------------------------------------------------------------------------------- /SDTagsView/SDEditTagsView/SDCollectionTagsView.m: -------------------------------------------------------------------------------- 1 | // 2 | // SDCollectionTagsView.m 3 | // SDTagsView 4 | // 5 | // Created by slowdony on 2017/7/19. 6 | // Copyright © 2017年 slowdony. All rights reserved. 7 | // 8 | 9 | #import "SDCollectionTagsView.h" 10 | 11 | #import "SDCollectionTagsViewCell.h" 12 | 13 | #import "TagsModel.h" 14 | #import "SDHelper.h" 15 | #import "SDHeader.h" 16 | 17 | #define SDtagsView @"SDtagsView" 18 | #define SDtagsHeadView @"SDtagsHeadView" 19 | 20 | @interface SDCollectionTagsView () 21 | < 22 | UICollectionViewDelegate, 23 | UICollectionViewDataSource 24 | > 25 | 26 | /** 27 | 存放cell唯一标识符 28 | */ 29 | @property (nonatomic,strong)NSMutableDictionary *cellIdDic; 30 | 31 | @end 32 | @implementation SDCollectionTagsView 33 | 34 | /* 35 | // Only override drawRect: if you perform custom drawing. 36 | // An empty implementation adversely affects performance during animation. 37 | - (void)drawRect:(CGRect)rect { 38 | // Drawing code 39 | } 40 | */ 41 | 42 | -(NSMutableDictionary *)cellIdDic{ 43 | if (!_cellIdDic){ 44 | _cellIdDic =[NSMutableDictionary dictionary]; 45 | } 46 | return _cellIdDic; 47 | } 48 | 49 | - (instancetype)initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout 50 | { 51 | self = [super initWithFrame:frame collectionViewLayout:layout]; 52 | if (self) { 53 | self.delegate = self; 54 | self.dataSource = self; 55 | 56 | [self setBackgroundColor:[UIColor clearColor]]; 57 | 58 | //注册 59 | [self registerClass:[SDCollectionTagsViewCell class] forCellWithReuseIdentifier:SDtagsView]; 60 | //注册头部 61 | [self registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:SDtagsHeadView]; 62 | 63 | } 64 | return self; 65 | } 66 | #pragma mark - UICollectionViewDataSource 67 | - (NSInteger) numberOfSectionsInCollectionView:(UICollectionView *)collectionView 68 | { 69 | return self.dataArr.count; 70 | } 71 | 72 | - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section 73 | { 74 | NSArray *arr =self.dataArr[section]; 75 | 76 | return arr.count; 77 | } 78 | 79 | - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 80 | { 81 | 82 | NSArray *arr =self.dataArr[indexPath.section]; 83 | TagsModel *model =arr[indexPath.row]; 84 | CGFloat width = [SDHelper widthForLabel:[NSString stringWithFormat:@"%@",model.title] fontSize:16]; 85 | return CGSizeMake(width+10,32); 86 | 87 | } 88 | - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 89 | { 90 | //每次从字典中取出根据IndexPath取出唯一标识符 91 | 92 | SDCollectionTagsViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:SDtagsView forIndexPath:indexPath]; 93 | 94 | NSArray *arr =self.dataArr[indexPath.section]; 95 | TagsModel *model =arr[indexPath.row]; 96 | 97 | [cell setValueWithModel:model]; 98 | return cell; 99 | } 100 | 101 | - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath 102 | { 103 | NSArray *arr =self.dataArr[indexPath.section]; 104 | 105 | TagsModel *model =arr[indexPath.row]; 106 | 107 | if ([self.sd_delegate respondsToSelector:@selector(SDCollectionTagsView:didSelectItemAtIndexPath:)]){ 108 | [self.sd_delegate SDCollectionTagsView:self didSelectItemAtIndexPath:indexPath]; 109 | } 110 | 111 | SDLog(@"index:%@",model.title); 112 | } 113 | 114 | //头部试图大小 115 | -(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section 116 | { 117 | return CGSizeMake(mDeviceWidth, 30); 118 | } 119 | //头视图 120 | -(UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath{ 121 | 122 | UICollectionReusableView *headView =(UICollectionReusableView *)[collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:SDtagsHeadView forIndexPath:indexPath]; 123 | UILabel *titlelabel =[[UILabel alloc]init]; 124 | titlelabel.frame =CGRectMake(20, 0, 100, 30); 125 | titlelabel.textColor =fontHightColor; 126 | 127 | UILabel *detaillabel =[[UILabel alloc]init]; 128 | detaillabel.frame =CGRectMake(100, 0, mDeviceWidth-100, 30); 129 | detaillabel.textColor =fontNomalColor; 130 | detaillabel.font =[UIFont systemFontOfSize:12]; 131 | titlelabel.textColor =fontHightColor; 132 | if (indexPath.section==0){ 133 | titlelabel.text =@"我的标签"; 134 | detaillabel.text =@"(点击我的标签可以移除)"; 135 | 136 | } 137 | else if(indexPath.section==1){ 138 | titlelabel.text =@"所有标签"; 139 | detaillabel.text =@"(点击所有标签添加到我的标签)"; 140 | } 141 | 142 | 143 | //头部view下划线 144 | UIView *line =[[UIView alloc]init]; 145 | line.backgroundColor =borderCol; 146 | line.frame =CGRectMake(0, 30, mDeviceWidth, 0.5); 147 | [headView addSubview:line]; 148 | [headView addSubview:titlelabel]; 149 | [headView addSubview:detaillabel]; 150 | return headView; 151 | } 152 | 153 | @end 154 | -------------------------------------------------------------------------------- /SDTagsView/SDEditTagsView/SDCollectionTagsFlowLayout.m: -------------------------------------------------------------------------------- 1 | // 2 | // SDCollectionTagsFlowLayout.m 3 | // SDTagsView 4 | // 5 | // Created by slowdony on 2017/9/23. 6 | // Copyright © 2017年 slowdony. All rights reserved. 7 | // 8 | 9 | #import "SDCollectionTagsFlowLayout.h" 10 | 11 | @interface SDCollectionTagsFlowLayout(){ 12 | //在居中对齐的时候需要知道这行所有cell的宽度总和 13 | CGFloat _sumWidth ; 14 | } 15 | @end 16 | @implementation SDCollectionTagsFlowLayout 17 | 18 | -(instancetype)init{ 19 | self = [super init]; 20 | if (self){ 21 | self.scrollDirection = UICollectionViewScrollDirectionVertical; 22 | self.minimumLineSpacing = 10; 23 | self.minimumInteritemSpacing = 10; 24 | self.sectionInset = UIEdgeInsetsMake(5, 10, 5, 10); 25 | _betweenOfCell = 10.0; 26 | _cellType = TagsTypeWithLeft; //默认左对齐 27 | } 28 | return self; 29 | } 30 | -(void)setBetweenOfCell:(CGFloat)betweenOfCell{ 31 | _betweenOfCell = betweenOfCell; 32 | self.minimumInteritemSpacing = betweenOfCell; 33 | } 34 | -(instancetype)initWthType:(TagsType )cellType{ 35 | self = [super init]; 36 | if (self){ 37 | self.scrollDirection = UICollectionViewScrollDirectionVertical; 38 | self.minimumLineSpacing = 5; 39 | self.minimumInteritemSpacing = 5; 40 | self.sectionInset = UIEdgeInsetsMake(5, 20, 5, 20); 41 | 42 | _cellType = cellType; 43 | } 44 | return self; 45 | } 46 | 47 | - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect { 48 | NSArray * layoutAttributes_t = [super layoutAttributesForElementsInRect:rect]; 49 | NSArray * layoutAttributes = [[NSArray alloc]initWithArray:layoutAttributes_t copyItems:YES]; 50 | //用来临时存放一行的Cell数组 51 | NSMutableArray * layoutAttributesTemp = [[NSMutableArray alloc]init]; 52 | for (int index = 0; index < layoutAttributes.count ; index++) { 53 | 54 | UICollectionViewLayoutAttributes *currentAttr = layoutAttributes[index]; // 当前cell的位置信息 55 | UICollectionViewLayoutAttributes *previousAttr = index == 0 ? nil : layoutAttributes[index-1]; // 上一个cell 的位置信 56 | UICollectionViewLayoutAttributes *nextAttr = index + 1 == layoutAttributes.count ? 57 | nil : layoutAttributes[index+1];//下一个cell 位置信息 58 | 59 | //加入临时数组 60 | [layoutAttributesTemp addObject:currentAttr]; 61 | _sumWidth += currentAttr.frame.size.width; 62 | 63 | CGFloat previousY = previousAttr == nil ? 0 : CGRectGetMaxY(previousAttr.frame); 64 | CGFloat currentY = CGRectGetMaxY(currentAttr.frame); 65 | CGFloat nextY = nextAttr == nil ? 0 : CGRectGetMaxY(nextAttr.frame); 66 | //如果当前cell是单独一行 67 | if (currentY != previousY && currentY != nextY){ 68 | if ([currentAttr.representedElementKind isEqualToString:UICollectionElementKindSectionHeader]) { 69 | [layoutAttributesTemp removeAllObjects]; 70 | _sumWidth = 0.0; 71 | }else if ([currentAttr.representedElementKind isEqualToString:UICollectionElementKindSectionFooter]){ 72 | [layoutAttributesTemp removeAllObjects]; 73 | _sumWidth = 0.0; 74 | }else{ 75 | [self setCellFrameWith:layoutAttributesTemp]; 76 | } 77 | } 78 | 79 | else if( currentY != nextY) { 80 | [self setCellFrameWith:layoutAttributesTemp]; 81 | } 82 | } 83 | return layoutAttributes; 84 | } 85 | 86 | -(void)setCellFrameWith:(NSMutableArray*)layoutAttributes{ 87 | CGFloat nowWidth = 0.0; 88 | switch (_cellType) { 89 | case TagsTypeWithLeft: 90 | nowWidth = self.sectionInset.left; 91 | for (UICollectionViewLayoutAttributes * attributes in layoutAttributes) { 92 | CGRect nowFrame = attributes.frame; 93 | nowFrame.origin.x = nowWidth; 94 | attributes.frame = nowFrame; 95 | nowWidth += nowFrame.size.width + self.betweenOfCell; 96 | } 97 | _sumWidth = 0.0; 98 | [layoutAttributes removeAllObjects]; 99 | break; 100 | case TagsTypeWithCenter: 101 | nowWidth = (self.collectionView.frame.size.width - _sumWidth - ((layoutAttributes.count - 1) * _betweenOfCell)) / 2; 102 | for (UICollectionViewLayoutAttributes * attributes in layoutAttributes) { 103 | CGRect nowFrame = attributes.frame; 104 | nowFrame.origin.x = nowWidth; 105 | attributes.frame = nowFrame; 106 | nowWidth += nowFrame.size.width + self.betweenOfCell; 107 | } 108 | _sumWidth = 0.0; 109 | [layoutAttributes removeAllObjects]; 110 | break; 111 | 112 | case TagsTypeWithRight: 113 | nowWidth = self.collectionView.frame.size.width - self.sectionInset.right; 114 | for (NSInteger index = layoutAttributes.count - 1 ; index >= 0 ; index-- ) { 115 | UICollectionViewLayoutAttributes * attributes = layoutAttributes[index]; 116 | CGRect nowFrame = attributes.frame; 117 | nowFrame.origin.x = nowWidth - nowFrame.size.width; 118 | attributes.frame = nowFrame; 119 | nowWidth = nowWidth - nowFrame.size.width - _betweenOfCell; 120 | } 121 | _sumWidth = 0.0; 122 | [layoutAttributes removeAllObjects]; 123 | break; 124 | } 125 | } 126 | 127 | @end 128 | -------------------------------------------------------------------------------- /SDTagsView/SDEditTagsView/SDEditTagsViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // SDEditTagsViewController.m 3 | // SDTagsView 4 | // 5 | // Created by slowdony on 2017/7/19. 6 | // Copyright © 2017年 slowdony. All rights reserved. 7 | // 8 | 9 | /* 10 | 11 | github地址https://github.com/SlowDony/SDTagsView 12 | 13 | 标签使我们日常项目开发中经常遇见的,SDTagsView两种布局方式 14 | 15 | .UILabel 16 | .UICollectionView (推荐使用) 17 | 18 | 目前支持展示标签,自适应标签宽度. 19 | 点击新增标签,删除标签 20 | 21 | 我的邮箱:devslowdony@gmail.com 22 | 23 | 如果有好的建议或者意见 ,欢迎指出 , 您的支持是对我最大的鼓励,谢谢. 求STAR ..😆 24 | */ 25 | 26 | 27 | #import "SDEditTagsViewController.h" 28 | #import "TagsModel.h" 29 | #import "SDCollectionTagsView.h" 30 | #import "SDCollectionTagsFlowLayout.h" 31 | #import "SDHeader.h" 32 | 33 | #define tagsDataFilepath [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"tagsData.data"] 34 | @interface SDEditTagsViewController () 35 | 36 | 37 | /** 38 | 我的标签数据 39 | */ 40 | @property (nonatomic,strong)NSMutableArray *myTagsArr; 41 | 42 | /** 43 | 更多标签数据 44 | */ 45 | @property (nonatomic,strong)NSMutableArray *moreTagsArr; 46 | 47 | /** 48 | 所有标签数据 49 | */ 50 | @property (nonatomic,strong)NSMutableArray *dataArr; 51 | 52 | /** 53 | SDCollectionTagsView 54 | */ 55 | @property (nonatomic,strong)SDCollectionTagsView *tagsView; 56 | 57 | @end 58 | 59 | @implementation SDEditTagsViewController 60 | 61 | -(NSMutableArray *)myTagsArr{ 62 | if (!_myTagsArr) { 63 | NSMutableArray *dataArr = [NSKeyedUnarchiver unarchiveObjectWithFile:tagsDataFilepath]; 64 | if (dataArr.count>0) { 65 | _myTagsArr = [NSMutableArray arrayWithArray:[dataArr objectAtIndex:0]]; 66 | } 67 | if (!_myTagsArr) { 68 | _myTagsArr =[NSMutableArray array]; 69 | } 70 | } 71 | return _myTagsArr; 72 | } 73 | 74 | -(NSMutableArray *)moreTagsArr{ 75 | if (!_moreTagsArr){ 76 | NSMutableArray *dataArr = [NSKeyedUnarchiver unarchiveObjectWithFile:tagsDataFilepath]; 77 | if (dataArr.count>0) { 78 | _moreTagsArr = [NSMutableArray arrayWithArray:[dataArr objectAtIndex:1]]; 79 | } 80 | 81 | if (!_moreTagsArr) { 82 | NSString *path =[[NSBundle mainBundle]pathForResource:@"tagsData" ofType:@"plist"]; 83 | NSArray *arr =[NSArray arrayWithContentsOfFile:path]; 84 | NSMutableArray *emptyArr =[NSMutableArray array]; 85 | for (NSDictionary *dic in arr) { 86 | TagsModel *tagsModel =[TagsModel tagsModelWithDict:dic]; 87 | [emptyArr addObject:tagsModel]; 88 | } 89 | _moreTagsArr =[NSMutableArray arrayWithArray:emptyArr]; 90 | } 91 | } 92 | return _moreTagsArr; 93 | } 94 | 95 | -(NSMutableArray *)dataArr{ 96 | if (!_dataArr){ 97 | _dataArr =[NSMutableArray array]; 98 | [_dataArr addObject:self.myTagsArr]; 99 | [_dataArr addObject:self.moreTagsArr]; 100 | } 101 | return _dataArr; 102 | } 103 | 104 | 105 | -(SDCollectionTagsView *)tagsView{ 106 | if (!_tagsView){ 107 | SDCollectionTagsFlowLayout *flowLayout = [[SDCollectionTagsFlowLayout alloc]initWthType:TagsTypeWithLeft]; 108 | flowLayout.betweenOfCell = 10; 109 | _tagsView =[[SDCollectionTagsView alloc]initWithFrame:CGRectMake(0, 10, mDeviceWidth, mDeviceHeight) collectionViewLayout:flowLayout]; 110 | _tagsView.sd_delegate =self; 111 | } 112 | return _tagsView; 113 | } 114 | 115 | - (void)viewDidLoad { 116 | [super viewDidLoad]; 117 | self.title =self.navTitle; 118 | self.view.backgroundColor =[UIColor whiteColor]; 119 | // Do any additional setup after loading the view. 120 | [self.view addSubview:self.tagsView]; 121 | self.tagsView.dataArr =[NSMutableArray arrayWithArray:self.dataArr]; 122 | [self.tagsView reloadData]; 123 | 124 | } 125 | - (void)didReceiveMemoryWarning { 126 | [super didReceiveMemoryWarning]; 127 | // Dispose of any resources that can be recreated. 128 | } 129 | 130 | #pragma mark - SDCollectionTagsViewDelegate 131 | 132 | -(void)SDCollectionTagsView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{ 133 | 134 | 135 | TagsModel *tagsModel; 136 | if (indexPath.section ==0) //我的标签 137 | { 138 | tagsModel = self.myTagsArr[indexPath.row]; 139 | [self.myTagsArr removeObjectAtIndex:indexPath.row]; 140 | [self.moreTagsArr insertObject:tagsModel atIndex:0]; 141 | 142 | [self.tagsView moveItemAtIndexPath:indexPath toIndexPath:[NSIndexPath indexPathForItem:0 inSection:1]]; 143 | } 144 | 145 | if (indexPath.section ==1) //所有标签 146 | { 147 | tagsModel =self.moreTagsArr[indexPath.row]; 148 | [self.moreTagsArr removeObjectAtIndex:indexPath.row]; 149 | [self.myTagsArr insertObject:tagsModel atIndex:0]; 150 | 151 | [self.tagsView moveItemAtIndexPath:indexPath toIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]]; 152 | 153 | } 154 | [self.dataArr removeAllObjects]; 155 | [self.dataArr addObject:self.myTagsArr]; 156 | [self.dataArr addObject:self.moreTagsArr]; 157 | 158 | [NSKeyedArchiver archiveRootObject:self.dataArr toFile:tagsDataFilepath]; 159 | 160 | 161 | 162 | 163 | } 164 | /* 165 | #pragma mark - Navigation 166 | 167 | // In a storyboard-based application, you will often want to do a little preparation before navigation 168 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 169 | // Get the new view controller using [segue destinationViewController]. 170 | // Pass the selected object to the new view controller. 171 | } 172 | */ 173 | 174 | @end 175 | -------------------------------------------------------------------------------- /SDTagsView.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1880325A1E5D3A1300DD7551 /* MainViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 188032591E5D3A1300DD7551 /* MainViewController.m */; }; 11 | 18BE89C41E5ADCBD00BA5AC9 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 18BE89C31E5ADCBD00BA5AC9 /* main.m */; }; 12 | 18BE89CD1E5ADCBD00BA5AC9 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 18BE89CB1E5ADCBD00BA5AC9 /* Main.storyboard */; }; 13 | 18BE89CF1E5ADCBD00BA5AC9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 18BE89CE1E5ADCBD00BA5AC9 /* Assets.xcassets */; }; 14 | 18BE89D21E5ADCBD00BA5AC9 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 18BE89D01E5ADCBD00BA5AC9 /* LaunchScreen.storyboard */; }; 15 | 18BE89DD1E5ADCBD00BA5AC9 /* SDTagsViewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 18BE89DC1E5ADCBD00BA5AC9 /* SDTagsViewTests.m */; }; 16 | 18BE89E81E5ADCBD00BA5AC9 /* SDTagsViewUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = 18BE89E71E5ADCBD00BA5AC9 /* SDTagsViewUITests.m */; }; 17 | EF01A73B1F2247DD00985FBE /* SDEditTagsView.gif in Resources */ = {isa = PBXBuildFile; fileRef = EF01A73A1F2247DD00985FBE /* SDEditTagsView.gif */; }; 18 | EF0740CF1F64423300B24854 /* SDCollectionTagsViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = EF0740CE1F64423300B24854 /* SDCollectionTagsViewCell.m */; }; 19 | EFD248BC1F76254F00355CED /* SDCollectionTagsFlowLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = EFD248BB1F76254F00355CED /* SDCollectionTagsFlowLayout.m */; }; 20 | EFE0413B1F1FAB8300995112 /* SDEditTagsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = EFE0413A1F1FAB8300995112 /* SDEditTagsViewController.m */; }; 21 | EFE041411F1FB3BA00995112 /* SDCollectionTagsView.m in Sources */ = {isa = PBXBuildFile; fileRef = EFE041401F1FB3BA00995112 /* SDCollectionTagsView.m */; }; 22 | EFE041441F1FB63400995112 /* SDHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = EFE041431F1FB63400995112 /* SDHelper.m */; }; 23 | EFF2610D1F1B106100EEEEC8 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = EFF2610A1F1B106100EEEEC8 /* AppDelegate.m */; }; 24 | EFF2610E1F1B106100EEEEC8 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = EFF2610C1F1B106100EEEEC8 /* ViewController.m */; }; 25 | EFF261141F1B107200EEEEC8 /* CollectionTagsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = EFF261111F1B107200EEEEC8 /* CollectionTagsViewController.m */; }; 26 | EFF261151F1B107200EEEEC8 /* SDTagsView.m in Sources */ = {isa = PBXBuildFile; fileRef = EFF261131F1B107200EEEEC8 /* SDTagsView.m */; }; 27 | EFF2611F1F1B108400EEEEC8 /* LabelTagsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = EFF261181F1B108400EEEEC8 /* LabelTagsViewController.m */; }; 28 | EFF261201F1B108400EEEEC8 /* SDLabTagsView.m in Sources */ = {isa = PBXBuildFile; fileRef = EFF2611A1F1B108400EEEEC8 /* SDLabTagsView.m */; }; 29 | EFF261211F1B108400EEEEC8 /* tagsData.plist in Resources */ = {isa = PBXBuildFile; fileRef = EFF2611C1F1B108400EEEEC8 /* tagsData.plist */; }; 30 | EFF261221F1B108400EEEEC8 /* TagsModel.m in Sources */ = {isa = PBXBuildFile; fileRef = EFF2611E1F1B108400EEEEC8 /* TagsModel.m */; }; 31 | EFF261281F1B4B7E00EEEEC8 /* SDTagsView.png in Resources */ = {isa = PBXBuildFile; fileRef = EFF261271F1B4B7E00EEEEC8 /* SDTagsView.png */; }; 32 | EFF2612A1F1B4B8600EEEEC8 /* SDTagsView.gif in Resources */ = {isa = PBXBuildFile; fileRef = EFF261291F1B4B8600EEEEC8 /* SDTagsView.gif */; }; 33 | /* End PBXBuildFile section */ 34 | 35 | /* Begin PBXContainerItemProxy section */ 36 | 18BE89D91E5ADCBD00BA5AC9 /* PBXContainerItemProxy */ = { 37 | isa = PBXContainerItemProxy; 38 | containerPortal = 18BE89B71E5ADCBD00BA5AC9 /* Project object */; 39 | proxyType = 1; 40 | remoteGlobalIDString = 18BE89BE1E5ADCBD00BA5AC9; 41 | remoteInfo = SDTagsView; 42 | }; 43 | 18BE89E41E5ADCBD00BA5AC9 /* PBXContainerItemProxy */ = { 44 | isa = PBXContainerItemProxy; 45 | containerPortal = 18BE89B71E5ADCBD00BA5AC9 /* Project object */; 46 | proxyType = 1; 47 | remoteGlobalIDString = 18BE89BE1E5ADCBD00BA5AC9; 48 | remoteInfo = SDTagsView; 49 | }; 50 | /* End PBXContainerItemProxy section */ 51 | 52 | /* Begin PBXFileReference section */ 53 | 188032581E5D3A1300DD7551 /* MainViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MainViewController.h; sourceTree = ""; }; 54 | 188032591E5D3A1300DD7551 /* MainViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MainViewController.m; sourceTree = ""; }; 55 | 18BE89BF1E5ADCBD00BA5AC9 /* SDTagsView.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SDTagsView.app; sourceTree = BUILT_PRODUCTS_DIR; }; 56 | 18BE89C31E5ADCBD00BA5AC9 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 57 | 18BE89CC1E5ADCBD00BA5AC9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 58 | 18BE89CE1E5ADCBD00BA5AC9 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 59 | 18BE89D11E5ADCBD00BA5AC9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 60 | 18BE89D31E5ADCBD00BA5AC9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 61 | 18BE89D81E5ADCBD00BA5AC9 /* SDTagsViewTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SDTagsViewTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 62 | 18BE89DC1E5ADCBD00BA5AC9 /* SDTagsViewTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDTagsViewTests.m; sourceTree = ""; }; 63 | 18BE89DE1E5ADCBD00BA5AC9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 64 | 18BE89E31E5ADCBD00BA5AC9 /* SDTagsViewUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SDTagsViewUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 65 | 18BE89E71E5ADCBD00BA5AC9 /* SDTagsViewUITests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDTagsViewUITests.m; sourceTree = ""; }; 66 | 18BE89E91E5ADCBD00BA5AC9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 67 | 18BE89F91E5ADEAF00BA5AC9 /* SDHeader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDHeader.h; sourceTree = ""; }; 68 | EF01A73A1F2247DD00985FBE /* SDEditTagsView.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = SDEditTagsView.gif; sourceTree = ""; }; 69 | EF0740CD1F64423300B24854 /* SDCollectionTagsViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDCollectionTagsViewCell.h; sourceTree = ""; }; 70 | EF0740CE1F64423300B24854 /* SDCollectionTagsViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDCollectionTagsViewCell.m; sourceTree = ""; }; 71 | EFD248BA1F76254F00355CED /* SDCollectionTagsFlowLayout.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDCollectionTagsFlowLayout.h; sourceTree = ""; }; 72 | EFD248BB1F76254F00355CED /* SDCollectionTagsFlowLayout.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDCollectionTagsFlowLayout.m; sourceTree = ""; }; 73 | EFE041391F1FAB8300995112 /* SDEditTagsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDEditTagsViewController.h; sourceTree = ""; }; 74 | EFE0413A1F1FAB8300995112 /* SDEditTagsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDEditTagsViewController.m; sourceTree = ""; }; 75 | EFE0413F1F1FB3BA00995112 /* SDCollectionTagsView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDCollectionTagsView.h; sourceTree = ""; }; 76 | EFE041401F1FB3BA00995112 /* SDCollectionTagsView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDCollectionTagsView.m; sourceTree = ""; }; 77 | EFE041421F1FB63400995112 /* SDHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDHelper.h; sourceTree = ""; }; 78 | EFE041431F1FB63400995112 /* SDHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDHelper.m; sourceTree = ""; }; 79 | EFF261091F1B106100EEEEC8 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 80 | EFF2610A1F1B106100EEEEC8 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 81 | EFF2610B1F1B106100EEEEC8 /* ViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 82 | EFF2610C1F1B106100EEEEC8 /* ViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 83 | EFF261101F1B107200EEEEC8 /* CollectionTagsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CollectionTagsViewController.h; sourceTree = ""; }; 84 | EFF261111F1B107200EEEEC8 /* CollectionTagsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CollectionTagsViewController.m; sourceTree = ""; }; 85 | EFF261121F1B107200EEEEC8 /* SDTagsView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDTagsView.h; sourceTree = ""; }; 86 | EFF261131F1B107200EEEEC8 /* SDTagsView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDTagsView.m; sourceTree = ""; }; 87 | EFF261171F1B108400EEEEC8 /* LabelTagsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LabelTagsViewController.h; sourceTree = ""; }; 88 | EFF261181F1B108400EEEEC8 /* LabelTagsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LabelTagsViewController.m; sourceTree = ""; }; 89 | EFF261191F1B108400EEEEC8 /* SDLabTagsView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLabTagsView.h; sourceTree = ""; }; 90 | EFF2611A1F1B108400EEEEC8 /* SDLabTagsView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLabTagsView.m; sourceTree = ""; }; 91 | EFF2611C1F1B108400EEEEC8 /* tagsData.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = tagsData.plist; sourceTree = ""; }; 92 | EFF2611D1F1B108400EEEEC8 /* TagsModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TagsModel.h; sourceTree = ""; }; 93 | EFF2611E1F1B108400EEEEC8 /* TagsModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TagsModel.m; sourceTree = ""; }; 94 | EFF261271F1B4B7E00EEEEC8 /* SDTagsView.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = SDTagsView.png; sourceTree = ""; }; 95 | EFF261291F1B4B8600EEEEC8 /* SDTagsView.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = SDTagsView.gif; sourceTree = ""; }; 96 | /* End PBXFileReference section */ 97 | 98 | /* Begin PBXFrameworksBuildPhase section */ 99 | 18BE89BC1E5ADCBD00BA5AC9 /* Frameworks */ = { 100 | isa = PBXFrameworksBuildPhase; 101 | buildActionMask = 2147483647; 102 | files = ( 103 | ); 104 | runOnlyForDeploymentPostprocessing = 0; 105 | }; 106 | 18BE89D51E5ADCBD00BA5AC9 /* Frameworks */ = { 107 | isa = PBXFrameworksBuildPhase; 108 | buildActionMask = 2147483647; 109 | files = ( 110 | ); 111 | runOnlyForDeploymentPostprocessing = 0; 112 | }; 113 | 18BE89E01E5ADCBD00BA5AC9 /* Frameworks */ = { 114 | isa = PBXFrameworksBuildPhase; 115 | buildActionMask = 2147483647; 116 | files = ( 117 | ); 118 | runOnlyForDeploymentPostprocessing = 0; 119 | }; 120 | /* End PBXFrameworksBuildPhase section */ 121 | 122 | /* Begin PBXGroup section */ 123 | 18BE89B61E5ADCBD00BA5AC9 = { 124 | isa = PBXGroup; 125 | children = ( 126 | 18BE89C11E5ADCBD00BA5AC9 /* SDTagsView */, 127 | 18BE89DB1E5ADCBD00BA5AC9 /* SDTagsViewTests */, 128 | 18BE89E61E5ADCBD00BA5AC9 /* SDTagsViewUITests */, 129 | 18BE89C01E5ADCBD00BA5AC9 /* Products */, 130 | ); 131 | sourceTree = ""; 132 | }; 133 | 18BE89C01E5ADCBD00BA5AC9 /* Products */ = { 134 | isa = PBXGroup; 135 | children = ( 136 | 18BE89BF1E5ADCBD00BA5AC9 /* SDTagsView.app */, 137 | 18BE89D81E5ADCBD00BA5AC9 /* SDTagsViewTests.xctest */, 138 | 18BE89E31E5ADCBD00BA5AC9 /* SDTagsViewUITests.xctest */, 139 | ); 140 | name = Products; 141 | sourceTree = ""; 142 | }; 143 | 18BE89C11E5ADCBD00BA5AC9 /* SDTagsView */ = { 144 | isa = PBXGroup; 145 | children = ( 146 | EFF261081F1B106100EEEEC8 /* APPDelegate */, 147 | EFF2610F1F1B107200EEEEC8 /* SDCollectionTags */, 148 | EFF261161F1B108400EEEEC8 /* SDLabTags */, 149 | EFF2611B1F1B108400EEEEC8 /* SDTagsModel */, 150 | EFE041381F1FAB6D00995112 /* SDEditTagsView */, 151 | 188032581E5D3A1300DD7551 /* MainViewController.h */, 152 | 188032591E5D3A1300DD7551 /* MainViewController.m */, 153 | 18BE89F91E5ADEAF00BA5AC9 /* SDHeader.h */, 154 | EFE041421F1FB63400995112 /* SDHelper.h */, 155 | EFE041431F1FB63400995112 /* SDHelper.m */, 156 | 18BE89CB1E5ADCBD00BA5AC9 /* Main.storyboard */, 157 | 18BE89CE1E5ADCBD00BA5AC9 /* Assets.xcassets */, 158 | 18BE89D01E5ADCBD00BA5AC9 /* LaunchScreen.storyboard */, 159 | 18BE89D31E5ADCBD00BA5AC9 /* Info.plist */, 160 | 18BE89C21E5ADCBD00BA5AC9 /* Supporting Files */, 161 | ); 162 | path = SDTagsView; 163 | sourceTree = ""; 164 | }; 165 | 18BE89C21E5ADCBD00BA5AC9 /* Supporting Files */ = { 166 | isa = PBXGroup; 167 | children = ( 168 | EF01A73A1F2247DD00985FBE /* SDEditTagsView.gif */, 169 | EFF261291F1B4B8600EEEEC8 /* SDTagsView.gif */, 170 | EFF261271F1B4B7E00EEEEC8 /* SDTagsView.png */, 171 | 18BE89C31E5ADCBD00BA5AC9 /* main.m */, 172 | ); 173 | name = "Supporting Files"; 174 | sourceTree = ""; 175 | }; 176 | 18BE89DB1E5ADCBD00BA5AC9 /* SDTagsViewTests */ = { 177 | isa = PBXGroup; 178 | children = ( 179 | 18BE89DC1E5ADCBD00BA5AC9 /* SDTagsViewTests.m */, 180 | 18BE89DE1E5ADCBD00BA5AC9 /* Info.plist */, 181 | ); 182 | path = SDTagsViewTests; 183 | sourceTree = ""; 184 | }; 185 | 18BE89E61E5ADCBD00BA5AC9 /* SDTagsViewUITests */ = { 186 | isa = PBXGroup; 187 | children = ( 188 | 18BE89E71E5ADCBD00BA5AC9 /* SDTagsViewUITests.m */, 189 | 18BE89E91E5ADCBD00BA5AC9 /* Info.plist */, 190 | ); 191 | path = SDTagsViewUITests; 192 | sourceTree = ""; 193 | }; 194 | EFE041381F1FAB6D00995112 /* SDEditTagsView */ = { 195 | isa = PBXGroup; 196 | children = ( 197 | EFE041391F1FAB8300995112 /* SDEditTagsViewController.h */, 198 | EFE0413A1F1FAB8300995112 /* SDEditTagsViewController.m */, 199 | EFE0413F1F1FB3BA00995112 /* SDCollectionTagsView.h */, 200 | EFE041401F1FB3BA00995112 /* SDCollectionTagsView.m */, 201 | EFD248BA1F76254F00355CED /* SDCollectionTagsFlowLayout.h */, 202 | EFD248BB1F76254F00355CED /* SDCollectionTagsFlowLayout.m */, 203 | EF0740CD1F64423300B24854 /* SDCollectionTagsViewCell.h */, 204 | EF0740CE1F64423300B24854 /* SDCollectionTagsViewCell.m */, 205 | ); 206 | path = SDEditTagsView; 207 | sourceTree = ""; 208 | }; 209 | EFF261081F1B106100EEEEC8 /* APPDelegate */ = { 210 | isa = PBXGroup; 211 | children = ( 212 | EFF261091F1B106100EEEEC8 /* AppDelegate.h */, 213 | EFF2610A1F1B106100EEEEC8 /* AppDelegate.m */, 214 | EFF2610B1F1B106100EEEEC8 /* ViewController.h */, 215 | EFF2610C1F1B106100EEEEC8 /* ViewController.m */, 216 | ); 217 | path = APPDelegate; 218 | sourceTree = ""; 219 | }; 220 | EFF2610F1F1B107200EEEEC8 /* SDCollectionTags */ = { 221 | isa = PBXGroup; 222 | children = ( 223 | EFF261101F1B107200EEEEC8 /* CollectionTagsViewController.h */, 224 | EFF261111F1B107200EEEEC8 /* CollectionTagsViewController.m */, 225 | EFF261121F1B107200EEEEC8 /* SDTagsView.h */, 226 | EFF261131F1B107200EEEEC8 /* SDTagsView.m */, 227 | ); 228 | path = SDCollectionTags; 229 | sourceTree = ""; 230 | }; 231 | EFF261161F1B108400EEEEC8 /* SDLabTags */ = { 232 | isa = PBXGroup; 233 | children = ( 234 | EFF261171F1B108400EEEEC8 /* LabelTagsViewController.h */, 235 | EFF261181F1B108400EEEEC8 /* LabelTagsViewController.m */, 236 | EFF261191F1B108400EEEEC8 /* SDLabTagsView.h */, 237 | EFF2611A1F1B108400EEEEC8 /* SDLabTagsView.m */, 238 | ); 239 | path = SDLabTags; 240 | sourceTree = ""; 241 | }; 242 | EFF2611B1F1B108400EEEEC8 /* SDTagsModel */ = { 243 | isa = PBXGroup; 244 | children = ( 245 | EFF2611C1F1B108400EEEEC8 /* tagsData.plist */, 246 | EFF2611D1F1B108400EEEEC8 /* TagsModel.h */, 247 | EFF2611E1F1B108400EEEEC8 /* TagsModel.m */, 248 | ); 249 | path = SDTagsModel; 250 | sourceTree = ""; 251 | }; 252 | /* End PBXGroup section */ 253 | 254 | /* Begin PBXNativeTarget section */ 255 | 18BE89BE1E5ADCBD00BA5AC9 /* SDTagsView */ = { 256 | isa = PBXNativeTarget; 257 | buildConfigurationList = 18BE89EC1E5ADCBD00BA5AC9 /* Build configuration list for PBXNativeTarget "SDTagsView" */; 258 | buildPhases = ( 259 | 18BE89BB1E5ADCBD00BA5AC9 /* Sources */, 260 | 18BE89BC1E5ADCBD00BA5AC9 /* Frameworks */, 261 | 18BE89BD1E5ADCBD00BA5AC9 /* Resources */, 262 | ); 263 | buildRules = ( 264 | ); 265 | dependencies = ( 266 | ); 267 | name = SDTagsView; 268 | productName = SDTagsView; 269 | productReference = 18BE89BF1E5ADCBD00BA5AC9 /* SDTagsView.app */; 270 | productType = "com.apple.product-type.application"; 271 | }; 272 | 18BE89D71E5ADCBD00BA5AC9 /* SDTagsViewTests */ = { 273 | isa = PBXNativeTarget; 274 | buildConfigurationList = 18BE89EF1E5ADCBD00BA5AC9 /* Build configuration list for PBXNativeTarget "SDTagsViewTests" */; 275 | buildPhases = ( 276 | 18BE89D41E5ADCBD00BA5AC9 /* Sources */, 277 | 18BE89D51E5ADCBD00BA5AC9 /* Frameworks */, 278 | 18BE89D61E5ADCBD00BA5AC9 /* Resources */, 279 | ); 280 | buildRules = ( 281 | ); 282 | dependencies = ( 283 | 18BE89DA1E5ADCBD00BA5AC9 /* PBXTargetDependency */, 284 | ); 285 | name = SDTagsViewTests; 286 | productName = SDTagsViewTests; 287 | productReference = 18BE89D81E5ADCBD00BA5AC9 /* SDTagsViewTests.xctest */; 288 | productType = "com.apple.product-type.bundle.unit-test"; 289 | }; 290 | 18BE89E21E5ADCBD00BA5AC9 /* SDTagsViewUITests */ = { 291 | isa = PBXNativeTarget; 292 | buildConfigurationList = 18BE89F21E5ADCBD00BA5AC9 /* Build configuration list for PBXNativeTarget "SDTagsViewUITests" */; 293 | buildPhases = ( 294 | 18BE89DF1E5ADCBD00BA5AC9 /* Sources */, 295 | 18BE89E01E5ADCBD00BA5AC9 /* Frameworks */, 296 | 18BE89E11E5ADCBD00BA5AC9 /* Resources */, 297 | ); 298 | buildRules = ( 299 | ); 300 | dependencies = ( 301 | 18BE89E51E5ADCBD00BA5AC9 /* PBXTargetDependency */, 302 | ); 303 | name = SDTagsViewUITests; 304 | productName = SDTagsViewUITests; 305 | productReference = 18BE89E31E5ADCBD00BA5AC9 /* SDTagsViewUITests.xctest */; 306 | productType = "com.apple.product-type.bundle.ui-testing"; 307 | }; 308 | /* End PBXNativeTarget section */ 309 | 310 | /* Begin PBXProject section */ 311 | 18BE89B71E5ADCBD00BA5AC9 /* Project object */ = { 312 | isa = PBXProject; 313 | attributes = { 314 | LastUpgradeCheck = 0820; 315 | ORGANIZATIONNAME = slowdony; 316 | TargetAttributes = { 317 | 18BE89BE1E5ADCBD00BA5AC9 = { 318 | CreatedOnToolsVersion = 8.2.1; 319 | DevelopmentTeam = HP4N98TFK6; 320 | ProvisioningStyle = Automatic; 321 | }; 322 | 18BE89D71E5ADCBD00BA5AC9 = { 323 | CreatedOnToolsVersion = 8.2.1; 324 | DevelopmentTeam = HP4N98TFK6; 325 | ProvisioningStyle = Automatic; 326 | TestTargetID = 18BE89BE1E5ADCBD00BA5AC9; 327 | }; 328 | 18BE89E21E5ADCBD00BA5AC9 = { 329 | CreatedOnToolsVersion = 8.2.1; 330 | DevelopmentTeam = HP4N98TFK6; 331 | ProvisioningStyle = Automatic; 332 | TestTargetID = 18BE89BE1E5ADCBD00BA5AC9; 333 | }; 334 | }; 335 | }; 336 | buildConfigurationList = 18BE89BA1E5ADCBD00BA5AC9 /* Build configuration list for PBXProject "SDTagsView" */; 337 | compatibilityVersion = "Xcode 3.2"; 338 | developmentRegion = English; 339 | hasScannedForEncodings = 0; 340 | knownRegions = ( 341 | en, 342 | Base, 343 | ); 344 | mainGroup = 18BE89B61E5ADCBD00BA5AC9; 345 | productRefGroup = 18BE89C01E5ADCBD00BA5AC9 /* Products */; 346 | projectDirPath = ""; 347 | projectRoot = ""; 348 | targets = ( 349 | 18BE89BE1E5ADCBD00BA5AC9 /* SDTagsView */, 350 | 18BE89D71E5ADCBD00BA5AC9 /* SDTagsViewTests */, 351 | 18BE89E21E5ADCBD00BA5AC9 /* SDTagsViewUITests */, 352 | ); 353 | }; 354 | /* End PBXProject section */ 355 | 356 | /* Begin PBXResourcesBuildPhase section */ 357 | 18BE89BD1E5ADCBD00BA5AC9 /* Resources */ = { 358 | isa = PBXResourcesBuildPhase; 359 | buildActionMask = 2147483647; 360 | files = ( 361 | EFF261281F1B4B7E00EEEEC8 /* SDTagsView.png in Resources */, 362 | 18BE89D21E5ADCBD00BA5AC9 /* LaunchScreen.storyboard in Resources */, 363 | 18BE89CF1E5ADCBD00BA5AC9 /* Assets.xcassets in Resources */, 364 | EFF261211F1B108400EEEEC8 /* tagsData.plist in Resources */, 365 | EF01A73B1F2247DD00985FBE /* SDEditTagsView.gif in Resources */, 366 | 18BE89CD1E5ADCBD00BA5AC9 /* Main.storyboard in Resources */, 367 | EFF2612A1F1B4B8600EEEEC8 /* SDTagsView.gif in Resources */, 368 | ); 369 | runOnlyForDeploymentPostprocessing = 0; 370 | }; 371 | 18BE89D61E5ADCBD00BA5AC9 /* Resources */ = { 372 | isa = PBXResourcesBuildPhase; 373 | buildActionMask = 2147483647; 374 | files = ( 375 | ); 376 | runOnlyForDeploymentPostprocessing = 0; 377 | }; 378 | 18BE89E11E5ADCBD00BA5AC9 /* Resources */ = { 379 | isa = PBXResourcesBuildPhase; 380 | buildActionMask = 2147483647; 381 | files = ( 382 | ); 383 | runOnlyForDeploymentPostprocessing = 0; 384 | }; 385 | /* End PBXResourcesBuildPhase section */ 386 | 387 | /* Begin PBXSourcesBuildPhase section */ 388 | 18BE89BB1E5ADCBD00BA5AC9 /* Sources */ = { 389 | isa = PBXSourcesBuildPhase; 390 | buildActionMask = 2147483647; 391 | files = ( 392 | EFF261151F1B107200EEEEC8 /* SDTagsView.m in Sources */, 393 | EFF2611F1F1B108400EEEEC8 /* LabelTagsViewController.m in Sources */, 394 | EFF261141F1B107200EEEEC8 /* CollectionTagsViewController.m in Sources */, 395 | EFF261221F1B108400EEEEC8 /* TagsModel.m in Sources */, 396 | EFE0413B1F1FAB8300995112 /* SDEditTagsViewController.m in Sources */, 397 | EF0740CF1F64423300B24854 /* SDCollectionTagsViewCell.m in Sources */, 398 | EFF2610D1F1B106100EEEEC8 /* AppDelegate.m in Sources */, 399 | EFF2610E1F1B106100EEEEC8 /* ViewController.m in Sources */, 400 | 1880325A1E5D3A1300DD7551 /* MainViewController.m in Sources */, 401 | EFE041441F1FB63400995112 /* SDHelper.m in Sources */, 402 | 18BE89C41E5ADCBD00BA5AC9 /* main.m in Sources */, 403 | EFD248BC1F76254F00355CED /* SDCollectionTagsFlowLayout.m in Sources */, 404 | EFF261201F1B108400EEEEC8 /* SDLabTagsView.m in Sources */, 405 | EFE041411F1FB3BA00995112 /* SDCollectionTagsView.m in Sources */, 406 | ); 407 | runOnlyForDeploymentPostprocessing = 0; 408 | }; 409 | 18BE89D41E5ADCBD00BA5AC9 /* Sources */ = { 410 | isa = PBXSourcesBuildPhase; 411 | buildActionMask = 2147483647; 412 | files = ( 413 | 18BE89DD1E5ADCBD00BA5AC9 /* SDTagsViewTests.m in Sources */, 414 | ); 415 | runOnlyForDeploymentPostprocessing = 0; 416 | }; 417 | 18BE89DF1E5ADCBD00BA5AC9 /* Sources */ = { 418 | isa = PBXSourcesBuildPhase; 419 | buildActionMask = 2147483647; 420 | files = ( 421 | 18BE89E81E5ADCBD00BA5AC9 /* SDTagsViewUITests.m in Sources */, 422 | ); 423 | runOnlyForDeploymentPostprocessing = 0; 424 | }; 425 | /* End PBXSourcesBuildPhase section */ 426 | 427 | /* Begin PBXTargetDependency section */ 428 | 18BE89DA1E5ADCBD00BA5AC9 /* PBXTargetDependency */ = { 429 | isa = PBXTargetDependency; 430 | target = 18BE89BE1E5ADCBD00BA5AC9 /* SDTagsView */; 431 | targetProxy = 18BE89D91E5ADCBD00BA5AC9 /* PBXContainerItemProxy */; 432 | }; 433 | 18BE89E51E5ADCBD00BA5AC9 /* PBXTargetDependency */ = { 434 | isa = PBXTargetDependency; 435 | target = 18BE89BE1E5ADCBD00BA5AC9 /* SDTagsView */; 436 | targetProxy = 18BE89E41E5ADCBD00BA5AC9 /* PBXContainerItemProxy */; 437 | }; 438 | /* End PBXTargetDependency section */ 439 | 440 | /* Begin PBXVariantGroup section */ 441 | 18BE89CB1E5ADCBD00BA5AC9 /* Main.storyboard */ = { 442 | isa = PBXVariantGroup; 443 | children = ( 444 | 18BE89CC1E5ADCBD00BA5AC9 /* Base */, 445 | ); 446 | name = Main.storyboard; 447 | sourceTree = ""; 448 | }; 449 | 18BE89D01E5ADCBD00BA5AC9 /* LaunchScreen.storyboard */ = { 450 | isa = PBXVariantGroup; 451 | children = ( 452 | 18BE89D11E5ADCBD00BA5AC9 /* Base */, 453 | ); 454 | name = LaunchScreen.storyboard; 455 | sourceTree = ""; 456 | }; 457 | /* End PBXVariantGroup section */ 458 | 459 | /* Begin XCBuildConfiguration section */ 460 | 18BE89EA1E5ADCBD00BA5AC9 /* Debug */ = { 461 | isa = XCBuildConfiguration; 462 | buildSettings = { 463 | ALWAYS_SEARCH_USER_PATHS = NO; 464 | CLANG_ANALYZER_NONNULL = YES; 465 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 466 | CLANG_CXX_LIBRARY = "libc++"; 467 | CLANG_ENABLE_MODULES = YES; 468 | CLANG_ENABLE_OBJC_ARC = YES; 469 | CLANG_WARN_BOOL_CONVERSION = YES; 470 | CLANG_WARN_CONSTANT_CONVERSION = YES; 471 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 472 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 473 | CLANG_WARN_EMPTY_BODY = YES; 474 | CLANG_WARN_ENUM_CONVERSION = YES; 475 | CLANG_WARN_INFINITE_RECURSION = YES; 476 | CLANG_WARN_INT_CONVERSION = YES; 477 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 478 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 479 | CLANG_WARN_UNREACHABLE_CODE = YES; 480 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 481 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 482 | COPY_PHASE_STRIP = NO; 483 | DEBUG_INFORMATION_FORMAT = dwarf; 484 | ENABLE_STRICT_OBJC_MSGSEND = YES; 485 | ENABLE_TESTABILITY = YES; 486 | GCC_C_LANGUAGE_STANDARD = gnu99; 487 | GCC_DYNAMIC_NO_PIC = NO; 488 | GCC_NO_COMMON_BLOCKS = YES; 489 | GCC_OPTIMIZATION_LEVEL = 0; 490 | GCC_PREPROCESSOR_DEFINITIONS = ( 491 | "DEBUG=1", 492 | "$(inherited)", 493 | ); 494 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 495 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 496 | GCC_WARN_UNDECLARED_SELECTOR = YES; 497 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 498 | GCC_WARN_UNUSED_FUNCTION = YES; 499 | GCC_WARN_UNUSED_VARIABLE = YES; 500 | IPHONEOS_DEPLOYMENT_TARGET = 10.2; 501 | MTL_ENABLE_DEBUG_INFO = YES; 502 | ONLY_ACTIVE_ARCH = YES; 503 | SDKROOT = iphoneos; 504 | }; 505 | name = Debug; 506 | }; 507 | 18BE89EB1E5ADCBD00BA5AC9 /* Release */ = { 508 | isa = XCBuildConfiguration; 509 | buildSettings = { 510 | ALWAYS_SEARCH_USER_PATHS = NO; 511 | CLANG_ANALYZER_NONNULL = YES; 512 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 513 | CLANG_CXX_LIBRARY = "libc++"; 514 | CLANG_ENABLE_MODULES = YES; 515 | CLANG_ENABLE_OBJC_ARC = YES; 516 | CLANG_WARN_BOOL_CONVERSION = YES; 517 | CLANG_WARN_CONSTANT_CONVERSION = YES; 518 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 519 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 520 | CLANG_WARN_EMPTY_BODY = YES; 521 | CLANG_WARN_ENUM_CONVERSION = YES; 522 | CLANG_WARN_INFINITE_RECURSION = YES; 523 | CLANG_WARN_INT_CONVERSION = YES; 524 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 525 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 526 | CLANG_WARN_UNREACHABLE_CODE = YES; 527 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 528 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 529 | COPY_PHASE_STRIP = NO; 530 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 531 | ENABLE_NS_ASSERTIONS = NO; 532 | ENABLE_STRICT_OBJC_MSGSEND = YES; 533 | GCC_C_LANGUAGE_STANDARD = gnu99; 534 | GCC_NO_COMMON_BLOCKS = YES; 535 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 536 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 537 | GCC_WARN_UNDECLARED_SELECTOR = YES; 538 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 539 | GCC_WARN_UNUSED_FUNCTION = YES; 540 | GCC_WARN_UNUSED_VARIABLE = YES; 541 | IPHONEOS_DEPLOYMENT_TARGET = 10.2; 542 | MTL_ENABLE_DEBUG_INFO = NO; 543 | SDKROOT = iphoneos; 544 | VALIDATE_PRODUCT = YES; 545 | }; 546 | name = Release; 547 | }; 548 | 18BE89ED1E5ADCBD00BA5AC9 /* Debug */ = { 549 | isa = XCBuildConfiguration; 550 | buildSettings = { 551 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 552 | DEVELOPMENT_TEAM = HP4N98TFK6; 553 | INFOPLIST_FILE = SDTagsView/Info.plist; 554 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 555 | PRODUCT_BUNDLE_IDENTIFIER = SD.SDTagsView; 556 | PRODUCT_NAME = "$(TARGET_NAME)"; 557 | }; 558 | name = Debug; 559 | }; 560 | 18BE89EE1E5ADCBD00BA5AC9 /* Release */ = { 561 | isa = XCBuildConfiguration; 562 | buildSettings = { 563 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 564 | DEVELOPMENT_TEAM = HP4N98TFK6; 565 | INFOPLIST_FILE = SDTagsView/Info.plist; 566 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 567 | PRODUCT_BUNDLE_IDENTIFIER = SD.SDTagsView; 568 | PRODUCT_NAME = "$(TARGET_NAME)"; 569 | }; 570 | name = Release; 571 | }; 572 | 18BE89F01E5ADCBD00BA5AC9 /* Debug */ = { 573 | isa = XCBuildConfiguration; 574 | buildSettings = { 575 | BUNDLE_LOADER = "$(TEST_HOST)"; 576 | DEVELOPMENT_TEAM = HP4N98TFK6; 577 | INFOPLIST_FILE = SDTagsViewTests/Info.plist; 578 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 579 | PRODUCT_BUNDLE_IDENTIFIER = SD.SDTagsViewTests; 580 | PRODUCT_NAME = "$(TARGET_NAME)"; 581 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SDTagsView.app/SDTagsView"; 582 | }; 583 | name = Debug; 584 | }; 585 | 18BE89F11E5ADCBD00BA5AC9 /* Release */ = { 586 | isa = XCBuildConfiguration; 587 | buildSettings = { 588 | BUNDLE_LOADER = "$(TEST_HOST)"; 589 | DEVELOPMENT_TEAM = HP4N98TFK6; 590 | INFOPLIST_FILE = SDTagsViewTests/Info.plist; 591 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 592 | PRODUCT_BUNDLE_IDENTIFIER = SD.SDTagsViewTests; 593 | PRODUCT_NAME = "$(TARGET_NAME)"; 594 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SDTagsView.app/SDTagsView"; 595 | }; 596 | name = Release; 597 | }; 598 | 18BE89F31E5ADCBD00BA5AC9 /* Debug */ = { 599 | isa = XCBuildConfiguration; 600 | buildSettings = { 601 | DEVELOPMENT_TEAM = HP4N98TFK6; 602 | INFOPLIST_FILE = SDTagsViewUITests/Info.plist; 603 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 604 | PRODUCT_BUNDLE_IDENTIFIER = SD.SDTagsViewUITests; 605 | PRODUCT_NAME = "$(TARGET_NAME)"; 606 | TEST_TARGET_NAME = SDTagsView; 607 | }; 608 | name = Debug; 609 | }; 610 | 18BE89F41E5ADCBD00BA5AC9 /* Release */ = { 611 | isa = XCBuildConfiguration; 612 | buildSettings = { 613 | DEVELOPMENT_TEAM = HP4N98TFK6; 614 | INFOPLIST_FILE = SDTagsViewUITests/Info.plist; 615 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 616 | PRODUCT_BUNDLE_IDENTIFIER = SD.SDTagsViewUITests; 617 | PRODUCT_NAME = "$(TARGET_NAME)"; 618 | TEST_TARGET_NAME = SDTagsView; 619 | }; 620 | name = Release; 621 | }; 622 | /* End XCBuildConfiguration section */ 623 | 624 | /* Begin XCConfigurationList section */ 625 | 18BE89BA1E5ADCBD00BA5AC9 /* Build configuration list for PBXProject "SDTagsView" */ = { 626 | isa = XCConfigurationList; 627 | buildConfigurations = ( 628 | 18BE89EA1E5ADCBD00BA5AC9 /* Debug */, 629 | 18BE89EB1E5ADCBD00BA5AC9 /* Release */, 630 | ); 631 | defaultConfigurationIsVisible = 0; 632 | defaultConfigurationName = Release; 633 | }; 634 | 18BE89EC1E5ADCBD00BA5AC9 /* Build configuration list for PBXNativeTarget "SDTagsView" */ = { 635 | isa = XCConfigurationList; 636 | buildConfigurations = ( 637 | 18BE89ED1E5ADCBD00BA5AC9 /* Debug */, 638 | 18BE89EE1E5ADCBD00BA5AC9 /* Release */, 639 | ); 640 | defaultConfigurationIsVisible = 0; 641 | defaultConfigurationName = Release; 642 | }; 643 | 18BE89EF1E5ADCBD00BA5AC9 /* Build configuration list for PBXNativeTarget "SDTagsViewTests" */ = { 644 | isa = XCConfigurationList; 645 | buildConfigurations = ( 646 | 18BE89F01E5ADCBD00BA5AC9 /* Debug */, 647 | 18BE89F11E5ADCBD00BA5AC9 /* Release */, 648 | ); 649 | defaultConfigurationIsVisible = 0; 650 | defaultConfigurationName = Release; 651 | }; 652 | 18BE89F21E5ADCBD00BA5AC9 /* Build configuration list for PBXNativeTarget "SDTagsViewUITests" */ = { 653 | isa = XCConfigurationList; 654 | buildConfigurations = ( 655 | 18BE89F31E5ADCBD00BA5AC9 /* Debug */, 656 | 18BE89F41E5ADCBD00BA5AC9 /* Release */, 657 | ); 658 | defaultConfigurationIsVisible = 0; 659 | defaultConfigurationName = Release; 660 | }; 661 | /* End XCConfigurationList section */ 662 | }; 663 | rootObject = 18BE89B71E5ADCBD00BA5AC9 /* Project object */; 664 | } 665 | --------------------------------------------------------------------------------