自定义 ---UICollectionViewLayout-正N变形居中布局
1. 自定义UICollectionLayout ---- 正三角形居中布局
支持多个图形的自动布局
2. 自定义UICollectionLayout ---- 正方形居中布局
滚动展示的区域
3. 自定义UICollectionLayout ---- 正六边形居中布局(蜂窝布局)
等等正n变形布局,其中 正六边形支持 间距大小的改变,图形的旋转。
旋转 --
间距
4. 核心代码 ---- 绘制正n边形 (贝塞尔曲线)
- (void)layoutSubviews { [super layoutSubviews]; // step 1: 绘制正n变形 CGFloat X = self.contentView.frame.size.width * 0.5; CGFloat Y = self.contentView.frame.size.height * 0.5; UIBezierPath* bezierPath = [UIBezierPath bezierPath]; bezierPath.lineCapStyle = kCGLineCapRound; bezierPath.lineJoinStyle = kCGLineCapRound; CGFloat angle = labs(360/self.number); [bezierPath moveToPoint: CGPointMake(X - mm , Y)]; for (int i = 0; i < self.number - 1; i ++) { CGFloat angle1 = angle *(i + 1); CGFloat XX = X + (mm * (COS(angle1)))*(-1); CGFloat YY = Y + mm * (SIN(angle1)); [bezierPath addLineToPoint: CGPointMake(XX, YY)]; } [bezierPath addLineToPoint: CGPointMake(X - mm , Y)]; // step 2: 根据路径生成蒙板 CAShapeLayer *maskLayer = [CAShapeLayer layer]; maskLayer.path = [bezierPath CGPath]; self.backgroundColor = [UIColor redColor]; // step 3: 给cell添加模版 self.layer.mask = maskLayer; self.titleLabel.frame = self.bounds; }
5. 核心代码 --- 自定义Layout布局
- (void)prepareLayout { [super prepareLayout]; _itemCount = [self.collectionView numberOfItemsInSection:]; _attributeAttay = [[NSMutableArray alloc]init]; ; i < _itemCount; i ++) { //设置第一个正六边形的中心位置 CGFloat X = self.collectionView.frame.size.width*0.5; CGFloat Y = self.TopMargin; == ? -:i%; == ? :i%; X += CST(-num)*([self judgeXWithNumber:self.number]); Y += ([self judgeSizeWithNumber:self.number].height + self.margin)*(i/) + CST(num2)*([self judgeSizeWithNumber:self.number].height/)+self.margin; UICollectionViewLayoutAttributes *attribute = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:[NSIndexPath indexPathForRow:i inSection:]]; // 设置每隔item的大小 attribute.size = [self judgeSizeWithNumber:self.number]; // 设置每隔item的圆心 // 计算每个item的中心坐标 attribute.center = CGPointMake(X, Y); [_attributeAttay addObject:attribute]; } } // X轴方向的间隔 - (CGFloat)judgeXWithNumber:(NSInteger)xNumber { ) { /xNumber)*mm; } ) { /xNumber)*mm; } ) { /xNumber)*mm - ; } ) { /xNumber)*mm; } ) { /xNumber)*mm; } else { *mm + self.margin ; } } // 就算正n变形的大小 - (CGSize)judgeSizeWithNumber:(NSInteger)sNumber { || sNumber == ) { *mm,*SIN(/sNumber)*mm); } else { *(mm),*mm); } } //设置内容区域的大小 -(CGSize)collectionViewContentSize { CGFloat hh = [self judgeSizeWithNumber:self.number].height; CGFloat height = (hh+self.margin)*(self.itemCount/ + ) + self.TopMargin + ; if (height > Device_height) { height = height; } else { height = Device_height; } return CGSizeMake(Device_width, height); } //返回设置数组 -(NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect{ return _attributeAttay; }
View Layout
自定义 ---UICollectionViewLayout-正N变形居中布局的更多相关文章
- 自定义UICollectionViewLayout 布局实现瀑布流
自定义 UICollectionViewLayout 布局,实现瀑布流:UICollectionView和UICollectionViewCell 另行创建,这只是布局文件, 外界控制器只要遵守协议并 ...
- iOS 关于自定义UICollectionViewLayout实现复杂布局
UICollectionView的简单介绍 UICollectionView的结构 Cells Supplementary Views 追加视图 (类似Header或者Footer) Decorati ...
- 自定义UICollectionViewLayout并添加UIDynamic - scorpiozj(转)
转载自:http://www.tuicool.com/articles/jM77Vf 自定义UICollectionViewLayout并添加UIDynamic UICollectionVie ...
- 自定义UICollectionViewLayout并添加UIDynamic
大家也可以到这里查看. UICollectionView是iOS6引入的控件,而UIDynamicAnimator是iOS7上新添加的框架.本文主要涵盖3部分: 一是简单概括UICollectionV ...
- 自定义UICollectionViewLayout 实现瀑布流
今天研究了一下自定义UICollectionViewLayout. 看了看官方文档,要自定义UICollectionViewLayout,需要创建一个UICollectionViewLayout的子类 ...
- 自定义UICollectionViewLayout之CATransform3D
1.自定义UICollectionViewLayout旋转效果 之前有自定义UICollectionViewLayout(适用于多个section),本文是一个对cell进行CATransform3D ...
- CSS居中布局总结【转】
居中布局 <div class="parent"> <div class="child">demo</div> </d ...
- CSS居中布局总结
居中布局 <div class="parent"> <div class="child">demo</div> </d ...
- sass—使用自定义function和@each实现栅格布局
/*使用自定义function和@each实现栅格布局*/ @function buildLayout($num: 5){ $map: (defaultValue: 0); //不能直接生成col,需 ...
随机推荐
- 第二代网关GateWay搭建流程
Spring Cloud第二代网关GateWay是由纯Netty开发,底层为Reactor,WebFlux构建,不依赖任何Servlet容器,它不同于Zuul,使用的是异步IO,性能较Zuul提升1. ...
- day21-双下eq方法
class Goods: def __init__(self,name): self.name = name def __eq__(self,other): #self = apple1, other ...
- Simple Random Sampling|representative sample|probability sampling|simple random sampling with replacement| simple random sampling without replacement|Random-Number Tables
1.2 Simple Random Sampling Census, :全部信息 Sampling: 抽样方式: representative sample:有偏向,研究者选择自己觉得有代表性的sam ...
- python之处理json字符串
一.如何从文件中读取json字符串 通过json模块可以处理json数据. 1.loads()方法 loads(json_object)将json字符串转换成dict类型. import json # ...
- Ubuntu navicat试用到期及乱码问题
对于Ubuntu18.04,navicat试用过期,我这采用的是删掉记录,使其重新试用 网上有的说删掉/home/.navicat64/system.reg,有的又加上删除.update-timest ...
- BGP联盟
---恢复内容开始--- 1. 每台路由器设置loop back口,r1和r6另外多设置两个 2. R2 R3 R4 R5 R6做ospf 以R2为例: ospf 1 router-id 2.2.2. ...
- Qt QString的arg()方法的使用
1.QString的arg()方法用于填充字符串中的%1,%2...为给定的参数,如 QString m = tr("); // m = "12:60:60: 2.它还有另外一种重 ...
- Fourier级数
目录 Fourier级数 函数的Fourier级数的展开 Fourier级数习题: Fourier级数 函数的Fourier级数的展开 Euler--Fourier公式 我们探讨这样一个问题: 假设\ ...
- OpenCV C++常用功能介绍
显示图片 IplImage* img = cvLoadImage("-/temp.jpeg", 1); //create a window to display the image ...
- python运行报错——注释报错
本人是IT行业的,从事软件测试,还是个菜鸟.希望大神们多多关照~ 首先,开通这个博客的目的: 1)通常我容易犯一些低级的错误,而且在网上找到解决方法,解决之后时间长了又不记得: 2)想和有共同兴趣的人 ...