【iOS】随机三角瓷砖布局算法

你已经看够iOS鉴于这些默认的正方形块,整齐地显示?

本篇给出一个随机算法设计的三角布局的瓷砖和实施。

这样的规则,并提出妥协随机排列间。它看起来很凌乱,不会有一个新事物。

重点是设计和实施,以实现布局算法,能够改变颜色或者加入图片。

最新源码下载地址:https://github.com/duzixi/Varied-Layouts(持续维护。欢迎互粉)

博文首发地址:http://blog.csdn.net/duzixi

布局生成效果例如以下:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZHV6aXhp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >       

核心算法设计以及代码实现例如以下:

//
//  TriangleViewController.m
//  TriangleLayout
//
//  Created by 杜子兮(duzixi) on 14-8-24.
//  Copyright (c) 2014年 lanou3g.com All rights reserved.
//

#import "TriangleViewController.h"
#import "Triangle.h"
#import <QuartzCore/QuartzCore.h>

#define PADDING 10
#define SIZE 100
#define COL (self.view.frame.size.width / SIZE)
#define ROW (self.view.frame.size.height / SIZE)

@interface TriangleViewController ()

@end

@implementation TriangleViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
    _randomPoints = [NSMutableArray array];
    _triangles = [NSMutableArray array];

    int oy = - SIZE / 2;

    for (int i = 0; i < ROW + 1; i++) {
        for (int j = 0; j < COL; j++) {
            int ox = (i % 2 == 1) ? j * SIZE : j * SIZE - 0.5 * SIZE;
            ox -= SIZE / 4;
            // step 1:画格子
            UIView *view = [[UIView alloc] initWithFrame:CGRectMake(ox, i * SIZE + oy, SIZE, SIZE)];
            if ((j + i ) % 2 == 0) {
                view.backgroundColor = [UIColor grayColor];
            }
            // [self.view addSubview:view];

            // step 2:在格子中产生随机点
            int x = arc4random() % (SIZE - PADDING * 2) + view.frame.origin.x + PADDING;
            int y = arc4random() % (SIZE - PADDING * 2) + view.frame.origin.y + PADDING;
            CGPoint p = CGPointMake(x, y);
            NSValue *v = [NSValue valueWithCGPoint:p];
            [_randomPoints addObject:v];
            UIView *pView = [[UIView alloc] initWithFrame:CGRectMake(p.x, p.y, 2, 2)];
            pView.backgroundColor = [UIColor blueColor];
            // [self.view addSubview:pView];

            UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(p.x, p.y, 50, 20)];
            label.text = [NSString stringWithFormat:@"%lu",(unsigned long)[_randomPoints count]];
            // [self.view addSubview:label];
        }
    }

    int k = 0;
    for (int i = 0; i < ROW; i++) {
        NSLog(@"-----------------");
        for (int j = 0; j < COL - 1; j++) {
            // step 3: 俺三角形将点归类
            k = i * COL + j + i;
            Triangle *t = [[Triangle alloc] init];
            t.p1 = [_randomPoints[k] CGPointValue];
            t.p2 = [_randomPoints[k + 1] CGPointValue];
            int col = i % 2 == 0  ?  COL : COL + 1;
            t.p3 = [_randomPoints[k + 1 + col] CGPointValue];

            NSLog(@"%d %d %d", k , k + 1, k + 1 + col);
            [_triangles addObject:t];

            // step 4: 生成三角形所在的矩形区域
            int minX = t.p1.x < t.p2.x ?

t.p1.x : t.p2.x;
            minX = minX < t.p3.x ? minX : t.p3.x;
            int minY = t.p1.y < t.p2.y ? t.p1.y : t.p2.y;
            minY = minY < t.p3.y ?

minY : t.p3.y;

            int maxX = t.p1.x > t.p2.x ?

t.p1.x : t.p2.x;
            maxX = maxX > t.p3.x ? maxX : t.p3.x;
            int maxY = t.p1.y > t.p2.y ? t.p1.y : t.p2.y;
            maxY = maxY > t.p3.y ? maxY : t.p3.y;

            k++;

            UIImageView *view = [[UIImageView alloc] initWithFrame:CGRectMake(minX, minY, maxX - minX, maxY - minY)];
            view.backgroundColor = [UIColor orangeColor];

            // step 5: 依据三角形生成蒙板
            UIBezierPath *path = [UIBezierPath bezierPath];
            [path moveToPoint:CGPointMake(t.p1.x - minX, t.p1.y - minY)];
            [path addLineToPoint:CGPointMake(t.p2.x - minX,  t.p2.y - minY)];
            [path addLineToPoint:CGPointMake(t.p3.x - minX, t.p3.y - minY)];
            [path closePath];

            CAShapeLayer *maskLayer = [CAShapeLayer layer];
            maskLayer.path = [path CGPath];
            view.layer.mask = maskLayer;

            [self.view addSubview:view];

        }
    }

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
//
//  Triangle.h
//  TriangleLayout
//
//  Created by 杜子兮(duzixi) on 14-8-24.
//  Copyright (c) 2014年 lanou3g.com All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Triangle : NSObject

