国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

iOS實現動態自適應標簽

2019-10-21 18:47:37
字體:
來源:轉載
供稿:網友

先上效果圖

iOS動態自適應標簽,iOS自適應標簽,iOS標簽

 設計要求

1、標簽的寬度是按內容自適應的

2、一行顯示的標簽個數是動態的,放得下就放,放不下就換行

3、默認選中第一個

4、至少選中一個標簽

實現思路

首先我們從這個效果上來看,這個標簽是有選中和不選中狀態,那我們首選的控件肯定就是用 UIButton來實現了。

這個小程度的重點就在于標簽能自動換行,還是智能的,不是固定一行多少個那種,這個我們通過計算每個按鈕實際寬度與屏幕的寬度進行比較就能判斷是否需要換行了。

還有一點就是處理 至少選中一個標簽的功能,我這里有一種方式,就是控制按鈕的 userInteractionEnabled 屬性來實現,如果只有一個按鈕的時候就把那一個按鈕的這個屬性給設置成 NO,這樣就禁止用戶對它進行點擊事件了,這個時候其它按鈕是可以正常選中的,只要選中的按鈕大于1個,那就把剛才那個按鈕屬性再改成YES,這樣那個按鈕就又能點了。

具體看代碼

創建一個繼承于UIView的 XGTagView 類

//// XGTagView.h// 動態標簽//// Created by xgao on 17/3/22.// Copyright © 2017年 xgao. All rights reserved.//#import <UIKit/UIKit.h>@interface XGTagView : UIView/** * 初始化 * * @param frame frame * @param tagArray 標簽數組 * * @return */- (instancetype)initWithFrame:(CGRect)frame tagArray:(NSMutableArray*)tagArray;// 標簽數組@property (nonatomic,retain) NSArray* tagArray;// 選中標簽文字顏色@property (nonatomic,retain) UIColor* textColorSelected;// 默認標簽文字顏色@property (nonatomic,retain) UIColor* textColorNormal;// 選中標簽背景顏色@property (nonatomic,retain) UIColor* backgroundColorSelected;// 默認標簽背景顏色@property (nonatomic,retain) UIColor* backgroundColorNormal;@end

 

