iOS 标签自动布局

导入SKTagFrame


        SKTagFrame *frame = [[SKTagFrame alloc] init];
        frame.tagsArray = self.bigModel.Tags;
        // 添加标签
        CGFloat first_H = 0;
        CGFloat total_H = 0;
        for (NSInteger i = 0; i<  self.bigModel.Tags.count; i++) {
            UIButton *tagsBtn = [UIButton buttonWithType:UIButtonTypeCustom];
            [tagsBtn setTitle: self.bigModel.Tags[i] forState:UIControlStateNormal];
            tagsBtn.backgroundColor = [UIColor whiteColor];
            tagsBtn.layer.borderWidth = 1;
            tagsBtn.layer.borderColor = Color_666666.CGColor;
            tagsBtn.backgroundColor = Color_ffffff;
            [tagsBtn setTitleColor:Color_666666 forState:UIControlStateNormal];
            tagsBtn.titleLabel.font = Font(13.f);
            
            tagsBtn.layer.cornerRadius = 1.2;
            tagsBtn.layer.masksToBounds = YES;
            CGRect orgRect = CGRectFromString(frame.tagsFrames[i]);
            CGRect resRect = CGRectMake(orgRect.origin.x, orgRect.origin.y  , orgRect.size.width, orgRect.size.height);
            if (i == 0) {
                first_H = orgRect.origin.y + orgRect.size.height;
            }
            total_H = orgRect.origin.y + orgRect.size.height;
            
            if (total_H > first_H * 2) {
                tagsBtn.hidden = YES;
                
            }
            // 只显示两行
            tagsBtn.frame = resRect;
            [bgView addSubview:tagsBtn];
        }

自动布局利器
iOS 标签自动布局_第1张图片

h 文件

//
//  SKTagFrame.h

//  Copyright © 2018 AlexanderYeah. All rights reserved.
//

#import 
#import 

#define WIDTH [UIScreen mainScreen].bounds.size.width
#define HEIGHT [UIScreen mainScreen].bounds.size.height
#define TagsTitleFont [UIFont systemFontOfSize:13]


NS_ASSUME_NONNULL_BEGIN

@interface SKTagFrame : NSObject

/** 标签名字数组 */
@property (nonatomic, strong) NSArray *tagsArray;
/** 标签frame数组 */
@property (nonatomic, strong) NSMutableArray *tagsFrames;
/** 全部标签的高度 */
@property (nonatomic, assign) CGFloat tagsHeight;
/** 标签间距 default is 10*/
@property (nonatomic, assign) CGFloat tagsMargin;
/** 标签行间距 default is 10*/
@property (nonatomic, assign) CGFloat tagsLineSpacing;
/** 标签最小内边距 default is 10*/
@property (nonatomic, assign) CGFloat tagsMinPadding;


@end

NS_ASSUME_NONNULL_END

.m 文件

//
//  SKTagFrame.m

//  Copyright © 2018 AlexanderYeah. All rights reserved.
//

#import "SKTagFrame.h"
//  计算多个标签的位置
//  标签根据文字自适应宽度
//  每行超过的宽度平均分配给每个标签
//  每行标签左右对其

@implementation SKTagFrame


- (id)init
{
    //初始化
    self = [super init];
    if (self) {
        _tagsFrames = [NSMutableArray array];
        _tagsMinPadding = 6;// 文字四周的间距
        _tagsMargin = 8;// 竖向的间距
        _tagsLineSpacing = 10;//横向的间距
    }
    return self;
}

- (void)setTagsArray:(NSArray *)tagsArray
{
    _tagsArray = tagsArray;
    CGFloat btnX = _tagsMargin;
    CGFloat btnW = 0;
    CGFloat nextWidth = 0;  // 下一个标签的宽度
    CGFloat moreWidth = 0;  // 每一行多出来的宽度
    //每一行的最后一个tag的索引的数组和每一行多出来的宽度的数组
    NSMutableArray *lastIndexs = [NSMutableArray array];
    NSMutableArray *moreWidths = [NSMutableArray array];
    
    for (NSInteger i=0; i (WIDTH - _tagsMargin)) {
            // 计算超过的宽度
            moreWidth = WIDTH - nextBtnX;
            [lastIndexs addObject:[NSNumber numberWithInteger:i]];
            [moreWidths addObject:[NSNumber numberWithFloat:moreWidth]];
            btnX = _tagsMargin;
        }else{
            btnX += (btnW + _tagsMargin);
        }
        // 如果是最后一个且数组中没有,则把最后一个加入数组
        if (i == tagsArray.count -1) {
            if (![lastIndexs containsObject:[NSNumber numberWithInteger:i]]) {
                [lastIndexs addObject:[NSNumber numberWithInteger:i]];
                [moreWidths addObject:[NSNumber numberWithFloat:0]];
            }
        }
    }
    NSInteger location = 0;  // 截取的位置
    NSInteger length = 0;    // 截取的长度
    CGFloat averageW = 0;    // 多出来的平均的宽度
    CGFloat tagW = 0;
    CGFloat tagH = 30;
    for (NSInteger i=0; i

你可能感兴趣的:(iOS开发笔记)