@property (nonatomic, assign) CGPoint p1;
@property (nonatomic, assign) CGPoint p2;
@property (nonatomic, assign) CGPoint p3;
@end

为了让大家看清布局过程,代码中保留了一些中间过程(凝视掉了)。

打开凝视就可以看到格子,随机点等内容。

下一次的目标是将其改写成UICollectionView的Layout,请大家敬请期待

版权声明:本文博客原创文章。博客,未经同意,不得转载。

时间: 2025-01-08 08:25:30

【iOS】随机三角瓷砖布局算法的相关文章

随机三角形平铺布局算法(iOS实现)

你是否已经看够iOS里默认给出的那些方方正正的块状和规规矩矩的陈列? 本篇给出一种随机三角形平铺布局的算法设计和实现.这种布局在规矩与随机之间做了折中,使其看上去有新鲜感又不会很乱. 本次实现重点在于布局算法的设计和实现,可以改变颜色或者添加图片. 最新源代码下载地址:https://github.com/duzixi/Varied-Layouts(持续维护,欢迎互粉) 博文首发地址:http://blog.csdn.net/duzixi 布局生成效果如下:         核心算法设计以及代码

如何实现一个不规则排列的图片布局算法

本文转载至  http://www.tuicool.com/articles/RfeqiiQ 原文  http://www.cocoachina.com/ios/20150619/12172.html 主题 算法iOS开发 一直在 500px 上看照片,发照片.以前看它的首页图片展示就只是觉得好看,洋气,也没想过自己在iOS上实现一下.昨天不知怎么的就开始想其中的算法了,现在我把思考的过程在这里贴出来分享一下,如果你有更好的算法欢迎探讨. 最终我做出的效果是这样的: 垂直滚动 水平滚动 算法总体

HDU2138 随机素数测试 Miller-Rabin算法

题目描述 Give you a lot of positive integers, just to find out how many prime numbers there are.. In each case, there is an integer N representing the number of integers to find. Each integer won’t exceed 32-bit signed integer, and each of them won’t be

iOS随机颜色

#import <UIKit/UIKit.h> @interface UIColor (RandomColor) +(UIColor *) randomColor; @end #import "UIColor+RandomColor.h" @implementation UIColor (RandomColor) +(UIColor *) randomColor { CGFloat hue = ( arc4random() % 256 / 256.0 ); //0.0 to

6月27日 OGDF不同的布局算法

检查不同布局算法 备注 CircularLayout 可以非连通 FastMultipoleMultilevelEmbedder    FMMMLayout   可以非连通 StressMajorization 未成功 必须连通 GEMLayout 未成功 BalloonLayout 未成功 需要为树? PlanarizationLayout   来自为知笔记(Wiz)

iOS开发——UI篇&amp;九宫格算法

九宫格算法 关于iOS开发中九宫格的实现虽然使用不多,而且后面会有更好的方实现,但是作为一个程序员必需要知道的就是九宫格算法的实现. 一:实现思路: (1)明确每一块用得是什么view (2)明确每个view之间的父子关系,每个视图都只有一个父视图,拥有很多的子视图. (3)可以先尝试逐个的添加格子,最后考虑使用for循环,完成所有uiview的创建 (4)加载app数据,根据数据长度创建对应个数的格子 (5)添加格子内部的子控件 (6)给内部的子控件装配数据 二:算法的实现 1 /* 2 *

【转】iOS,搜索标签布局

前一阵时间,看过这样一个demo,代码不多,但是简洁易懂. 转自: //  代码地址: https://github.com/iphone5solo/PYSearch //  代码地址: http://www.code4app.com/thread-11175-1-1.html /** 添加和布局标签 */ - (NSArray *)addAndLayoutTagsWithTagsContentView:(UIView *)contentView tagTexts:(NSArray<NSStri

IOS开发之绝对布局和相对布局(屏幕适配)

之前如果做过Web前端页面的小伙伴们,看到绝对定位和相对定位并不陌生,并且使用起来也挺方便.在IOS的UI设计中也有绝对定位和相对定位,和我们的web前端的绝对定位和相对定位有所不同但又有相似之处.下面会结合两个小demo来学习一下我们IOS开发中UI的绝对定位和相对定位.在前面的博客中所用到的UI事例用的全是绝对定位,用我们Storyboard拖拽出来的控件全是绝对定位的,就是我们可以同改变组件的frame来改变组件的位置和大小.而相对定位则不同,相对定位是参考组件周围的元素来确定组件的大小或

iOS 7 修改默认布局从status bar 底部开始

最近在对公司的一个老项目进行版本升级,添加了导航栏和tabBar,并且在个人中心界面隐藏navigationBar,于是在控制器里添加了如下对象方法: - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; // 隐藏导航栏 [self.navigationController setNavigationBarHidden:YES animated:YES]; } 但是,随之出现的问题是,self.view