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

你是否已经看够iOS里默认给出的那些方方正正的块状和规规矩矩的陈列?

本篇给出一种随机三角形平铺布局的算法设计和实现。这种布局在规矩与随机之间做了折中,使其看上去有新鲜感又不会很乱。

本次实现重点在于布局算法的设计和实现,可以改变颜色或者添加图片。

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

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

布局生成效果如下:

       

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

//
//  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,请大家敬请期待

时间: 2024-12-20 15:52:38

随机三角形平铺布局算法(iOS实现)的相关文章

#金码坊AOS开发平台# 增加了用户自定义快捷菜单在平铺布局下的用户自定义排序管理

#AOS开发平台# 增加了用户自定义快捷菜单在平铺布局下的用户自定义排序管理.

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

你已经看够iOS鉴于这些默认的正方形块,整齐地显示? 本篇给出一个随机算法设计的三角布局的瓷砖和实施. 这样的规则,并提出妥协随机排列间.它看起来很凌乱,不会有一个新事物. 重点是设计和实施,以实现布局算法,能够改变颜色或者加入图片. 最新源码下载地址:https://github.com/duzixi/Varied-Layouts(持续维护.欢迎互粉) 博文首发地址:http://blog.csdn.net/duzixi 布局生成效果例如以下: watermark/2/text/aHR0cDo

ios之用Autolayout均匀平铺排列多个button按钮

前言: iPhone的屏幕越来越大,然而适配起来比较复杂,不得不用Autolayout来写代码,今天就简单的实现了一个均匀平铺view的功能.学会了这个功能以后,以后所有的适配都是小cass了吧!哈哈(我这么认为). 请看效果: 实现方式就不在博客里写了,直接看Demo吧,很简单的. Demo下载地址:ios之用Autolayout均匀平铺排列多个button按钮

平铺导航——基于分屏导航的实现(IOS开发)

导航模式 -平铺导航:内容没有层次关系,其实就在一个主屏幕上,只是采用分屏分页控制器来导航,可以左右上下滑动屏幕查看内容.(如:系统自带的天气) -标签导航:内容被分割几个功能模块,但这些功能实际上没有任何关系.通过标签管理.标签应用太多太多了... -树形导航:有层次,从上到下细分为或者为包含的关系.(如:邮箱) 这几个经常组合起来一起使用. 这里主要讲平铺导航. 用到的控件为分屏控件(UIPageControl)和滚动视图控件(ScrollView),在这个过程中我们可能确实新建了许多Vie

69、Android 布局中轻松实现图片的全屏、居中、平铺

public void paint() { if (item.laying_mode != 1)//平铺或者充满 { new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { Looper.prepare(); try { theBitmap = Glide. with(ctxt). load(item.src). asBitmap(). into(fenbianl

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

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

Android 背景图片平铺

在drawable目录下创建一个repeat_bg.xml: <?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android"     android:src="@drawable/asdfg"     android:tileMode="repeat&q

UIImage图片处理,旋转、截取、平铺、缩放等操作

有时候我们需要处理图片,比如改变大小,旋转,截取等等,所以今天说一说图片处理相关的一些操作.本文所说的方法都是写在UIImage的Category中,这样使用起来也方便:由于代码太多,这里就不贴具体实现代码了,大家可以去我的Github查看demo,效果如下: 颜色相关 1.根据颜色生成纯色图片就是根据制定的颜色生成一张纯色的图片 1 + (UIImage *)imageWithColor:(UIColor *)color; 使用方法,比如设置UIImageView的图片为红色纯图片: 1 se

视图控制器和导航模式一(模态视图,平铺导航)

视图控制器的种类 UIViewController.用于自定义视图控制器的导航.例如,对于两个界面的跳转,我们可以用一个UIViewController来控制另外两个UIViewController. UINavigationController.导航控制器,它与UITableViewController结合使用,能够构建树形结构导航模式. UITabBarController.标签栏控制器,用于构建树标签导航模式. UIPageViewController.呈现电子书导航风格的控制器 UISp