Cellular Matrix 蜂窝矩阵(一)

简介: 最近的新项目要在兴趣选择的标签上做一些文章,看了一些国内需要兴趣选择的APP的样式,基本都是不规则的横向排列标签选择模式,基本都是用`CollectionView`配合着自己重新写的`FLowLayout`进行重新的布局排布。然而,虎嗅APP的兴趣选择标签的样式倒是很独特,用了一种类似蜂窝样式的排布来进行选择,同时还配合动画效果,进一步的提升了用户的体验感受。但是只是在安卓版本的虎嗅APP才有,iOS版本的并没有体验到。

起源

最近的新项目要在兴趣选择的标签上做一些文章,看了一些国内需要兴趣选择的APP的样式,基本都是不规则的横向排列标签选择模式,基本都是用CollectionView配合着自己重新写的FLowLayout进行重新的布局排布。然而,虎嗅APP的兴趣选择标签的样式倒是很独特,用了一种类似蜂窝样式的排布来进行选择,同时还配合动画效果,进一步的提升了用户的体验感受。但是只是在安卓版本的虎嗅APP才有,iOS版本的并没有体验到。

前期调研

因为那个动画只有在你首次安装APP的时候才会触发,这样我们就要经过好多次的调试。我们总结为是把所有的标签都写在了本地。那么,现在就是要把这些六边形一个个的写进去,就可以了。

建立一个不规则的坐标系


因为六边形画的不他好就用了圆形来代替,就是建立一个这样的坐标系来代替每个六边形在视图中的位置,这样我们就不用去计算每一个六边形的位置了,只要知道了它的坐标,那就可以知道它的具体的位置。

实现

把每一个六边形看成一个数据模型,创建一个六边形模型HexPointModel,现在先给两个属性XY

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface HexPointModel : NSObject

@property (nonatomic, assign) NSInteger X;

@property (nonatomic, assign) NSInteger Y;

@end

NS_ASSUME_NONNULL_END

然后我们写个统一的方法方便我们创建数据模型

- (HexPointModel *)createModelWithX:(NSInteger)X Y:(NSInteger)Y{
    HexPointModel *model = [[HexPointModel alloc]init];
    model.X = X;
    model.Y = Y;
    return model;
}

然后我们在 -(void)viewDidLoad{}中简单的先给几个坐标来显示一下效果:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.interestScrollView = [[UIScrollView alloc]initWithFrame:self.view.bounds];
    [self.view addSubview:self.interestScrollView];
    self.nodeArray = [NSMutableArray new];
    HexPointModel *model0 = [self createModelWithX:0 Y:0];
    [self.nodeArray addObject:model0];
    HexPointModel *model1 = [self createModelWithX:0 Y:1];
    [self.nodeArray addObject:model1];
    HexPointModel *model2 = [self createModelWithX:5 Y:5];
    [self.nodeArray addObject:model2];

    [self creatHexagonViewWith:self.nodeArray];
}
- (void)creatHexagonViewWith:(NSMutableArray*)array{

    CGFloat side = 100;
    CGFloat marginTop = 80;
    CGFloat marginLeft = 50;

    CGFloat maxX = 0;
    CGFloat maxY = 0;


    for (HexPointModel *point  in array) {

        CGFloat xPoint = side * point.X + (point.Y % 2 == 0 ? 0 : marginLeft);
        CGFloat yPoint = marginTop * point.Y;

        HexagonalView *hexView = [[HexagonalView alloc]initWithFrame:CGRectMake(xPoint, yPoint, side, side)];
        hexView.backgroundColor = [UIColor yellowColor];
        hexView.isDraw = YES;
        hexView.delegate = self;
        [hexView setViewDataWith:point];
        [self.interestScrollView addSubview:hexView];

        if (maxX < point.X) {
            maxX = point.X;
        }
        if (maxY < point.Y) {
            maxY = point.Y;
        }

    }

    CGFloat sizeX = maxX * side + 100 + 50;
    CGFloat sizeY = maxY * marginTop + 100 + 50;
    if (self.interestScrollView.contentSize.width > sizeX) {
        sizeX = self.interestScrollView.contentSize.width;
    }
    if (self.interestScrollView.contentSize.height > sizeY) {
        sizeY = self.interestScrollView.contentSize.height;
    }
    self.interestScrollView.contentSize = CGSizeMake(sizeX, sizeY);

}

这样就可以实现这个功能了。然后就是自定义的去绘制一个六边形,然后用- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event这个函数 去判断触摸的点是不是在你绘制的六边形之内就可以了。这样的处理网上有很多。

相关文章
|
缓存 数据挖掘 API
商品详情API接口的应用实践
本文探讨了商品详情API接口在电商领域的应用实践,介绍了其作为高效数据交互方式的重要性,包括实时获取商品信息、提升用户体验和运营效率。文章详细描述了API接口的特点、应用场景如商品展示、SEO优化、数据分析及跨平台整合,并提出了缓存机制、分页加载、异步加载和错误处理等优化策略,旨在全面提升电商运营效果。
|
存储 算法 编译器
C 数组详解
在C语言中,数组是一种用于存储多个同类型数据的集合。本文介绍了数组的基本特性与使用方法,包括定义与初始化、索引访问、多维数组、指针操作、大小计算及函数传递等内容。数组名可视为指向首元素的指针,支持遍历、排序与查找等常见操作。数组大小固定,访问越界会导致未定义行为。此外,还可以将数组嵌套在结构体中以增加数据复杂性。
202 10
|
运维 监控 网络协议
IP 地址是什么,有什么用,通俗易懂答案?
**IP地址是互联网上设备的唯一标识,分为IPv4(32位,如192.168.1.1)和IPv6(128位,如2001:0db8:85a3:0000:0000:8a2e:0370:7334)。IP地址用于定位设备、数据包传递、网络安全和管理。分为公有(全球唯一)和私有(局域网内使用)IP,以及动态(DHCP分配)和静态(固定不变)IP。IP管理由ICANN和区域机构负责。了解IP地址基础知识对网络理解和故障排查至关重要。**
2121 3
|
Web App开发 编解码 JavaScript
【Vue篇】Vue 项目下载、介绍(详细版)
【Vue篇】Vue 项目下载、介绍(详细版)
228 3
|
存储 人工智能 C++
【重学C++】【指针】详解让人迷茫的指针数组和数组指针
【重学C++】【指针】详解让人迷茫的指针数组和数组指针
606 1
|
机器学习/深度学习 人工智能 语音技术
语音识别01-----语音合成,分离,变声实战模块介绍
语音识别01-----语音合成,分离,变声实战模块介绍
|
存储 关系型数据库 MySQL
MySQL - 高效的设计MySQL库表
MySQL - 高效的设计MySQL库表
223 0
|
机器学习/深度学习 自然语言处理 计算机视觉
【论文泛读】ConvNeXt:A ConvNet for the 2020s(新时代的卷积)
【论文泛读】ConvNeXt:A ConvNet for the 2020s(新时代的卷积)
|
分布式计算 监控 Hadoop
浅显易懂入门大数据系列:三、Zookeeper(超详细)
浅显易懂入门大数据系列:三、Zookeeper(超详细)
427 0
浅显易懂入门大数据系列:三、Zookeeper(超详细)
|
SQL 数据库
springboot+mybatis,mapper调用查询的数据为空,报空指针异常
springboot+mybatis,mapper调用查询的数据为空,报空指针异常
1952 0