Skip to content

Instantly share code, notes, and snippets.

@SlaunchaMan
Created June 16, 2020 14:03
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save SlaunchaMan/4ff30d3f908abf3a9f8fbcfabbd30dd1 to your computer and use it in GitHub Desktop.
Save SlaunchaMan/4ff30d3f908abf3a9f8fbcfabbd30dd1 to your computer and use it in GitHub Desktop.
A SwiftUI-like function builder approach for UIStackView.
//: A UIKit based Playground for presenting user interface
import UIKit
import PlaygroundSupport
@_functionBuilder
struct UIViewBuilder {
static func buildBlock(_ views: UIView...) -> [UIView] {
return views
}
}
extension UIStackView {
convenience init(alignment: UIStackView.Alignment = .fill,
axis: NSLayoutConstraint.Axis = .horizontal,
isBaselineRelativeArrangement: Bool = false,
distribution: UIStackView.Distribution = .fill,
isLayoutMarginsRelativeArrangement: Bool = false,
spacing: CGFloat = 0,
@UIViewBuilder arrangedSubviewsBuilder: () -> [UIView]) {
self.init(arrangedSubviews: arrangedSubviewsBuilder())
self.alignment = alignment
self.axis = axis
self.isBaselineRelativeArrangement = isBaselineRelativeArrangement
self.distribution = distribution
self.isLayoutMarginsRelativeArrangement = isLayoutMarginsRelativeArrangement
self.spacing = spacing
}
}
extension UILabel {
convenience init(_ text: String) {
self.init()
self.text = text
}
func font(_ font: UIFont) -> UILabel {
self.font = font
return self
}
func font(_ fontStyle: UIFont.TextStyle) -> UILabel {
return font(.preferredFont(forTextStyle: fontStyle))
}
}
class MyViewController : UIViewController {
var stackView: UIStackView!
override func loadView() {
let view = UIView()
view.backgroundColor = .white
stackView = UIStackView(axis: .vertical) {
UILabel("Hello")
.font(.title1)
UILabel("World")
.font(.title2)
}
stackView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(stackView)
self.view = view
}
override func viewDidLayoutSubviews() {
stackView.frame = view.bounds.inset(
by: UIEdgeInsets(top: 8, left: 8, bottom: 8, right: 8)
)
}
}
PlaygroundPage.current.liveView = MyViewController()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment