Cellular Matrix 蜂窝矩阵(一)

起源

最近的新项目要在兴趣选择的标签上作一些文章,看了一些国内须要兴趣选择的APP的样式,基本都是不规则的横向排列标签选择模式,基本都是用CollectionView配合着本身从新写的FLowLayout进行从新的布局排布。然而,虎嗅APP的兴趣选择标签的样式却是很独特,用了一种相似蜂窝样式的排布来进行选择,同时还配合动画效果,进一步的提高了用户的体验感觉。可是只是在安卓版本的虎嗅APP才有,iOS版本的并无体验到。node

前期调研

由于那个动画只有在你首次安装APP的时候才会触发,这样咱们就要通过好屡次的调试。咱们总结为是把全部的标签都写在了本地。那么,如今就是要把这些六边形一个个的写进去,就能够了。ide

创建一个不规则的坐标系

由于六边形画的不他好就用了圆形来代替,就是创建一个这样的坐标系来代替每一个六边形在视图中的位置,这样咱们就不用去计算每个六边形的位置了,只要知道了它的坐标,那就能够知道它的具体的位置。

实现

把每个六边形当作一个数据模型,建立一个六边形模型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这个函数 去判断触摸的点是否是在你绘制的六边形以内就能够了。这样的处理网上有不少。ui

相关文章
相关标签/搜索