本文实例为大家分享了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
好了,大家如果有什么地方看不明白的,留言给我就行。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# iOS动态自适应标签
# iOS自适应标签
# iOS标签
# iOS左右滑动标签页导航的设计
# iOS实现去除html标签的方法汇总
# iOS仿微信添加标签效果(shape实现)
# iOS实现顶部标签式导航栏及下拉分类菜单
# iOS应用开发中UITabBarController标签栏控制器使用进阶
# iOS UICollectionView实现标签选择器
# 换行
# 就把
# 第一个
# 自适应
# 只有一个
# 有什么
# 这一
# 给我
# 好了
# 是有
# 就能
# 有一种
# 就行
# 点了
# 这个时候
# 重写
# 又能
# 看不
# 大家分享
# 来实现
相关文章:
网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?
高端建站三要素:定制模板、企业官网与响应式设计优化
如何基于云服务器快速搭建个人网站?
网站制作大概多少钱一个,做一个平台网站大概多少钱?
小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化
上海网站制作网站建设公司,建筑电工证网上查询系统入口?
北京企业网站设计制作公司,北京铁路集团官方网站?
网站制作价目表怎么做,珍爱网婚介费用多少?
建站主机选购指南与交易推荐:核心配置解析
攀枝花网站建设,攀枝花营业执照网上怎么年审?
唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?
招商网站制作流程,网站招商广告语?
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
音响网站制作视频教程,隆霸音响官方网站?
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解
建站之星后台密码遗忘或太弱?如何重置与强化?
定制建站价位费用解析与套餐推荐全攻略
沈阳制作网站公司排名,沈阳装饰协会官方网站?
制作农业网站的软件,比较好的农业网站推荐一下?
5种Android数据存储方式汇总
javascript基本数据类型及类型检测常用方法小结
建站之星导航配置指南:自助建站与SEO优化全解析
如何高效利用亚马逊云主机搭建企业网站?
大连网站设计制作招聘信息,大连投诉网站有哪些?
如何高效生成建站之星成品网站源码?
如何在阿里云香港服务器快速搭建网站?
如何在Golang中使用replace替换模块_指定本地或远程路径
免费公司网站制作软件,如何申请免费主页空间做自己的网站?
c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】
成都响应式网站开发,dw怎么把手机适应页面变成网页?
如何用虚拟主机快速搭建网站?详细步骤解析
,网页ppt怎么弄成自己的ppt?
C++如何使用std::optional?(处理可选值)
建站之星体验版:智能建站系统+响应式设计,多端适配快速建站
如何通过cPanel快速搭建网站?
如何用美橙互联一键搭建多站合一网站?
网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
如何用景安虚拟主机手机版绑定域名建站?
如何快速配置高效服务器建站软件?
广州顶尖建站服务:企业官网建设与SEO优化一体化方案
如何在腾讯云免费申请建站?
GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
学校免费自助建站系统:智能生成+拖拽设计+多端适配
已有域名和空间,如何快速搭建网站?
道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?
如何破解联通资金短缺导致的基站建设难题?
大连网站制作公司哪家好一点,大连买房网站哪个好?
*请认真填写需求信息,我们会在24小时内与您取得联系。