商品选择控件

在项目中写这个控件的时候,细节还是很多的,比如如何根据后台传过来的json来布局里面的子控件。

1.先来看看效果图

DB931AEF-935F-426E-95D5-5D3D402EC88F.png

2.看下控件的视图层级

05EFFA2C-3A44-4811-A765-9E6863E471F3.png

3.计算标签的核心代码

'''

[self.tagButtons removeAllObjects];
for (int i = 0; i< items.count; i++) {
    UIButton *tagButton = [[UIButton alloc] init];
    [self.tagButtons addObject:tagButton];
    tagButton.backgroundColor = grayBgColor;
    tagButton.layer.cornerRadius = MXMargin;
    [tagButton setTitle:items[i] forState:UIControlStateNormal];
    tagButton.titleLabel.font = MXFont;
    // 应该要先设置文字和字体后,再进行计算
    [tagButton sizeToFit];
    tagButton.mx_width += 2 * MXTagMargin;
    tagButton.mx_height = shopTageButtonH;
    
    [tagButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [tagButton setTitleColor:[UIColor whiteColor] forState:UIControlStateDisabled];
    [self.btnView addSubview:tagButton];
    //添加点击事件
    [tagButton addTarget:self action:@selector(tagButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
    
    // 设置位置
    if (i == 0) { // 最前面的标签
        tagButton.mx_x = 0;
        tagButton.mx_y = 0;
    } else { // 其他标签
        UIButton *lastTagButton = self.tagButtons[i - 1];
        // 计算当前行左边的宽度
        CGFloat leftWidth = CGRectGetMaxX(lastTagButton.frame) + MXTagMargin;
        // 计算当前行右边的宽度
        CGFloat rightWidth = self.btnView.mx_width - leftWidth;
        if (rightWidth >= tagButton.mx_width) { // 按钮显示在当前行
            tagButton.mx_y = lastTagButton.mx_y;
            tagButton.mx_x = leftWidth;
        } else { // 按钮显示在下一行
            tagButton.mx_x = 0;
            tagButton.mx_y = CGRectGetMaxY(lastTagButton.frame) + MXTagMargin;
        }
    }
}
// 最后一个标签
UIButton *lastTagButton = [self.tagButtons lastObject];

CGFloat h =  CGRectGetMaxY(lastTagButton.frame);

//更新Frame
self.btnView.mx_height = h;

self.mx_height = h + 8 * MXMargin;

self.sepLineView.mx_y = self.mx_height - seprLineH;

'''

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,318评论 25 709
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,204评论 4 61
  • 午夜的茉莉花 清芬的香气浸入微凉的空气中 渐渐漫延开来 沾上了微雨溅下的滴露 房间内 一张桌子 一盏灯 惹了思念成...
    颍阿阅读 1,859评论 7 11
  • 文件系统层:在这一层里,分布式文件系统需具备存储管理、容错处理、高可扩展性、高可靠性和高可用性等特性。数据存储层:...
    zjlearn阅读 4,791评论 0 1