Last active
August 29, 2015 14:04
-
-
Save pocketkk/b27f7b704567859af2f5 to your computer and use it in GitHub Desktop.
Swift - UIFactory
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Playground - noun: a place where people can play | |
import UIKit | |
class BaseUIDefaults { | |
class var sharedInstance : BaseUIDefaults { | |
struct Static { | |
static let instance : BaseUIDefaults = BaseUIDefaults() | |
} | |
return Static.instance | |
} | |
let bgColor = UIColor.whiteColor() | |
let headTextColor = UIColor.blackColor() | |
let bodyTextColor = UIColor.blueColor() | |
let buttonColor = UIColor.greenColor() | |
let buttonSize : CGFloat = 20.0 | |
let borderWidth : CGFloat = 2.0 | |
let borderColor = UIColor.blackColor().CGColor | |
let cornerRadius : CGFloat = 5.0 | |
let frameWidth = 100 | |
var fontSize : CGFloat = 20.0 | |
var defaultPaddingX : CGFloat = 10.0 | |
var defaultPaddingY : CGFloat = 10.0 | |
var viewBounds : CGRect? | |
// Returns rect that is positioned centered by x and height is set to lineHeight | |
func returnRectFor(view: UIView) -> CGRect { | |
return CGRectMake(view.bounds.minX + defaultPaddingX, view.bounds.minY + defaultPaddingY, view.bounds.width - defaultPaddingX, fontSize) | |
} | |
init() { | |
} | |
} | |
protocol Movable { | |
func moveDownBy(offset: CGFloat) | |
func moveRightBy(offset: CGFloat) | |
func addToView(view: UIView) | |
} | |
class CCView : UIView, Movable { | |
init(frame: CGRect) { | |
super.init(frame: frame) | |
} | |
func moveDownBy(offset: CGFloat) { | |
self.frame = CGRectOffset( self.frame, 0, offset ) | |
} | |
func moveRightBy(offset: CGFloat) { | |
self.frame = CGRectOffset(self.frame, offset, 0) | |
} | |
func addToView(view: UIView) { | |
view.addSubview(self) | |
} | |
} | |
class CCColumnView : UIView, Movable { | |
init(frame: CGRect) { | |
super.init(frame: frame) | |
} | |
func addViewsSidebySide(view1: UIView, view2: UIView) { | |
self.addSubview(view1) | |
view2.frame = CGRectOffset(view2.frame, view1.frame.width + 5, 0) | |
view2.center.y = view1.center.y | |
self.addSubview(view2) | |
self.sizeToFit() | |
} | |
func moveDownBy(offset: CGFloat) { | |
self.frame = CGRectOffset( self.frame, 0, offset ) | |
} | |
func moveRightBy(offset: CGFloat) { | |
self.frame = CGRectOffset(self.frame, offset, 0) | |
} | |
func addToView(view: UIView) { | |
view.addSubview(self) | |
} | |
} | |
class CCImage: UIImageView, Movable { | |
let shared = BaseUIDefaults.sharedInstance | |
init(path: String, view: UIView) { | |
super.init(frame: shared.returnRectFor(view)) | |
let image = UIImage(named: path) | |
self.image = image | |
self.sizeToFit() | |
} | |
func moveDownBy(offset: CGFloat) { | |
self.frame = CGRectOffset( self.frame, 0, offset ) | |
} | |
func moveRightBy(offset: CGFloat) { | |
self.frame = CGRectOffset(self.frame, offset, 0) | |
} | |
func addToView(view: UIView) { | |
view.addSubview(self) | |
} | |
} | |
class CCButton : UIButton, Movable { | |
// Button should be centered | |
let shared = BaseUIDefaults.sharedInstance | |
init(view: UIView, text: String) { | |
let viewBounds = shared.returnRectFor(view) | |
super.init(frame: viewBounds) | |
} | |
func moveDownBy(offset: CGFloat) { | |
self.frame = CGRectOffset( self.frame, 0, offset ) | |
} | |
func moveRightBy(offset: CGFloat) { | |
self.frame = CGRectOffset(self.frame, offset, 0) | |
} | |
func addToView(view: UIView) { | |
view.addSubview(self) | |
} | |
} | |
class CCLabel : UILabel, Movable { | |
var defaultPaddingX : CGFloat = 10 | |
var defaultPaddingY : CGFloat = 10 | |
var viewBounds : CGRect | |
var lineHeight : Double = 15.0 | |
let shared = BaseUIDefaults.sharedInstance | |
init(view: UIView, fontSize: CGFloat) { | |
viewBounds = shared.returnRectFor(view) | |
super.init(frame: viewBounds) | |
} | |
func startPoint(view:UIView, paddingX: Double, paddingY: Double) -> Void { | |
} | |
func moveDownBy(offset: CGFloat) { | |
self.frame = CGRectOffset( self.frame, 0, offset ) | |
} | |
func moveRightBy(offset: CGFloat) { | |
self.frame = CGRectOffset(self.frame, offset, 0) | |
} | |
func addToView(view: UIView) { | |
view.addSubview(self) | |
} | |
} | |
class UIFactory : BaseUIDefaults { | |
// Return and use singleton of UIFactory | |
override class var sharedInstance : UIFactory { | |
struct Static { | |
static let instance : UIFactory = UIFactory() | |
} | |
return Static.instance | |
} | |
func titleLabel(text: String, parentView: UIView) -> CCLabel { | |
let b = CCLabel(view: parentView, fontSize: fontSize) | |
b.text = text | |
b.font = UIFont.systemFontOfSize(fontSize) | |
b.textColor = headTextColor | |
b.textAlignment = NSTextAlignment.Left | |
return b | |
} | |
func bodyLabel(text: String, parentView: UIView) -> CCLabel { | |
let b = CCLabel(view: parentView, fontSize: fontSize) | |
b.text = text | |
b.font = UIFont.systemFontOfSize(fontSize - 10) | |
b.textColor = bodyTextColor | |
b.textAlignment = NSTextAlignment.Left | |
return b | |
} | |
func ccView(frame: CGRect) -> CCView { | |
var view = CCView(frame: frame) | |
view.backgroundColor = bgColor | |
view.layer.borderColor = borderColor | |
view.layer.borderWidth = borderWidth | |
view.layer.cornerRadius = cornerRadius | |
return view | |
} | |
func ccButton(text: String, parentView: UIView) -> CCButton { | |
var c = CCButton(view: parentView, text: text) | |
c.setTitle(text, forState: .Normal) | |
c.setTitleColor(buttonColor, forState: .Normal) | |
c.sizeToFit() | |
c.center.x = parentView.center.x | |
return c | |
} | |
} | |
class ViewBuilder { | |
class var sharedInstance : ViewBuilder { | |
struct Static { | |
static let instance : ViewBuilder = ViewBuilder() | |
} | |
return Static.instance | |
} | |
// Takes array of views that conform to Movable Protocol and places in view with padding. | |
func arrangeObjectsInView(arrayOfMovables: [Movable], view: UIView, paddingY: CGFloat) -> Void { | |
var count : CGFloat = 0.0 | |
for lbl in arrayOfMovables { | |
lbl.moveDownBy(count) | |
lbl.addToView(view) | |
count += paddingY | |
} | |
} | |
} | |
// Example code for use | |
let factory = UIFactory.sharedInstance | |
let container = factory.ccView(CGRectMake(0,0,200,200)) | |
let scrollView = UIScrollView(frame: container.bounds) | |
let builder = ViewBuilder.sharedInstance | |
scrollView.scrollEnabled = true | |
scrollView.contentSize = CGSize(width: 200,height: 900) | |
container.addSubview(scrollView) | |
let arr = ["Title Header", "Logan", "Berries for Hire", "Losses are mounting"] | |
var labels: [Movable] = [] | |
var count = 0 | |
for l in arr{ | |
if (count == 0) { | |
var column = CCColumnView(frame: scrollView.frame) | |
var lab = factory.titleLabel(l, parentView: scrollView) | |
let pic = CCImage(path: "/Volumes/MacBook HD/Users/pocketkk/Downloads/png/phone16.png", view: scrollView) | |
column.addViewsSidebySide(pic, view2: lab) | |
labels.append(column) | |
} else { | |
var column = CCColumnView(frame: scrollView.frame) | |
var lab = factory.bodyLabel(l, parentView: scrollView) | |
let pic = CCImage(path: "/Volumes/MacBook HD/Users/pocketkk/Downloads/png/gear26.png", view: scrollView) | |
column.addViewsSidebySide(pic, view2: lab) | |
column.moveRightBy(5.0) | |
column.moveDownBy(2.0) | |
labels.append(column) | |
} | |
count = 1 | |
} | |
let button = factory.ccButton("Done", parentView: scrollView) | |
labels.append(button) | |
builder.arrangeObjectsInView(labels, view: scrollView, paddingY: 25) | |
container |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment