├── 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 |
--------------------------------------------------------------------------------