Skip to content

Instantly share code, notes, and snippets.

@stzn
Last active October 28, 2018 07:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save stzn/855c9ff964a7df67bd76136dd8ffd438 to your computer and use it in GitHub Desktop.
Save stzn/855c9ff964a7df67bd76136dd8ffd438 to your computer and use it in GitHub Desktop.
Sample for view decoration
import UIKit
import PlaygroundSupport
precedencegroup ForwarderApplication {
associativity: left
}
infix operator |> : ForwarderApplication
func |> <A, B>(x: A, f: (A) -> B) -> B {
return f(x)
}
precedencegroup ForwarderComposition {
associativity: left
higherThan: SingleTypeComposition
}
infix operator >>>: ForwarderComposition
func >>> <A, B, C>(f: @escaping (A) -> B, g: @escaping (B) -> C) -> (A) -> C {
return { g(f($0)) }
}
precedencegroup SingleTypeComposition {
associativity: right
higherThan: ForwarderApplication
}
infix operator <>: SingleTypeComposition
func <> <A>(f: @escaping (A) -> A, g: @escaping (A) -> A) -> (A) -> A {
return f >>> g
}
func <> <A>(f: @escaping (inout A) -> Void, g: @escaping (inout A) -> Void) -> (inout A) -> Void {
return { a in
f(&a)
g(&a)
}
}
func <> <A: AnyObject>(f: @escaping (A) -> Void, g: @escaping (A) -> Void) -> (A) -> Void {
return { a in
f(a)
g(a)
}
}
let cornerRadious: (CGFloat) -> (UIView) -> Void = { radius in
return { $0.layer.cornerRadius = radius }
}
let shadowRadius: (CGFloat) -> (UIView) -> Void = { radius in
return {
$0.layer.shadowRadius = radius
$0.layer.shadowOpacity = 0.3
$0.layer.shadowColor = UIColor.black.cgColor
$0.layer.shadowOffset = CGSize(width: 0, height: radius / 2)
$0.layer.masksToBounds = false
}
}
let backgroundColor: (UIColor) -> (UIView) -> Void = { color in
return { $0.backgroundColor = color }
}
let buttonTitle: (String) -> (UIButton) -> Void = { title in
return { $0.setTitle(title, for: .normal) }
}
let buttonTitleColor: (UIColor) -> (UIButton) -> Void = { color in
return { $0.setTitleColor(color, for: .normal) }
}
func borderStyle(color: UIColor, width: CGFloat) -> (UIView) -> Void {
return {
$0.layer.borderColor = color.cgColor
$0.layer.borderWidth = width
}
}
let baseButtonStyle: (UIButton) -> Void = {
$0.contentEdgeInsets = UIEdgeInsets(
top: 12, left: 16, bottom: 12, right: 16)
$0.titleLabel?.font = .systemFont(ofSize: 16, weight: .medium)
} <> backgroundColor(.blue)
let baseViewStyle: (UIView) -> Void = {
$0.backgroundColor = .white
}
let baseTextFieldStyle: (UITextField) -> Void =
cornerRadious(10)
<> borderStyle(color: .yellow, width: 3)
<> { (textField: UITextField) in
textField.borderStyle = .roundedRect
textField.heightAnchor.constraint(equalToConstant: 60).isActive = true
}
let textButtonStyle =
baseButtonStyle
<> buttonTitleColor(.white)
let okButtonStyle =
textButtonStyle
<> cornerRadious(6)
<> buttonTitle("OK")
let redCardViewStyle =
baseViewStyle
<> backgroundColor(.red)
<> cornerRadious(2)
<> shadowRadius(4)
let phoneNumberTextFieldStyle =
baseTextFieldStyle
<> {
$0.keyboardType = .numberPad
$0.placeholder = "電話番号を入力してください"
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.view.frame = CGRect(x: 0, y: 0, width: 320, height: 480)
self.view.backgroundColor = .white
let card = UIView(frame: CGRect(x: 100, y: 100, width: 200, height: 80))
redCardViewStyle(card)
self.view.addSubview(card)
let ok = UIButton(frame: CGRect(x: 100, y: 200, width: 100, height: 50))
okButtonStyle(ok)
self.view.addSubview(ok)
let input = UITextField(frame: CGRect(x: 50, y: 300, width: 300, height: 50))
phoneNumberTextFieldStyle(input)
self.view.addSubview(input)
}
}
let viewController = ViewController()
PlaygroundPage.current.liveView = viewController
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment