Skip to content

Instantly share code, notes, and snippets.

@pocketkk
Last active August 29, 2015 14:04
Show Gist options
  • Save pocketkk/b27f7b704567859af2f5 to your computer and use it in GitHub Desktop.
Save pocketkk/b27f7b704567859af2f5 to your computer and use it in GitHub Desktop.
Swift - UIFactory
// 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