Created
June 16, 2020 14:03
-
-
Save SlaunchaMan/4ff30d3f908abf3a9f8fbcfabbd30dd1 to your computer and use it in GitHub Desktop.
A SwiftUI-like function builder approach for UIStackView.
This file contains hidden or 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
//: 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