IOS動態自適應標籤實現,ios動態自適應

來源:互聯網
上載者:User

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

 

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

 

 

 

 

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.