//// XGTagView.m// 動態標簽//// Created by xgao on 17/3/22.// Copyright © 2017年 xgao. All rights reserved.//#import "XGTagView.h"@interface XGTagView()@end@implementation XGTagView/** * 初始化 * * @param frame frame * @param tagArray 標簽數組 * * @return */- (instancetype)initWithFrame:(CGRect)frame tagArray:(NSArray*)tagArray{  self = [super initWithFrame:frame]; if (self) {  _tagArray = tagArray;  [self setUp]; } return self;}// 初始化- (void)setUp{  // 默認顏色 _textColorNormal = [UIColor darkGrayColor]; _textColorSelected = [UIColor whiteColor]; _backgroundColorSelected = [UIColor redColor]; _backgroundColorNormal = [UIColor whiteColor];  // 創建標簽按鈕 [self createTagButton];}// 重寫set屬性- (void)setTagArray:(NSMutableArray *)tagArray{  _tagArray = tagArray;  // 重新創建標簽 [self resetTagButton];}- (void)setTextColorSelected:(UIColor *)textColorSelected{ _textColorSelected = textColorSelected; // 重新創建標簽 [self resetTagButton];}- (void)setTextColorNormal:(UIColor *)textColorNormal{  _textColorNormal = textColorNormal; // 重新創建標簽 [self resetTagButton];}- (void)setBackgroundColorSelected:(UIColor *)backgroundColorSelected{  _backgroundColorSelected = backgroundColorSelected; // 重新創建標簽 [self resetTagButton];}- (void)setBackgroundColorNormal:(UIColor *)backgroundColorNormal{  _backgroundColorNormal = backgroundColorNormal; // 重新創建標簽 [self resetTagButton];}#pragma mark - Private// 重新創建標簽- (void)resetTagButton{  // 移除之前的標簽 for (UIButton* btn in self.subviews) {  [btn removeFromSuperview]; } // 重新創建標簽 [self createTagButton];}// 創建標簽按鈕- (void)createTagButton{  // 按鈕高度 CGFloat btnH = 28; // 距離左邊距 CGFloat leftX = 6; // 距離上邊距 CGFloat topY = 10; // 按鈕左右間隙 CGFloat marginX = 10; // 按鈕上下間隙 CGFloat marginY = 10; // 文字左右間隙 CGFloat fontMargin = 10;  for (int i = 0; i < _tagArray.count; i++) {    UIButton* btn = [UIButton buttonWithType:UIButtonTypeCustom];  btn.frame = CGRectMake(marginX + leftX, topY, 100, btnH);  btn.tag = 100+i;  // 默認選中第一個  if (i == 0) {   btn.selected = YES;  }    // 按鈕文字  [btn setTitle:_tagArray[i] forState:UIControlStateNormal];    //------ 默認樣式  //按鈕文字默認樣式  NSMutableAttributedString* btnDefaultAttr = [[NSMutableAttributedString alloc]initWithString:btn.titleLabel.text];  // 文字大小  [btnDefaultAttr addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:13] range:NSMakeRange(0, btn.titleLabel.text.length)];  // 默認顏色  [btnDefaultAttr addAttribute:NSForegroundColorAttributeName value:self.textColorNormal range:NSMakeRange(0, btn.titleLabel.text.length)];  [btn setAttributedTitle:btnDefaultAttr forState:UIControlStateNormal];    // 默認背景顏色  [btn setBackgroundImage:[self imageWithColor:self.backgroundColorNormal] forState:UIControlStateNormal];    //----- 選中樣式  // 選中字體顏色  NSMutableAttributedString* btnSelectedAttr = [[NSMutableAttributedString alloc]initWithString:btn.titleLabel.text];  // 選中顏色  [btnSelectedAttr addAttribute:NSForegroundColorAttributeName value:self.textColorSelected range:NSMakeRange(0, btn.titleLabel.text.length)];  // 選中文字大小  [btnSelectedAttr addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:13] range:NSMakeRange(0, btn.titleLabel.text.length)];  [btn setAttributedTitle:btnSelectedAttr forState:UIControlStateSelected];    // 選中背景顏色  [btn setBackgroundImage:[self imageWithColor:self.backgroundColorSelected] forState:UIControlStateSelected];    // 圓角  btn.layer.cornerRadius = btn.frame.size.height / 2.f;  btn.layer.masksToBounds = YES;  // 邊框  btn.layer.borderColor = [UIColor lightGrayColor].CGColor;  btn.layer.borderWidth = 0.5;    // 設置按鈕的邊距、間隙  [self setTagButtonMargin:btn fontMargin:fontMargin];    // 處理換行  if (btn.frame.origin.x + btn.frame.size.width + marginX > self.frame.size.width) {   // 換行   topY += btnH + marginY;      // 重置   leftX = 6;   btn.frame = CGRectMake(marginX + leftX, topY, 100, btnH);      // 設置按鈕的邊距、間隙   [self setTagButtonMargin:btn fontMargin:fontMargin];  }    // 重置高度  CGRect frame = btn.frame;  frame.size.height = btnH;  btn.frame = frame;    //----- 選中事件  [btn addTarget:self action:@selector(selectdButton:) forControlEvents:UIControlEventTouchUpInside];    [self addSubview:btn];    leftX += btn.frame.size.width + marginX; }  // 檢測按鈕狀態,最少選中一個 [self checkButtonState];}// 設置按鈕的邊距、間隙- (void)setTagButtonMargin:(UIButton*)btn fontMargin:(CGFloat)fontMargin{  // 按鈕自適應 [btn sizeToFit];  // 重新計算按鈕文字左右間隙 CGRect frame = btn.frame; frame.size.width += fontMargin*2; btn.frame = frame;}// 檢測按鈕狀態,最少選中一個- (void)checkButtonState{  int selectCount = 0; UIButton* selectedBtn = nil; for(int i=0;i < _tagArray.count; i++){  UIButton* btn = (UIButton*)[self viewWithTag:100+i];  if(btn.selected){   selectCount++;   selectedBtn = btn;  } } if (selectCount == 1) {  // 只有一個就把這一個給禁用手勢  selectedBtn.userInteractionEnabled = NO; }else{  // 解除禁用手勢  for(int i=0;i < _tagArray.count; i++){   UIButton* btn = (UIButton*)[self viewWithTag:100+i];   if(!btn.userInteractionEnabled){    btn.userInteractionEnabled = YES;   }  } }}// 根據顏色生成UIImage- (UIImage*)imageWithColor:(UIColor*)color{  CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f); // 開始畫圖的上下文 UIGraphicsBeginImageContext(rect.size);  // 設置背景顏色 [color set]; // 設置填充區域 UIRectFill(CGRectMake(0, 0, rect.size.width, rect.size.height));  // 返回UIImage UIImage* image = UIGraphicsGetImageFromCurrentImageContext(); // 結束上下文 UIGraphicsEndImageContext(); return image;}#pragma mark - Event// 標簽按鈕點擊事件- (void)selectdButton:(UIButton*)btn{  btn.selected = !btn.selected;  // 檢測按鈕狀態,最少選中一個 [self checkButtonState];}@end

好了,大家如果有什么地方看不明白的,留言給我就行。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 昌江| 庆安县| 吴忠市| 平江县| 剑河县| 汉中市| 日照市| 潮安县| 柯坪县| 聂拉木县| 筠连县| 景宁| 汉沽区| 洛阳市| 喜德县| 奈曼旗| 集安市| 定日县| 呼伦贝尔市| 浙江省| 永和县| 临城县| 玛多县| 宣恩县| 嘉兴市| 前郭尔| 兴安县| 河北省| 集安市| 海安县| 郓城县| 广汉市| 靖远县| 剑阁县| 鹤壁市| 泽普县| 广昌县| 申扎县| 台安县| 吉林省| 钟山县|