From b5fef0e338579ae59739192a5a0a2db780463fc0 Mon Sep 17 00:00:00 2001 From: caiyuanpeng <28578093@qq.com> Date: Fri, 23 Jun 2017 21:16:17 +0800 Subject: [PATCH] Update to 1.0.0 --- .../UserInterfaceState.xcuserstate | Bin 11794 -> 44203 bytes Cupcake.podspec | 2 +- Cupcake/AttStr.swift | 32 ++++------- Cupcake/CPKStackView.swift | 15 ++++- Cupcake/Color.swift | 2 +- Cupcake/StaticTable.swift | 54 +++++++++--------- Cupcake/TextField.swift | 8 +-- Cupcake/TextView.swift | 6 +- Cupcake/View.swift | 11 ++-- Cupcake/__Private__Implementations__.swift | 12 ++-- 10 files changed, 72 insertions(+), 70 deletions(-) diff --git a/Cupcake-Demo/Cupcake-Demo.xcodeproj/project.xcworkspace/xcuserdata/admin.xcuserdatad/UserInterfaceState.xcuserstate b/Cupcake-Demo/Cupcake-Demo.xcodeproj/project.xcworkspace/xcuserdata/admin.xcuserdatad/UserInterfaceState.xcuserstate index 4e68187d0a25d3be5c0704e1927267ff042521f0..7827c64a321719e5e165d2a0540ae552c299d532 100644 GIT binary patch literal 44203 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 B5(xkR diff --git a/Cupcake.podspec b/Cupcake.podspec index 406f70b..cbad37a 100644 --- a/Cupcake.podspec +++ b/Cupcake.podspec @@ -1,7 +1,7 @@ Pod::Spec.new do |s| s.name = "Cupcake" - s.version = "0.1.2" + s.version = "1.0.0" s.summary = "An easy way to create and layout UI components for iOS." s.description = <<-DESC diff --git a/Cupcake/AttStr.swift b/Cupcake/AttStr.swift index 3503003..35d4198 100644 --- a/Cupcake/AttStr.swift +++ b/Cupcake/AttStr.swift @@ -42,7 +42,7 @@ public func AttStr(_ objects: Any?...) -> NSMutableAttributedString { } -extension NSMutableAttributedString { +public extension NSMutableAttributedString { /** * NSFontAttributeName @@ -145,8 +145,7 @@ extension NSMutableAttributedString { return self } - @discardableResult - public func strikethrough(_ color: Any) -> Self { + @discardableResult public func strikethrough(_ color: Any) -> Self { return strikethrough(.styleSingle, color) } @@ -158,8 +157,7 @@ extension NSMutableAttributedString { .stroke(1) .stroke(-4, "red") */ - @discardableResult - public func stroke(_ width: CGFloat, _ color: Any? = nil) -> Self { + @discardableResult public func stroke(_ width: CGFloat, _ color: Any? = nil) -> Self { cpk_addAttribute(name: NSStrokeWidthAttributeName, value: width) if let strokeColor = Color(color) { cpk_addAttribute(name: NSStrokeColorAttributeName, value: strokeColor) @@ -173,8 +171,7 @@ extension NSMutableAttributedString { .oblique(0.3) .oblique(-0.3) */ - @discardableResult - public func oblique(_ value: CGFloat) -> Self { + @discardableResult public func oblique(_ value: CGFloat) -> Self { cpk_addAttribute(name: NSObliquenessAttributeName, value: value) return self } @@ -185,8 +182,7 @@ extension NSMutableAttributedString { .offset(20) .offset(-20) */ - @discardableResult - public func offset(_ offset: CGFloat) -> Self { + @discardableResult public func offset(_ offset: CGFloat) -> Self { cpk_addAttribute(name: NSBaselineOffsetAttributeName, value: offset) return self } @@ -198,8 +194,7 @@ extension NSMutableAttributedString { .link("http://www.google.com") .link() //mark as link for UILabel */ - @discardableResult - public func link(_ url: String? = nil) -> Self { + @discardableResult public func link(_ url: String? = nil) -> Self { if let urlString = url { cpk_addAttribute(name: NSLinkAttributeName, value: urlString) } else { @@ -213,8 +208,7 @@ extension NSMutableAttributedString { * Usages: .lineGap(10) */ - @discardableResult - public func lineGap(_ spacing: CGFloat) -> Self { + @discardableResult public func lineGap(_ spacing: CGFloat) -> Self { cpk_addParagraphAttribute(key: "lineSpacing", value: spacing) return self } @@ -224,8 +218,7 @@ extension NSMutableAttributedString { * Usages: .indent(20) */ - @discardableResult - public func indent(_ headIntent: CGFloat) -> Self { + @discardableResult public func indent(_ headIntent: CGFloat) -> Self { cpk_addParagraphAttribute(key: "firstLineHeadIndent", value: headIntent) return self } @@ -237,8 +230,7 @@ extension NSMutableAttributedString { .align(.justified) ... */ - @discardableResult - public func align(_ alignment: NSTextAlignment) -> Self { + @discardableResult public func align(_ alignment: NSTextAlignment) -> Self { cpk_addParagraphAttribute(key: "alignment", value: NSNumber(value: alignment.rawValue)) return self } @@ -261,8 +253,7 @@ extension NSMutableAttributedString { * .select("pattern") is just the shorthand of .select(.match("pattern")) */ - @discardableResult - public func select(_ optionOrStringLiterals: AttStrSelectionOptions...) -> Self { + @discardableResult public func select(_ optionOrStringLiterals: AttStrSelectionOptions...) -> Self { for option in optionOrStringLiterals { var regExp: NSRegularExpression? @@ -334,8 +325,7 @@ extension NSMutableAttributedString { AttStr(@"hello").color(@"red").color(@"green") //green color AttStr(@"hello").color(@"red").preventOverride.color(@"green") //red color */ - @discardableResult - public func preventOverride(_ flag: Bool = true) -> Self { + @discardableResult public func preventOverride(_ flag: Bool = true) -> Self { self.cpkPreventOverrideAttribute = flag return self } diff --git a/Cupcake/CPKStackView.swift b/Cupcake/CPKStackView.swift index 4818859..5ed776d 100644 --- a/Cupcake/CPKStackView.swift +++ b/Cupcake/CPKStackView.swift @@ -34,6 +34,7 @@ public class CPKStackView: UIView { private var _alignment: CPKStackAlignment = .left private var _spacing: CGFloat = 0 private var _axis: UILayoutConstraintAxis = .horizontal + private var _headAttachSpace: CGFloat? public private(set) var arrangedSubviews = [UIView]() @@ -98,7 +99,7 @@ public class CPKStackView: UIView { let spacing = CPKFloat(sub) if index == 0 { - self.cpkAttachSpacing = spacing + _headAttachSpace = spacing attachSpaceDidChangeForView(at: -1) } else { let previousView = self.arrangedSubviews[index - 1] @@ -400,6 +401,9 @@ public class CPKStackView: UIView { var spacing: CGFloat = 0 + if item1 == self && _headAttachSpace != nil { + spacing = -_headAttachSpace! + } if let attachSpacing = item1.cpkAttachSpacing { spacing = -attachSpacing } else if item1 != self && item2 != self { @@ -474,6 +478,15 @@ public class CPKStackView: UIView { let item1 = itemAt(index: index) let item2 = itemAt(index: index + 1) + if item1 == self && _headAttachSpace != nil { + for c in self.spacingConstraints { + if c.firstItem === item1 && c.secondItem === item2 { + c.constant = -_headAttachSpace! + break + } + } + } + if let spacing = item1.cpkAttachSpacing { for c in self.spacingConstraints { if c.firstItem === item1 && c.secondItem === item2 { diff --git a/Cupcake/Color.swift b/Cupcake/Color.swift index 3f27bd7..7721812 100644 --- a/Cupcake/Color.swift +++ b/Cupcake/Color.swift @@ -32,7 +32,7 @@ import UIKit Color(Img("image")) //using image ... */ -func Color(_ any: Any?) -> UIColor? { +public func Color(_ any: Any?) -> UIColor? { if any == nil { return nil } diff --git a/Cupcake/StaticTable.swift b/Cupcake/StaticTable.swift index 069bac3..4be0861 100644 --- a/Cupcake/StaticTable.swift +++ b/Cupcake/StaticTable.swift @@ -68,7 +68,7 @@ public extension StaticTableView { .font(someLabel.font) ... */ - @discardableResult func font(_ any: Any) -> Self { + @discardableResult public func font(_ any: Any) -> Self { self.textFont = any return self } @@ -85,7 +85,7 @@ public extension StaticTableView { .color(someLabel.textColor) ... */ - @discardableResult func color(_ any: Any) -> Self { + @discardableResult public func color(_ any: Any) -> Self { self.textColor = any return self } @@ -102,7 +102,7 @@ public extension StaticTableView { .font(someLabel.font) ... */ - @discardableResult func detailFont(_ any: Any) -> Self { + @discardableResult public func detailFont(_ any: Any) -> Self { self.detailFont = any return self } @@ -119,7 +119,7 @@ public extension StaticTableView { .color(someLabel.textColor) ... */ - @discardableResult func detailColor(_ any: Any) -> Self { + @discardableResult public func detailColor(_ any: Any) -> Self { self.detailColor = any return self } @@ -130,7 +130,7 @@ public extension StaticTableView { .rowHeight(50) .rowHeight(-1) //negative value means use UITableViewAutomaticDimension */ - @discardableResult func rowHeight(_ height: CGFloat) -> Self { + @discardableResult public func rowHeight(_ height: CGFloat) -> Self { self.cellHeight = height return self } @@ -141,7 +141,7 @@ public extension StaticTableView { .lineIndent(0) .lineIndent(10) */ - @discardableResult func lineIndent(_ indent: CGFloat) -> Self { + @discardableResult public func lineIndent(_ indent: CGFloat) -> Self { self.separatorIndent = indent return self } @@ -152,7 +152,7 @@ public extension StaticTableView { .arrow() .arrow(false) */ - @discardableResult func arrow(_ showArrow: Bool = true) -> Self { + @discardableResult public func arrow(_ showArrow: Bool = true) -> Self { self.accessoryType = (showArrow ? .disclosureIndicator : nil) return self } @@ -168,7 +168,7 @@ public extension StaticTableView { ... }) */ - @discardableResult func custom(_ handler: @escaping (StaticRow)->()) -> Self { + @discardableResult public func custom(_ handler: @escaping (StaticRow)->()) -> Self { self.customHandler = handler return self } @@ -184,7 +184,7 @@ public extension StaticTableView { ... }) */ - @discardableResult override func onClick(_ callback: @escaping (StaticRow)->()) -> Self { + @discardableResult override public func onClick(_ callback: @escaping (StaticRow)->()) -> Self { self.onClickHandler = callback return self } @@ -202,7 +202,7 @@ public extension StaticSection { .header("Header1") //header with string .header(headerView) //header with view */ - @discardableResult func header(_ any: Any) -> Self { + @discardableResult public func header(_ any: Any) -> Self { self.headerValue = any return self } @@ -216,7 +216,7 @@ public extension StaticSection { .footer("Footer1") //footer with string .footer(footerView) //footer with view */ - @discardableResult func footer(_ any: Any) -> Self { + @discardableResult public func footer(_ any: Any) -> Self { self.footerValue = any return self } @@ -229,7 +229,7 @@ public extension StaticSection { .singleCheck("checked") //use custom image .singleCheck("checked", "unchecked") //use custom images */ - @discardableResult func singleCheck(_ checkedImage: Any? = nil, _ uncheckedImage: Any? = nil) -> Self { + @discardableResult public func singleCheck(_ checkedImage: Any? = nil, _ uncheckedImage: Any? = nil) -> Self { self.enableSingleCheck = true self.checkedImage = checkedImage != nil ? Img(checkedImage!) : nil self.uncheckedImage = uncheckedImage != nil ? Img(uncheckedImage!) : nil @@ -244,7 +244,7 @@ public extension StaticSection { .multiCheck("checked") //use custom image .multiCheck("checked", "unchecked") //use custom images */ - @discardableResult func multiCheck(_ checkedImage: Any? = nil, _ uncheckedImage: Any? = nil) -> Self { + @discardableResult public func multiCheck(_ checkedImage: Any? = nil, _ uncheckedImage: Any? = nil) -> Self { self.enableMultiCheck = true self.checkedImage = checkedImage != nil ? Img(checkedImage!) : nil self.uncheckedImage = uncheckedImage != nil ? Img(uncheckedImage!) : nil @@ -267,7 +267,7 @@ public extension StaticRow { .img(someImage) ... */ - @discardableResult func img(_ any: Any) -> Self { + @discardableResult public func img(_ any: Any) -> Self { self.image = Img(any) return self } @@ -281,7 +281,7 @@ public extension StaticRow { .str( AttStr("hello world").strikethrough() ) ... */ - @discardableResult func str(_ any: Any) -> Self { + @discardableResult public func str(_ any: Any) -> Self { self.text = any return self } @@ -295,7 +295,7 @@ public extension StaticRow { .detail( AttStr("hello world").strikethrough() ) ... */ - @discardableResult func detail(_ any: Any) -> Self { + @discardableResult public func detail(_ any: Any) -> Self { self.detailText = any return self } @@ -307,7 +307,7 @@ public extension StaticRow { .style(.value2) ... */ - @discardableResult func style(_ style: UITableViewCellStyle) -> Self { + @discardableResult public func style(_ style: UITableViewCellStyle) -> Self { self.cellStyle = style return self } @@ -320,7 +320,7 @@ public extension StaticRow { .accessory(.view(someView)) //setting accessoryView ... */ - @discardableResult func accessory(_ type: CPKTableViewCellAccessoryType) -> Self { + @discardableResult public func accessory(_ type: CPKTableViewCellAccessoryType) -> Self { self.accessoryType = type return self } @@ -331,7 +331,7 @@ public extension StaticRow { .arrow() .arrow(false) */ - @discardableResult func arrow(_ showArrow: Bool = true) -> Self { + @discardableResult public func arrow(_ showArrow: Bool = true) -> Self { self.accessoryType = showArrow ? .disclosureIndicator : CPKTableViewCellAccessoryType.none return self } @@ -342,7 +342,7 @@ public extension StaticRow { .check() .check(false) */ - @discardableResult func check(_ checked: Bool = true) -> Self { + @discardableResult public func check(_ checked: Bool = true) -> Self { self.accessoryType = checked ? .checkmark : CPKTableViewCellAccessoryType.none return self } @@ -353,7 +353,7 @@ public extension StaticRow { .switchOn() .switchOn(false) */ - @discardableResult func switchOn(_ isOn: Bool = true) -> Self { + @discardableResult public func switchOn(_ isOn: Bool = true) -> Self { let sw: UISwitch! = self.switchView ?? {self.switchView = UISwitch(); return self.switchView}() sw.isOn = isOn self.accessory(.view(sw)) @@ -366,7 +366,7 @@ public extension StaticRow { .height(50) .height(-1) //negative value means use UITableViewAutomaticDimension */ - @discardableResult func height(_ height: CGFloat) -> Self { + @discardableResult public func height(_ height: CGFloat) -> Self { self.cellHeight = height return self } @@ -376,7 +376,7 @@ public extension StaticRow { * Usages: .lineIndent(10) */ - @discardableResult func lineIndent(_ indent: CGFloat) -> Self { + @discardableResult public func lineIndent(_ indent: CGFloat) -> Self { self.separatorIndent = indent return self } @@ -392,7 +392,7 @@ public extension StaticRow { ... }) */ - @discardableResult override func onClick(_ callback: @escaping (StaticRow)->()) -> Self { + @discardableResult override public func onClick(_ callback: @escaping (StaticRow)->()) -> Self { self.onClickHandler = callback return self } @@ -407,7 +407,7 @@ public extension StaticRow { ... }) */ - @discardableResult func onButton(_ callback: @escaping (StaticRow)->()) -> Self { + @discardableResult public func onButton(_ callback: @escaping (StaticRow)->()) -> Self { self.onButtonHandler = callback return self } @@ -422,7 +422,7 @@ public extension StaticRow { ... }) */ - @discardableResult func onChange(_ callback: @escaping (StaticRow)->()) -> Self { + @discardableResult public func onChange(_ callback: @escaping (StaticRow)->()) -> Self { self.onChangeHandler = callback return self } @@ -437,7 +437,7 @@ public extension StaticRow { ... }) */ - @discardableResult func custom(_ handler: @escaping (StaticRow)->()) -> Self { + @discardableResult public func custom(_ handler: @escaping (StaticRow)->()) -> Self { self.customHandler = handler return self } diff --git a/Cupcake/TextField.swift b/Cupcake/TextField.swift index a73e85d..85b026c 100644 --- a/Cupcake/TextField.swift +++ b/Cupcake/TextField.swift @@ -8,14 +8,14 @@ import UIKit -var TextField: UITextField { +public var TextField: UITextField { let textField = UITextField() textField.enablesReturnKeyAutomatically = true textField.returnKeyType = .done return textField } -extension UITextField { +public extension UITextField { /** * Setting text or attributedText @@ -174,7 +174,7 @@ extension UITextField { .onChange({ _ in /* ... */ }) .onChange({ [weak self] textField in /* ... */ }) //capture self as weak reference when needed */ - @discardableResult func onChange(_ closure: @escaping (UITextField)->()) -> Self { + @discardableResult public func onChange(_ closure: @escaping (UITextField)->()) -> Self { self.cpkTextChangedClosure = cpk_generateCallbackClosure(closure, nil) return self } @@ -188,7 +188,7 @@ extension UITextField { .onFinish({ _ in /* ... */ }) .onFinish({ [weak self] textField in /* ... */ }) //capture self as weak reference when needed */ - @discardableResult func onFinish(_ closure: @escaping (UITextField)->()) -> Self { + @discardableResult public func onFinish(_ closure: @escaping (UITextField)->()) -> Self { self.cpkDidEndOnExistClosure = cpk_generateCallbackClosure(closure, nil) return self } diff --git a/Cupcake/TextView.swift b/Cupcake/TextView.swift index a9075ae..80e93f2 100644 --- a/Cupcake/TextView.swift +++ b/Cupcake/TextView.swift @@ -8,11 +8,11 @@ import UIKit -var TextView: UITextView { +public var TextView: UITextView { return UITextView().font(17) } -extension UITextView { +public extension UITextView { /** * Setting text or attributedText @@ -120,7 +120,7 @@ extension UITextView { .onChange({ _ in /* ... */ }) .onChange({ [weak self] textView in /* ... */ }) //capture self as weak reference when needed */ - @discardableResult func onChange(_ closure: @escaping (UITextView)->()) -> Self { + @discardableResult public func onChange(_ closure: @escaping (UITextView)->()) -> Self { self.cpkTextChangedClosure = cpk_generateCallbackClosure(closure, nil) return self } diff --git a/Cupcake/View.swift b/Cupcake/View.swift index f3260f0..112fcb9 100644 --- a/Cupcake/View.swift +++ b/Cupcake/View.swift @@ -13,7 +13,7 @@ public var View: UIView { return view } -extension UIView { +public extension UIView { /** * Setting background with Color or Image. @@ -151,7 +151,7 @@ extension UIView { .onClick({ _ in /* ... */ }) //if you don't care at all .onClick({ [weak self] _ in /* ... */ }) //capture self as weak reference when needed */ - @discardableResult func onClick(_ closure: @escaping (UIView)->()) -> Self { + @discardableResult public func onClick(_ closure: @escaping (UIView)->()) -> Self { cpk_onClick(closure, nil) return self } @@ -296,10 +296,9 @@ public extension UIView { .embedIn(superview, 10, 20, 30, 40) //top: 10, left: 20, bottom: 30, right: 40 .embedIn(superview, 10, 20, nil) //top: 10, left: 20 */ - @discardableResult - public func embedIn(_ superview: UIView, - _ p1: Any? = "", _ p2: Any? = "", - _ p3: Any? = "", _ p4: Any? = "") -> Self { + @discardableResult public func embedIn(_ superview: UIView, + _ p1: Any? = "", _ p2: Any? = "", + _ p3: Any? = "", _ p4: Any? = "") -> Self { superview.addSubview(self) let edge = cpk_edgeInsetsTupleFromParameters(p1, p2, p3, p4) diff --git a/Cupcake/__Private__Implementations__.swift b/Cupcake/__Private__Implementations__.swift index e32bcbb..598caa7 100644 --- a/Cupcake/__Private__Implementations__.swift +++ b/Cupcake/__Private__Implementations__.swift @@ -2741,7 +2741,7 @@ extension UILabel { } @discardableResult - override func onClick(_ closure: @escaping (UILabel)->()) -> Self { + override public func onClick(_ closure: @escaping (UILabel)->()) -> Self { cpk_onClick(closure, nil) return self } @@ -2830,7 +2830,7 @@ extension UIImageView { } @discardableResult - override func onClick(_ closure: @escaping (UIImageView)->()) -> Self { + override public func onClick(_ closure: @escaping (UIImageView)->()) -> Self { cpk_onClick(closure, nil) return self } @@ -2913,7 +2913,7 @@ extension UIButton { } @discardableResult - override func onClick(_ closure: @escaping (UIButton)->()) -> Self { + override public func onClick(_ closure: @escaping (UIButton)->()) -> Self { cpk_onClick(closure, nil) return self } @@ -3002,7 +3002,7 @@ extension UITextField { } @discardableResult - override func onClick(_ closure: @escaping (UITextField)->()) -> Self { + override public func onClick(_ closure: @escaping (UITextField)->()) -> Self { cpk_onClick(closure, nil) return self } @@ -3091,7 +3091,7 @@ extension UITextView { } @discardableResult - override func onClick(_ closure: @escaping (UITextView)->()) -> Self { + override public func onClick(_ closure: @escaping (UITextView)->()) -> Self { cpk_onClick(closure, nil) return self } @@ -3180,7 +3180,7 @@ extension CPKStackView { } @discardableResult - override func onClick(_ closure: @escaping (CPKStackView)->()) -> Self { + override public func onClick(_ closure: @escaping (CPKStackView)->()) -> Self { cpk_onClick(closure, nil) return self }