【iOS】CGRectDivide

学习文章

CGRectDivide介绍

OC:

void CGRectDivide (
   CGRect rect,
   CGRect *slice,
   CGRect *remainder,
   CGFloat amount,
   CGRectEdge edge
);    

Swift

public func CGRectDivide(rect: CGRect, _ slice: UnsafeMutablePointer<CGRect>, _ remainder: UnsafeMutablePointer<CGRect>, _ amount: CGFloat, _ edge: CGRectEdge)  

这个函数的功能很简单,就是将一个 CGRect 切割成两个 CGRect ;其中, rect 参数是你要切分的对象; slice 是一个指向切出的 CGRect 的指针; remainder 是指向切割后剩下的 CGRect 的指针; amount 是你要切割的大小;最后一个参数 edge 是一个枚举值,代表 amount 开始计算的方向,假设 amount 为 10.0 那么:

  • CGRectMinXEdge 代表在 rect 从左往右数 10 个单位开始切割
  • CGRectMaxXEdge 代表在 rect 从右往左数 10 个单位开始切割
  • CGRectMinYEdge 代表在 rect 从上往下数 10 个单位开始切割
  • CGRectMaxYEdge 代表在 rect 从下往上数 10 个单位开始切割
CGRectDivide图解

代码如下:

CGRect rect = CGRectMake(0.0, 0.0, 100.0, 80.0);
CGRect slice, remainder;
CGRectDivide(rect, &slice, &remainder, 40.0, CGRectMinXEdge);  

和循环结合起来就可以方便构造一个网格布局:

    // 生成小网格
    func addGrid(rect: CGRect) {
    
        let gridView: UIView = UIView(frame: rect)
        gridView.backgroundColor = UIColor(hue: CGFloat(drand48()), saturation: 1, brightness: 1, alpha: 1)
        gridView.layer.borderColor = UIColor.grayColor().CGColor
        gridView.layer.borderWidth = 0.5
        
        view.addSubview(gridView)
    }
    
    // 网格布局
    func gridLayout() {
    
        let gridWidth:      CGFloat   = 40
        let gridHeight:     CGFloat   = 30
        let numberOfRow:    NSInteger = NSInteger(floor((view.bounds.size.height-20)/gridHeight))
        let numberOfColumn: NSInteger = NSInteger(floor((view.bounds.size.width)/gridWidth))
        var slice:          CGRect    = CGRectZero
        var rowReminder:    CGRect    = CGRectMake(0, 20, view.bounds.size.width, view.bounds.size.height-20)
        var columnReminder: CGRect    = CGRectZero
        
        // 行
        for _ in 0 ..< numberOfRow {
        
            CGRectDivide(rowReminder, &slice, &rowReminder, gridHeight, .MinYEdge)
            
            columnReminder = slice
            
            // 列
            for _ in 0 ..< numberOfColumn {
            
                CGRectDivide(columnReminder, &slice, &columnReminder, gridWidth, .MinXEdge)
                addGrid(slice)
            }
        }
        
    }  

效果如下:

利用CGRectDivide绘制网格

我们可以给它加上网格,效果如下:

绘制带padding的网格

对其进行对象化封装:

import UIKit

class CGRectModel {
    
    let rect: CGRect
    
    init(rect: CGRect) {
    
        self.rect = rect
    }
    
    func divided(amout: CGFloat, edge: CGRectEdge) -> (slice: CGRect, reminder: CGRect) {
    
        var slice:    CGRect = CGRectZero
        var reminder: CGRect = CGRectZero
        CGRectDivide(rect, &slice, &reminder, amout, edge)
        
        return (slice, reminder)
    }
    
    func dividedWithPadding(padding: CGFloat, amout: CGFloat, edge: CGRectEdge) -> (slice: CGRect, reminder: CGRect) {
    
        var slice:    CGRect = CGRectZero
        var reminder: CGRect = CGRectZero
        var tmpSlcie: CGRect = CGRectZero
        
        CGRectDivide(rect, &slice, &reminder, amout, edge)
        
        CGRectDivide(reminder, &tmpSlcie, &reminder, padding, edge)
        
        return (slice, reminder)
    }
}  

下载源码

下载地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • UIBezierPath Class Reference 译:UIBezierPath类封装了Core Graph...
    鋼鉄侠阅读 1,776评论 0 3
  • 转载自:https://github.com/Tim9Liu9/TimLiu-iOS[https://github...
    香橙柚子阅读 8,749评论 0 36
  • 上周末,终于去看了张扬导演的《冈仁波齐》,排片不多,一些影院一天只排一场,因此赶了个早场,有些困意,但也还好,不影...
    年少影追阅读 260评论 0 0
  • 一把年纪的老公打算创业了。 我也知道这是一个绝好的机会,却控制不住自己内心的不安。 1. Lynn是我来悉尼投奔的...
    格蕾丝姐阅读 326评论 2 1
  • 青山绿水 白云小狗 笑魇如花,嬉戏打闹的你们,有没有偷偷闻过路边的小花? 历时三小时的走山,李书记觉得你们棒棒的!...
    李小游阅读 368评论 2 3