你已经看够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" alt="">       

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

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

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

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

  1. 从 Auto Layout 的布局算法谈性能

    这是使用 ASDK 性能调优系列的第二篇文章,前一篇文章中讲到了如何提升 iOS 应用的渲染性能,你可以点击 这里 了解这部分的内容. http://t.cn/Rc4KbUC 在上一篇文章中,我们提到 ...

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

    检查不同布局算法 备注 CircularLayout 可以非连通 FastMultipoleMultilevelEmbedder    FMMMLayout   可以非连通 StressMajoriz ...

  3. Redesign Your App for iOS 7 之 页面布局

    Redesign Your App for iOS 7 之 页面布局 http://www.vinqon.com/codeblog/?detail/11109

  4. 【转】iOS,搜索标签布局

    前一阵时间,看过这样一个demo,代码不多,但是简洁易懂. 转自: //  代码地址: https://github.com/iphone5solo/PYSearch //  代码地址: http:/ ...

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

    之前如果做过Web前端页面的小伙伴们,看到绝对定位和相对定位并不陌生,并且使用起来也挺方便.在IOS的UI设计中也有绝对定位和相对定位,和我们的web前端的绝对定位和相对定位有所不同但又有相似之处.下 ...

  6. IOS随机随学

    1.Objective-C是一种面向对象的语言. 2.Objective-C类声明和实现包括两个部分:接口部分和实现部分. 3.Objective-C中方法不是在“.”运算符,而是采用“[]”运算符. ...

  7. iOS面试中常见的算法题目

    一.前言 这里是在iOS求职中自己遇到的算法题,希望对大家有所帮助.不定期更新.如果大家想在线运行代码调试,可以将代码拷贝到这里.然后进行调试.下面就是常见的算法题目. 二.正文 1.就n的阶乘.(这 ...

  8. iOS开发~UI布局(三)深入理解autolayout

    一.概要 通过对iOS8界面布局的学习和总结,发现autolayout才是主角,autolayout是iOS6引入的新特性,当时还粗浅的学习了下,可是没有真正应用到项目中.随着iOS设备尺寸逐渐碎片化 ...

  9. iOS开发~UI布局(二)storyboard中autolayout和size class的使用详解

    一.概要:前一篇初步的描述了size class的概念,那么实际中如何使用呢,下面两个问题是我们一定会遇到的: 1.Xcode6中增加了size class,在storyboard中如何使用? 2.a ...

随机推荐

  1. Android开发之模板模式初探

    模板模式我认为在Android的开发中是最长用到的,基本是随处可见的,认识该模式,有助于我们对Android的源代码及框架有一个更深层次的认识.那什么是模板模式呢,模板模式就是定义一个基本框架,将当中 ...

  2. cocos2d 走动椭圆

    1.效果图 艺术与规划说他想与我合作在全国率先主角光环加,椭圆形走动. cocos2d自带没有,參考网上的写了一个. 2.椭圆数学知识 有关椭圆的数学知识我已经忘光了.网上找了点资料: a是椭圆的长半 ...

  3. APPCAN学习笔记001---app高速开发AppCan.cn平台概述

    1.APPCAN学习笔记---app高速开发AppCan.cn平台概述 1. 平台概述 技术qq交流群:JavaDream:251572072 AppCan.cn开发平台是基于HTML5技术的跨平台移 ...

  4. 单例模式 - 程序实现(Java)

    我们知道单例模式,其实就是返回一个被调用类的实例. 在频繁的进行实例(Instance)创建过程,难免过多的进行new InstanceName():我们可以只通过调用一个方法解决. 在进行设计模式的 ...

  5. 破解.net程序 编译和反编译方法

    原文地址:http://www.cnblogs.com/li-peng/archive/2013/01/31/2886727.html 有好多.net程序有加密狗或者有验证,如果exe或dll没有做过 ...

  6. javascript它【蛇系列】第一弹:简单的蛇实现

    参考博客:http://blog.csdn.net/sunxing007/article/details/4187038 上面的博客是一个参考,竟第一次做.真让自己盲人摸象做不出来. 只是我在其上做了 ...

  7. 纯CSS实现各类气球泡泡对话框效果

    原文 纯CSS实现各类气球泡泡对话框效果 一.关于纯CSS实现气泡对话框 首先,来张大图: 上边这张黄黄的,大大的,圆圆的,有个小尾巴,文字内容有些YY的图片,就是使用纯CSS实现的气泡对话框效果,一 ...

  8. 【Unity3D自学记录】利用代码改动图片属性(Inspector)

    这段时间一直都在打包资源,然后每次导入都要改图片的属性.真是麻烦,所以一直在寻找一键改动而且打包的方法. 最终让我找到了,太坑人了. 依据自己的需求改代码哦,相信大家都能看明确. 核心部分: Text ...

  9. 采用keepalived施工可用性MySQL-HA

    描述了使用keepalived施工可用性MySQL-HA,两个保证MySQL数据一致性,然后,keepalived虚拟IP,经keepalived内置的在线监测功能来实现MySQL. AD: 关于My ...

  10. It's only too late if you decide it is. Get busy living, or get busy dying(转)

    我们的身边是不是有这样的一群人,他们心肠不坏,容易感伤,但吐槽似乎是常有的事情,看着时下电视电影,说起哪些哪些自己的泪点.一般都是吃货,别人失眠的时候,TA可能在回忆自己刚做了什么梦.我不是要去评论这 ...