1. 程式人生 > >ios 動態標籤 可點選

ios 動態標籤 可點選

#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];
}

相關推薦

ios 動態標籤

#import "XGTagView.h" @interface XGTagView() @end @implementation XGTagView /** * 初始化 * * @param frame frame * @param tagArr

js、jq和標籤裡面設定按鈕與不可狀態

<button id="bt1" type="button">button</button> 1、js中設定按鈕可點選與不可點選,預設是可點選的 (1)設定按鈕不可點選 document.getElementById("bt1").disabled=ture;

使用網頁巢狀iframe標籤左側導航欄,在右側動態顯示頁面的資訊

<!--主體內容部分--> <div class="main"> <!-- 左側導航 --> <div class="main_left"> <div class="li_title">使用者管理<span

js動態生成的標籤傳遞引數到js函式

在js函式中,動態生成了一系列<a>標籤,現在需要點選a標籤後,能夠傳值到點選後呼叫的函式,,嘗試了好久才成功! for(var i=0;i<len;i++){ var tr=oTbody.insertRow(i);

input標籤加圖示,

<div class="item-ifo"><input class="modInput " type="{{tode.typeVal}} " v-model="tode.arr "><div class="ico"></div&

jq動態生成的元素(標籤)新增事件

1.在dataTable表格中根據傳來的資料動態生成a標籤 Columns:最後一列 js部分: <script> var ListTable = loadDataTable({ {}, {}, ... { data: "orderI

IOS動態載入資料事件失效

動態資料的建立與繫結 在實際的開發中,我們常常需要通過動態載入資料,來建立頁面的DOM,而且給這些新增的元素新增事件也是不可避免的。 而對於動態資料的事件繫結,就需要明白兩個概念,就是目標元素和代理元素(委託元素); (1)目標元素:動態建立的元素,最

ios 物流時間軸,自動匹配電話號碼,撥打

本demo使用MJRefresh來做上拉重新整理,MJExtension來做模型解析,YYit做富文字點選事件,話不多說上程式碼 ///控制器內陣列新增模型 NSInteger totalCount = array.count; //

[IOS]Uiwebview+js,圖片得到地址

網上的教程你複製我,我複製你,特別容易誤導像我這樣的新手,好不容易找到一個方法,卻因為 網上給的js程式碼用了系統的click方法,導致一直無效。 網頁中圖片的節點是 img,利用js 得到圖片節點下的所有地址,並且為每一個圖片新增點選事件 點選時,觸發一個url,即圖片的地址。

Selenium:動態頁面模擬

Selenium:動態頁面模擬點選   Selenium Selenium是一個Web的自動化測試工具,最初是為網站自動化測試而開發的,型別像我們玩遊戲用的按鍵精靈,可以按指定的命令自動操作,不同是Selenium 可以直接執行在瀏覽器上,它支援所有主流的

利用photoView實現放大到全屏顯示的控制元件,效果類似於微信朋友圈點開看大圖

此控制元件繼承自ImageView,實現效果與微信朋友圈點開看大圖相似,點選控制元件後進入沉浸模式全屏顯示大圖,全屏時雙擊或手指拉伸可放大圖片,單擊會退出全屏 老規矩,先上控制元件實現程式碼: /** * 可點選放大全屏顯示的imageView * Created by Administ

python學習之網站的編寫(HTML,CSS,JS)(八)----------label標籤label標籤的文字將編輯的游標移過來

 如果不加label的話,只設置值的話,點選文字是不能將編輯的游標移過來的,必須將id連線上之後,才可以實現,點選文字就可以將編輯的游標移過來。 實現結果: 程式碼: <!DOCTYPE html> <html lang="en"> <hea

java簡單部落格系統(二)導航標籤後頁面內容改變及背景色改變

一、同一個Servlet處理多個請求,顯示不同的頁面內容 導航標籤頁 bootStrap模板: <ul class="nav nav-tabs"> <li role="presentation" class="active"><a href="#">Home

為org.eclipse.swt.widgets.Text 新增的超連結

可以為text, 也可以為label 新增可以點選的超連結。 程式碼如下: package us63740.parts; import java.awt.Desktop; import java.io.IOException; import java.net.URI; import jav

iOS】播放按鈕音效

有點選按鈕產生音效的需求 /** 設定簽到音效 @param name 音效名稱 @param soundtype 音效型別 @param playtype 播放型別 */ -(void)playSoundWithName:(NSString *)name soundtype:

li標籤下的a標籤一個a標籤,當前a標籤變紅色 其他a標籤變黑色

  如果用jquery的話: var lable_a = $('li').children('a'); lable_a.click(function() {     lable_a.css('c

利用原生js實現自定義滾動條(到達,拖動到達)

1.HTML檔案 div1是滾動條,div2是滾動小球,div3是文字區域容器,div4是文字區域。 <div id="div"> <div id="div1"> <div id="div2"> </div> </div&

Android 給TextView 中 部分文字加下劃線 並加入超連結(

Android 本身自帶的TextView 並沒有直接的方法可以給文字加下劃線和可點選的超連結,使用以下方法即可實現: /** * * @param content 文字內容 * @param textView 載入文字的textview *

簡潔優雅的 toast 控制元件,仿手機百度 9.0,無 BadTokenException 風險。

UniversalToast 專案地址:bboylin/UniversalToast  簡介:簡潔優雅可點選的 toast 控制元件,仿手機百度 9.0,無 BadTokenException 風險。 更多:作者   提 Bug &nbs

微信JSSDK上傳預覽多圖,ios/Android。檢視大圖,支援滑動。

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=dev