iOS 標(biāo)簽Tag列表的實現(xiàn)代碼
前言
1、之前項目中會有一些標(biāo)簽列表來顯示某些特性或要求,如下圖(代碼實現(xiàn)后的效果):
2、期間也是瀏覽了好多其他的第三方,但是可能是沒找到好的方法去尋找吧,沒有找到一個合適的,況且又不是特別復(fù)雜的東西,所以就自己寫了一套,但是注意因為我們項目中使用的是RAC+Mansory,所以想要使用的話需要引入這兩個庫=_=。
3、自己寫的時候考慮的不是太多,中心思想是ViewModel做定制需求,View通過ViewModel來實現(xiàn)定制化UI,其他更多的是邏輯上的排版,所以不做更多贅述,自己體會Y^o^Y 。
View布局
LSLabelTextView.h的實現(xiàn)
// // LSLabelTextView.h // RenCheRen // // Created by 王隆帥 on 15/12/30. // Copyright © 2015年 王隆帥. All rights reserved. // #import "YCView.h" @interface LSLabelTextView : YCView @end
LSLabelTextView.m的實現(xiàn)
// // LSLabelTextView.m // RenCheRen // // Created by 王隆帥 on 15/12/30. // Copyright © 2015年 王隆帥. All rights reserved. // #import "LSLabelTextView.h" #import "LSLabelTextViewModel.h" @interface LSLabelTextView () @property (nonatomic, strong) LSLabelTextViewModel *viewModel; @end @implementation LSLabelTextView { MASConstraint *_toLeftBtnMasConstraint; MASConstraint *_toTopBtnMasonstraint; MASConstraint *_toLeftSelfMasConstraint; MASConstraint *_toTopSelfMasonstraint; } - (instancetype)initWithViewModel:(id<YCViewModelProtocol>)viewModel { self.viewModel = (LSLabelTextViewModel *)viewModel; return [super initWithViewModel:viewModel]; } - (void)yc_bindViewModel { @weakify(self); [[RACObserve(self, viewModel.dataArray) distinctUntilChanged] subscribeNext:^(id x) { @strongify(self); [self.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; if (self.viewModel.dataArray.count <= 0) { __weak UIView *weakNullView; UIView *nullView = [[UIView alloc] init]; weakNullView = nullView; [self addSubview:weakNullView]; WS(weakSelf) [weakNullView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.right.left.bottom.equalTo(weakSelf); make.height.equalTo(weakSelf.viewModel.nullHeight); }]; return; } NSInteger lineNum = 1; CGFloat allWidth = 0; __weak UIButton *lastBtn; for (int i = 0; i < self.viewModel.dataArray.count; i++) { NSString *string = [self.viewModel.dataArray stringWithIndex:i]; __weak UIButton *weakBtn = [self ls_getBtnWithString:string]; [self addSubview:weakBtn]; CGSize size = [string widthWithHeight:20 andFont:self.viewModel.textFontNum]; CGFloat needFloat = size.width < self.viewModel.miniWidth ? self.viewModel.miniWidth : size.width; if (lastBtn) { WS(weakSelf) [weakBtn mas_makeConstraints:^(MASConstraintMaker *make) { _toLeftBtnMasConstraint = make.left.equalTo(lastBtn.mas_right).offset(weakSelf.viewModel.labelHorizontalSpace); [_toLeftBtnMasConstraint activate]; _toTopBtnMasonstraint = make.top.equalTo(lastBtn.mas_bottom).offset(weakSelf.viewModel.labelVerticalSpace); [_toTopBtnMasonstraint deactivate]; _toLeftSelfMasConstraint = make.left.equalTo(weakSelf.viewModel.leftToViewEdge); _toTopSelfMasonstraint = make.top.equalTo(lastBtn); make.size.equalTo(CGSizeMake(needFloat + 20, weakSelf.viewModel.labelHeight)); }]; if (allWidth + self.viewModel.labelHorizontalSpace + needFloat + 20 + self.viewModel.rightToViewEdge > self.viewModel.allWidth) { [_toLeftSelfMasConstraint activate]; [_toLeftBtnMasConstraint deactivate]; [_toTopBtnMasonstraint activate]; [_toTopSelfMasonstraint deactivate]; lineNum ++; allWidth = self.viewModel.leftToViewEdge + needFloat + 20; } else { [_toLeftSelfMasConstraint deactivate]; [_toLeftBtnMasConstraint activate]; [_toTopBtnMasonstraint deactivate]; [_toTopSelfMasonstraint activate]; allWidth = allWidth + self.viewModel.labelHorizontalSpace + needFloat + 20; } } else { WS(weakSelf) [weakBtn mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(weakSelf.viewModel.leftToViewEdge); make.size.equalTo(CGSizeMake(needFloat + 20, weakSelf.viewModel.labelHeight)); make.top.equalTo(weakSelf.viewModel.topToViewEdge); }]; allWidth = allWidth + self.viewModel.leftToViewEdge + needFloat + 20; } lastBtn = weakBtn; } WS(weakSlef) [lastBtn mas_updateConstraints:^(MASConstraintMaker *make) { make.bottom.equalTo(weakSlef.viewModel.bottomToViewEdge); }]; }]; } - (UIButton *)ls_getBtnWithString:(NSString *)string { UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; btn.layer.borderWidth = 0.5; btn.layer.borderColor = self.viewModel.borderColor.CGColor; [btn setTitleColor:self.viewModel.titleColor forState:UIControlStateNormal]; btn.backgroundColor = self.viewModel.backgroundColor; btn.layer.masksToBounds = YES; btn.layer.cornerRadius = self.viewModel.cornerRadius; btn.titleLabel.font = YC_YAHEI_FONT(self.viewModel.textFontNum); [btn setTitle:string forState:UIControlStateNormal]; btn.ls_typeString = string; return btn; } @end
ViewModel適配
LSLabelTextViewModel.h的實現(xiàn)
// // LSLabelTextViewModel.h // RenCheRen // // Created by 王隆帥 on 15/12/30. // Copyright © 2015年 王隆帥. All rights reserved. // #import "YCViewModel.h" @interface LSLabelTextViewModel : YCViewModel /** * 標(biāo)簽數(shù)組 */ @property (nonatomic, strong) NSMutableArray *dataArray; /** * 總的寬度 */ @property (nonatomic, assign) CGFloat allWidth; /** * 沒有標(biāo)簽時的高度 */ @property (nonatomic, assign) CGFloat nullHeight; /** * 文字字體大小 */ @property (nonatomic, assign) CGFloat textFontNum; /** * 取得標(biāo)簽為空的時候,標(biāo)簽最小長度 */ @property (nonatomic, assign) CGFloat miniWidth; /** * 標(biāo)簽高度 */ @property (nonatomic, assign) CGFloat labelHeight; /** * 最左側(cè)標(biāo)簽距離View的邊緣的寬度 */ @property (nonatomic, assign) CGFloat leftToViewEdge; /** * 最右側(cè)標(biāo)簽距離View的邊緣的寬度 */ @property (nonatomic, assign) CGFloat rightToViewEdge; /** * 最上側(cè)標(biāo)簽距離View的邊緣的寬度 */ @property (nonatomic, assign) CGFloat topToViewEdge; /** * 最下側(cè)標(biāo)簽距離View的邊緣的寬度 */ @property (nonatomic, assign) CGFloat bottomToViewEdge; /** * 橫向標(biāo)簽之間的寬度 */ @property (nonatomic, assign) CGFloat labelHorizontalSpace; /** * 縱向標(biāo)簽之間的寬度 */ @property (nonatomic, assign) CGFloat labelVerticalSpace; /** * label(btn) 的相關(guān)屬性 */ @property (nonatomic, assign) CGFloat borderWidth; @property (nonatomic, strong) UIColor *borderColor; @property (nonatomic, strong) UIColor *titleColor; @property (nonatomic, strong) UIColor *backgroundColor; @property (nonatomic, assign) CGFloat cornerRadius; @end
LSLabelTextViewModel.m的實現(xiàn)
// // LSLabelTextViewModel.m // RenCheRen // // Created by 王隆帥 on 15/12/30. // Copyright © 2015年 王隆帥. All rights reserved. // #import "LSLabelTextViewModel.h" @implementation LSLabelTextViewModel - (NSMutableArray *)dataArray { if (!_dataArray) { _dataArray = [[NSMutableArray alloc] init]; } return _dataArray; } @end
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
阿里數(shù)據(jù)iOS端啟動速度優(yōu)化心得
本篇文章給大家詳細分析了阿里數(shù)據(jù)iOS端啟動速度優(yōu)化的知識點以及心得,對此有興趣的朋友參考學(xué)習(xí)下吧。2018-02-02IOS簡單實現(xiàn)瀑布流UICollectionView
這篇文章主要為大家介紹了IOS簡單實現(xiàn)瀑布流UICollectionView的相關(guān)資料,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-01-01iOS App開發(fā)中的UISegmentedControl分段組件用法總結(jié)
UISegmentedControl主要被用來制作分頁按鈕或添加跳轉(zhuǎn)到不同位置的標(biāo)簽,這里我們就來看一下iOS App開發(fā)中的UISegmentedControl分段組件用法總結(jié),需要的朋友可以參考下2016-06-06iOS動畫-定時對UIView進行翻轉(zhuǎn)和抖動的方法
下面小編就為大家?guī)硪黄猧OS動畫-定時對UIView進行翻轉(zhuǎn)和抖動的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04