Commit 50d1b21d by Daniel Dahan

updated Grid interface

parent c524d017
...@@ -7,6 +7,8 @@ ...@@ -7,6 +7,8 @@
objects = { objects = {
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
9656CD121C6C664700EBCEF1 /* Material.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9656CD111C6C664700EBCEF1 /* Material.framework */; };
9656CD131C6C664700EBCEF1 /* Material.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9656CD111C6C664700EBCEF1 /* Material.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
965C58CD1C6B936400CFB4E1 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 965C58CC1C6B936400CFB4E1 /* AppDelegate.swift */; }; 965C58CD1C6B936400CFB4E1 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 965C58CC1C6B936400CFB4E1 /* AppDelegate.swift */; };
965C58CF1C6B936400CFB4E1 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 965C58CE1C6B936400CFB4E1 /* ViewController.swift */; }; 965C58CF1C6B936400CFB4E1 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 965C58CE1C6B936400CFB4E1 /* ViewController.swift */; };
965C58D41C6B936400CFB4E1 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 965C58D31C6B936400CFB4E1 /* Assets.xcassets */; }; 965C58D41C6B936400CFB4E1 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 965C58D31C6B936400CFB4E1 /* Assets.xcassets */; };
...@@ -20,6 +22,7 @@ ...@@ -20,6 +22,7 @@
dstPath = ""; dstPath = "";
dstSubfolderSpec = 10; dstSubfolderSpec = 10;
files = ( files = (
9656CD131C6C664700EBCEF1 /* Material.framework in Embed Frameworks */,
); );
name = "Embed Frameworks"; name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
...@@ -27,6 +30,7 @@ ...@@ -27,6 +30,7 @@
/* End PBXCopyFilesBuildPhase section */ /* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
9656CD111C6C664700EBCEF1 /* Material.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; name = Material.framework; path = "/Users/danieldahan/Library/Developer/Xcode/DerivedData/Material-hbpnflxhoouqxebjcyhbbhqyesjd/Build/Products/Debug-iphoneos/Material.framework"; sourceTree = "<absolute>"; };
965C58C91C6B936400CFB4E1 /* GridView.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GridView.app; sourceTree = BUILT_PRODUCTS_DIR; }; 965C58C91C6B936400CFB4E1 /* GridView.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GridView.app; sourceTree = BUILT_PRODUCTS_DIR; };
965C58CC1C6B936400CFB4E1 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; }; 965C58CC1C6B936400CFB4E1 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
965C58CE1C6B936400CFB4E1 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; }; 965C58CE1C6B936400CFB4E1 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
...@@ -40,6 +44,7 @@ ...@@ -40,6 +44,7 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
9656CD121C6C664700EBCEF1 /* Material.framework in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
...@@ -49,6 +54,7 @@ ...@@ -49,6 +54,7 @@
965C58C01C6B936400CFB4E1 = { 965C58C01C6B936400CFB4E1 = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
9656CD111C6C664700EBCEF1 /* Material.framework */,
965C58CB1C6B936400CFB4E1 /* GridView */, 965C58CB1C6B936400CFB4E1 /* GridView */,
965C58CA1C6B936400CFB4E1 /* Products */, 965C58CA1C6B936400CFB4E1 /* Products */,
); );
......
...@@ -30,70 +30,88 @@ ...@@ -30,70 +30,88 @@
import UIKit import UIKit
public enum GridRow : Int { public enum GridAxisDirection {
case Row1 = 1
case Row2 = 2
case Row3 = 3
case Row4 = 4
case Row5 = 5
case Row6 = 6
case Row7 = 7
case Row8 = 8
case Row9 = 9
case Row10 = 10
case Row11 = 11
case Row12 = 12
}
public enum GridColumn : Int {
case Column1 = 1
case Column2 = 2
case Column3 = 3
case Column4 = 4
case Column5 = 5
case Column6 = 6
case Column7 = 7
case Column8 = 8
case Column9 = 9
case Column10 = 10
case Column11 = 11
case Column12 = 12
}
public enum GridAxis {
case Horizontal case Horizontal
case Vertical case Vertical
} }
public class Grid { public class GridAxis {
/// The row size. /// Grid reference.
public var row: GridRow { unowned var grid: Grid
/// Inherit grid rows and columns.
public var inherited: Bool = true
/// The direction the grid layouts its views out.
public var direction: GridAxisDirection = .Horizontal
/// The rows size.
public var rows: Int {
didSet { didSet {
reloadLayout() grid.reloadLayout()
} }
} }
/// The row size. /// The columns size.
public var rowOffset: GridRow? { public var columns: Int {
didSet { didSet {
reloadLayout() grid.reloadLayout()
}
}
public init(grid: Grid, rows: Int = 12, columns: Int = 12) {
self.grid = grid
self.rows = rows
self.columns = columns
}
}
public class GridOffset {
/// Grid reference.
unowned var grid: Grid
/// The rows size.
public var rows: Int {
didSet {
grid.reloadLayout()
} }
} }
/// The column size. /// The columns size.
public var column: GridColumn { public var columns: Int {
didSet {
grid.reloadLayout()
}
}
public init(grid: Grid, rows: Int = 0, columns: Int = 0) {
self.grid = grid
self.rows = rows
self.columns = columns
}
}
public class Grid {
/// The rows size.
public var rows: Int {
didSet { didSet {
reloadLayout() reloadLayout()
} }
} }
/// The column size. /// The columns size.
public var columnOffset: GridColumn? { public var columns: Int {
didSet { didSet {
reloadLayout() reloadLayout()
} }
} }
/// Offsets for rows and columns.
public private(set) var offset: GridOffset!
/// The axis in which the Grid is laying out its views.
public private(set) var axis: GridAxis!
/// Preset inset value for grid. /// Preset inset value for grid.
public var contentInsetPreset: MaterialEdgeInsetPreset = .None { public var contentInsetPreset: MaterialEdgeInsetPreset = .None {
didSet { didSet {
...@@ -108,20 +126,13 @@ public class Grid { ...@@ -108,20 +126,13 @@ public class Grid {
} }
} }
/// The space between grid columns. /// The space between grid columnss.
public var spacing: CGFloat { public var spacing: CGFloat {
didSet { didSet {
reloadLayout() reloadLayout()
} }
} }
/// The axis in which the Grid is laying out its views.
public var axis: GridAxis = .Horizontal {
didSet {
reloadLayout()
}
}
/// An Array of UIButtons. /// An Array of UIButtons.
public var views: Array<UIView>? { public var views: Array<UIView>? {
didSet { didSet {
...@@ -129,10 +140,12 @@ public class Grid { ...@@ -129,10 +140,12 @@ public class Grid {
} }
} }
public init(row: GridRow = .Row12, column: GridColumn = .Column12, spacing: CGFloat = 0) { public init(rows: Int = 12, columns: Int = 12, spacing: CGFloat = 0) {
self.row = row self.rows = rows
self.column = column self.columns = columns
self.spacing = spacing self.spacing = spacing
self.offset = GridOffset(grid: self)
self.axis = GridAxis(grid: self)
} }
/// Reload the button layout. /// Reload the button layout.
...@@ -143,13 +156,13 @@ public class Grid { ...@@ -143,13 +156,13 @@ public class Grid {
for var i: Int = 0, l: Int = v.count - 1; i <= l; ++i { for var i: Int = 0, l: Int = v.count - 1; i <= l; ++i {
let view: UIView = v[i] let view: UIView = v[i]
if let sv: UIView = view.superview { if let sv: UIView = view.superview {
let w: CGFloat = (sv.bounds.width - contentInset.left - contentInset.right + spacing) / CGFloat(column.rawValue) let w: CGFloat = (sv.bounds.width - contentInset.left - contentInset.right + spacing) / CGFloat(axis.inherited ? columns : axis.columns)
let h: CGFloat = (sv.bounds.height - contentInset.top - contentInset.bottom + spacing) / CGFloat(row.rawValue) let h: CGFloat = (sv.bounds.height - contentInset.top - contentInset.bottom + spacing) / CGFloat(axis.inherited ? rows : axis.rows)
let c: Int = view.grid.column.rawValue let c: Int = view.grid.columns
let r: Int = view.grid.row.rawValue let r: Int = view.grid.rows
let co: Int = nil == view.grid.columnOffset ? 0 : view.grid.columnOffset!.rawValue let co: Int = view.grid.offset.columns
let ro: Int = nil == view.grid.rowOffset ? 0 : view.grid.rowOffset!.rawValue let ro: Int = view.grid.offset.rows
if .Horizontal == axis { if .Horizontal == axis.direction {
// View height. // View height.
let vh: CGFloat = sv.bounds.height - contentInset.top - contentInset.bottom let vh: CGFloat = sv.bounds.height - contentInset.top - contentInset.bottom
...@@ -167,7 +180,9 @@ public class Grid { ...@@ -167,7 +180,9 @@ public class Grid {
} else { } else {
view.frame = CGRectMake(vl, contentInset.top, vw, vh) view.frame = CGRectMake(vl, contentInset.top, vw, vh)
} }
} else if .Vertical == axis {
n += c + co - 1
} else if .Vertical == axis.direction {
// View width. // View width.
let vw: CGFloat = sv.bounds.width - contentInset.left - contentInset.right let vw: CGFloat = sv.bounds.width - contentInset.left - contentInset.right
...@@ -184,17 +199,17 @@ public class Grid { ...@@ -184,17 +199,17 @@ public class Grid {
} else { } else {
view.frame = CGRectMake(contentInset.left, vt, vw, vh) view.frame = CGRectMake(contentInset.left, vt, vw, vh)
} }
m += r + ro - 1
} }
n += c + co - 1
m += r + ro - 1
} }
} }
} }
} }
} }
private func associatedObject<ValueType: AnyObject>(base: AnyObject, key: UnsafePointer<UInt8>, initialiser: () -> ValueType) -> ValueType { private func associatedObject<T: AnyObject>(base: AnyObject, key: UnsafePointer<UInt8>, initialiser: () -> T) -> T {
if let associated = objc_getAssociatedObject(base, key) as? ValueType { if let associated: T = objc_getAssociatedObject(base, key) as? T {
return associated return associated
} }
...@@ -203,7 +218,7 @@ private func associatedObject<ValueType: AnyObject>(base: AnyObject, key: Unsafe ...@@ -203,7 +218,7 @@ private func associatedObject<ValueType: AnyObject>(base: AnyObject, key: Unsafe
return associated return associated
} }
private func associateObject<ValueType: AnyObject>(base: AnyObject, key: UnsafePointer<UInt8>, value: ValueType) { private func associateObject<T: AnyObject>(base: AnyObject, key: UnsafePointer<UInt8>, value: T) {
objc_setAssociatedObject(base, key, value, .OBJC_ASSOCIATION_RETAIN) objc_setAssociatedObject(base, key, value, .OBJC_ASSOCIATION_RETAIN)
} }
...@@ -212,7 +227,9 @@ private var gridKey: UInt8 = 0 ...@@ -212,7 +227,9 @@ private var gridKey: UInt8 = 0
public extension UIView { public extension UIView {
public var grid: Grid { public var grid: Grid {
get { get {
return associatedObject(self, key: &gridKey) { return Grid() } return associatedObject(self, key: &gridKey) {
return Grid()
}
} }
set(value) { set(value) {
associateObject(self, key: &gridKey, value: value) associateObject(self, key: &gridKey, value: value)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment