【iOS】CGRectDivide

学习文章

  • 利用CGRectDivide进行布局
  • Swift 中的指针使用

CGRectDivide介绍

OC:

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

Swift

public func CGRectDivide(rect: CGRect, _ slice: UnsafeMutablePointer, _ remainder: UnsafeMutablePointer, _ 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 个单位开始切割
【iOS】CGRectDivide_第1张图片
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)
            }
        }
        
    }  

效果如下:

【iOS】CGRectDivide_第2张图片
利用CGRectDivide绘制网格

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

【iOS】CGRectDivide_第3张图片
绘制带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)
    }
}  

下载源码

下载地址

你可能感兴趣的:(【iOS】CGRectDivide)