学习文章
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 个单位开始切割
代码如下:
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)
}
}
}
效果如下:
我们可以给它加上网格,效果如下:
对其进行对象化封装:
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)
}
}