diff --git a/Cupcake.podspec b/Cupcake.podspec index 6cf5467..38cea5b 100644 --- a/Cupcake.podspec +++ b/Cupcake.podspec @@ -1,7 +1,7 @@ Pod::Spec.new do |s| s.name = "Cupcake" - s.version = "1.1.1" + s.version = "1.2.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 35d4198..43192dd 100644 --- a/Cupcake/AttStr.swift +++ b/Cupcake/AttStr.swift @@ -56,7 +56,7 @@ public extension NSMutableAttributedString { ... */ @discardableResult public func font(_ style: Any) -> Self { - cpk_addAttribute(name: NSFontAttributeName, value: Font(style)) + cpk_addAttribute(name: "NSFont", value: Font(style)) return self } @@ -72,7 +72,7 @@ public extension NSMutableAttributedString { ... */ @discardableResult public func color(_ any: Any) -> Self { - cpk_addAttribute(name: NSForegroundColorAttributeName, value: Color(any)!) + cpk_addAttribute(name: "NSColor", value: Color(any)!) return self } @@ -89,7 +89,7 @@ public extension NSMutableAttributedString { ... */ @discardableResult public func bg(_ any: Any) -> Self { - cpk_addAttribute(name: NSBackgroundColorAttributeName, value: Color(any) ?? Color(Img(any))!) + cpk_addAttribute(name: "NSBackgroundColor", value: Color(any) ?? Color(Img(any))!) return self } @@ -110,9 +110,9 @@ public extension NSMutableAttributedString { styles = NSNumber(value: style.rawValue | NSUnderlineStyle.styleSingle.rawValue) } - cpk_addAttribute(name: NSUnderlineStyleAttributeName, value: styles) + cpk_addAttribute(name: "NSUnderline", value: styles) if let underlineColor = Color(color) { - cpk_addAttribute(name: NSUnderlineColorAttributeName, value: underlineColor) + cpk_addAttribute(name: "NSUnderlineColor", value: underlineColor) } return self } @@ -138,9 +138,9 @@ public extension NSMutableAttributedString { styles = NSNumber(value: style.rawValue | NSUnderlineStyle.styleSingle.rawValue) } - cpk_addAttribute(name: NSStrikethroughStyleAttributeName, value: styles) + cpk_addAttribute(name: "NSStrikethrough", value: styles) if let strikethroughColor = Color(color) { - cpk_addAttribute(name: NSStrikethroughColorAttributeName, value: strikethroughColor) + cpk_addAttribute(name: "NSStrikethroughColor", value: strikethroughColor) } return self } @@ -158,9 +158,9 @@ public extension NSMutableAttributedString { .stroke(-4, "red") */ @discardableResult public func stroke(_ width: CGFloat, _ color: Any? = nil) -> Self { - cpk_addAttribute(name: NSStrokeWidthAttributeName, value: width) + cpk_addAttribute(name: "NSStrokeWidth", value: width) if let strokeColor = Color(color) { - cpk_addAttribute(name: NSStrokeColorAttributeName, value: strokeColor) + cpk_addAttribute(name: "NSStrokeColor", value: strokeColor) } return self } @@ -172,7 +172,7 @@ public extension NSMutableAttributedString { .oblique(-0.3) */ @discardableResult public func oblique(_ value: CGFloat) -> Self { - cpk_addAttribute(name: NSObliquenessAttributeName, value: value) + cpk_addAttribute(name: "NSObliqueness", value: value) return self } @@ -183,7 +183,7 @@ public extension NSMutableAttributedString { .offset(-20) */ @discardableResult public func offset(_ offset: CGFloat) -> Self { - cpk_addAttribute(name: NSBaselineOffsetAttributeName, value: offset) + cpk_addAttribute(name: "NSBaselineOffset", value: offset) return self } @@ -196,7 +196,7 @@ public extension NSMutableAttributedString { */ @discardableResult public func link(_ url: String? = nil) -> Self { if let urlString = url { - cpk_addAttribute(name: NSLinkAttributeName, value: urlString) + cpk_addAttribute(name: "NSLink", value: urlString) } else { cpk_addAttribute(name: CPKLabelLinkAttributeName, value: CPKLabelLinkAttributeValue) } diff --git a/Cupcake/Button.swift b/Cupcake/Button.swift index 2fe5ed3..d24faad 100644 --- a/Cupcake/Button.swift +++ b/Cupcake/Button.swift @@ -26,7 +26,7 @@ public extension UIButton { .str( AttStr("hello world").strikethrough() ) ... */ - @discardableResult public func str(_ any: Any) -> Self { + @objc @discardableResult public func str(_ any: Any) -> Self { if let attStr = any as? NSAttributedString { setAttributedTitle(attStr, for: .normal) } else { @@ -47,7 +47,7 @@ public extension UIButton { .font(someLabel.font) ... **/ - @discardableResult public func font(_ any: Any) -> Self { + @objc @discardableResult public func font(_ any: Any) -> Self { self.titleLabel?.font = Font(any) return self } @@ -63,7 +63,7 @@ public extension UIButton { .color(someLabel.textColor) ... */ - @discardableResult public func color(_ any: Any) -> Self { + @objc @discardableResult public func color(_ any: Any) -> Self { setTitleColor(Color(any), for: .normal) return self } @@ -79,7 +79,7 @@ public extension UIButton { .highColor(someLabel.textColor) ... */ - @discardableResult public func highColor(_ any: Any) -> Self { + @objc @discardableResult public func highColor(_ any: Any) -> Self { setTitleColor(Color(any), for: .highlighted) return self } @@ -95,7 +95,7 @@ public extension UIButton { .img(someImage) ... */ - @discardableResult public func img(_ any: Any) -> Self { + @objc @discardableResult public func img(_ any: Any) -> Self { let image = Img(any) setImage(image, for: .normal) if self.frame.isEmpty { @@ -115,7 +115,7 @@ public extension UIButton { .highImg(someImage) ... */ - @discardableResult public func highImg(_ any: Any) -> Self { + @objc @discardableResult public func highImg(_ any: Any) -> Self { setImage(Img(any), for: .highlighted) return self } @@ -133,7 +133,7 @@ public extension UIButton { .bg(someImage) //using image ... */ - @discardableResult override public func bg(_ any: Any) -> Self { + @objc @discardableResult override public func bg(_ any: Any) -> Self { let image = Img(any) setBackgroundImage(image, for: .normal) cpk_masksToBoundsIfNeed() @@ -157,7 +157,7 @@ public extension UIButton { .highBg(someImage) //using image ... */ - @discardableResult public func highBg(_ any: Any) -> Self { + @objc @discardableResult public func highBg(_ any: Any) -> Self { setBackgroundImage(Img(any), for: .highlighted) cpk_masksToBoundsIfNeed() return self @@ -181,7 +181,7 @@ public extension UIButton { * Usages: .gap(10) */ - @discardableResult public func gap(_ spacing: CGFloat) -> Self { + @objc @discardableResult public func gap(_ spacing: CGFloat) -> Self { self.cpkGap = spacing let halfGap = spacing / 2 @@ -202,7 +202,7 @@ public extension UIButton { .reversed() .reversed(false) */ - @discardableResult public func reversed(_ reversed: Bool = true) -> Self { + @objc @discardableResult public func reversed(_ reversed: Bool = true) -> Self { let t = reversed ? CATransform3DMakeScale(-1, 1, 1) : CATransform3DIdentity self.layer.sublayerTransform = t self.imageView?.layer.transform = t @@ -217,7 +217,7 @@ public extension UIButton { .lines(0) //multilines .lines() //same as .lines(0) */ - @discardableResult public func lines(_ numberOfLines: CGFloat = 0) -> Self { + @objc @discardableResult public func lines(_ numberOfLines: CGFloat = 0) -> Self { self.titleLabel?.numberOfLines = Int(numberOfLines) self.titleLabel?.lineBreakMode = .byWordWrapping self.titleLabel?.textAlignment = .center diff --git a/Cupcake/ImageView.swift b/Cupcake/ImageView.swift index 0e17ea4..d614262 100644 --- a/Cupcake/ImageView.swift +++ b/Cupcake/ImageView.swift @@ -28,7 +28,7 @@ public extension UIImageView { .img(someImage) ... */ - @discardableResult public func img(_ any: Any) -> Self { + @objc @discardableResult public func img(_ any: Any) -> Self { self.image = Img(any) if self.image != nil { @@ -48,7 +48,7 @@ public extension UIImageView { .mode(.center) ... */ - @discardableResult public func mode(_ contentMode: UIViewContentMode) -> Self { + @objc @discardableResult public func mode(_ contentMode: UIViewContentMode) -> Self { self.contentMode = contentMode return self } diff --git a/Cupcake/Label.swift b/Cupcake/Label.swift index f954fd0..d34a2a3 100644 --- a/Cupcake/Label.swift +++ b/Cupcake/Label.swift @@ -25,7 +25,7 @@ public extension UILabel { .str( AttStr("hello world").strikethrough() ) ... */ - @discardableResult public func str(_ any: Any) -> Self { + @objc @discardableResult public func str(_ any: Any) -> Self { if let attStr = any as? NSAttributedString { self.attributedText = attStr } else { @@ -46,7 +46,7 @@ public extension UILabel { .font(someLabel.font) ... **/ - @discardableResult public func font(_ any: Any) -> Self { + @objc @discardableResult public func font(_ any: Any) -> Self { self.font = Font(any) return self } @@ -62,7 +62,7 @@ public extension UILabel { .color(someLabel.textColor) ... */ - @discardableResult public func color(_ any: Any) -> Self { + @objc @discardableResult public func color(_ any: Any) -> Self { self.textColor = Color(any) return self } @@ -74,7 +74,7 @@ public extension UILabel { .lines(0) //multilines .lines() //same as .lines(0) */ - @discardableResult public func lines(_ numberOfLines: CGFloat = 0) -> Self { + @objc @discardableResult public func lines(_ numberOfLines: CGFloat = 0) -> Self { self.numberOfLines = Int(numberOfLines) return self } @@ -84,7 +84,7 @@ public extension UILabel { * Usages: .lineGap(8) */ - @discardableResult public func lineGap(_ lineSpacing: CGFloat) -> Self { + @objc @discardableResult public func lineGap(_ lineSpacing: CGFloat) -> Self { self.cpkLineGap = lineSpacing return self } @@ -96,7 +96,7 @@ public extension UILabel { .align(.justified) ... */ - @discardableResult public func align(_ textAlignment: NSTextAlignment) -> Self { + @objc @discardableResult public func align(_ textAlignment: NSTextAlignment) -> Self { self.textAlignment = textAlignment return self } diff --git a/Cupcake/Str.swift b/Cupcake/Str.swift index faffe13..d79bec6 100644 --- a/Cupcake/Str.swift +++ b/Cupcake/Str.swift @@ -35,11 +35,12 @@ public extension String { @discardableResult public func subFrom(_ indexOrSubstring: Any) -> String { if var index = indexOrSubstring as? Int { if index < 0 { index += self.characters.count } - return self.substring(from: self.index(self.startIndex, offsetBy: index)) + let from = self.index(self.startIndex, offsetBy: index) + return self.cpk_substring(from: from) } else if let substr = indexOrSubstring as? String { if let range = self.range(of: substr) { - return self.substring(from: range.lowerBound) + return self.cpk_substring(from: range.lowerBound) } } @@ -57,11 +58,12 @@ public extension String { @discardableResult public func subTo(_ indexOrSubstring: Any) -> String { if var index = indexOrSubstring as? Int { if index < 0 { index += self.characters.count } - return self.substring(to: self.index(self.startIndex, offsetBy: index)) + let to = self.index(self.startIndex, offsetBy: index) + return self.cpk_substring(to: to) } else if let substr = indexOrSubstring as? String { if let range = self.range(of: substr) { - return self.substring(to: range.lowerBound) + return self.cpk_substring(to: range.lowerBound) } } @@ -80,32 +82,32 @@ public extension String { return String(self[self.index(self.startIndex, offsetBy: index)]) } else if let range = indexOrRange as? Range { - return self.substring(with: range) + return self.cpk_substring(with: range) } else if let range = indexOrRange as? Range { let lower = self.index(self.startIndex, offsetBy: range.lowerBound) let upper = self.index(self.startIndex, offsetBy: range.upperBound) - return self.substring(with: lower.. { let lower = self.index(self.startIndex, offsetBy: range.lowerBound) let upper = self.index(self.startIndex, offsetBy: range.upperBound) - return self.substring(with: lower.. { let lower = self.index(self.startIndex, offsetBy: range.lowerBound) let upper = self.index(self.startIndex, offsetBy: range.upperBound + 1) - return self.substring(with: lower.. { let lower = self.index(self.startIndex, offsetBy: range.lowerBound) let upper = self.index(self.startIndex, offsetBy: range.upperBound + 1) - return self.substring(with: lower.. Self { + @objc @discardableResult public func str(_ any: Any) -> Self { if let attStr = any as? NSAttributedString { self.attributedText = attStr } else { @@ -44,7 +44,7 @@ public extension UITextField { .hint("Enter your name") .hint( AttStr("Enter your name").font(13) ) */ - @discardableResult public func hint(_ any: Any) -> Self { + @objc @discardableResult public func hint(_ any: Any) -> Self { if let attStr = any as? NSAttributedString { self.attributedPlaceholder = attStr } else { @@ -64,7 +64,7 @@ public extension UITextField { .font(someLabel.font) ... **/ - @discardableResult public func font(_ any: Any) -> Self { + @objc @discardableResult public func font(_ any: Any) -> Self { self.font = Font(any) return self } @@ -80,7 +80,7 @@ public extension UITextField { .color(someLabel.textColor) ... */ - @discardableResult public func color(_ any: Any) -> Self { + @objc @discardableResult public func color(_ any: Any) -> Self { self.textColor = Color(any) return self } @@ -90,7 +90,7 @@ public extension UITextField { * Usages: .maxLength(10) */ - @discardableResult public func maxLength(_ length: CGFloat) -> Self { + @objc @discardableResult public func maxLength(_ length: CGFloat) -> Self { self.cpkMaxLength = Int(length) return self } @@ -114,7 +114,7 @@ public extension UITextField { .secure() //secureTextEntry = true .secure(false) //secureTextEntry = false */ - @discardableResult public func secure(_ secureTextEntry: Bool = true) -> Self { + @objc @discardableResult public func secure(_ secureTextEntry: Bool = true) -> Self { self.isSecureTextEntry = secureTextEntry return self } @@ -126,7 +126,7 @@ public extension UITextField { .align(.justified) ... */ - @discardableResult public func align(_ textAlignment: NSTextAlignment) -> Self { + @objc @discardableResult public func align(_ textAlignment: NSTextAlignment) -> Self { self.textAlignment = textAlignment return self } @@ -138,7 +138,7 @@ public extension UITextField { .keyboard(.emailAddress) ... */ - @discardableResult public func keyboard(_ keyboardType: UIKeyboardType) -> Self { + @objc @discardableResult public func keyboard(_ keyboardType: UIKeyboardType) -> Self { self.keyboardType = keyboardType return self } @@ -150,7 +150,7 @@ public extension UITextField { .returnKey(.google) ... */ - @discardableResult public func returnKey(_ returnKeyType: UIReturnKeyType) -> Self { + @objc @discardableResult public func returnKey(_ returnKeyType: UIReturnKeyType) -> Self { self.returnKeyType = returnKeyType return self } @@ -162,7 +162,7 @@ public extension UITextField { .clearMode(.always) ... */ - @discardableResult public func clearMode(_ clearButtonMode: UITextFieldViewMode) -> Self { + @objc @discardableResult public func clearMode(_ clearButtonMode: UITextFieldViewMode) -> Self { self.clearButtonMode = clearButtonMode return self } diff --git a/Cupcake/TextView.swift b/Cupcake/TextView.swift index c1ba659..a069aec 100644 --- a/Cupcake/TextView.swift +++ b/Cupcake/TextView.swift @@ -24,7 +24,7 @@ public extension UITextView { .str( AttStr("hello world").strikethrough() ) ... */ - @discardableResult public func str(_ any: Any) -> Self { + @objc @discardableResult public func str(_ any: Any) -> Self { if let attStr = any as? NSAttributedString { self.attributedText = attStr } else { @@ -41,7 +41,7 @@ public extension UITextView { .hint("Enter here") .hint( AttStr("Enter here").font(13) ) */ - @discardableResult public func hint(_ any: Any) -> Self { + @objc @discardableResult public func hint(_ any: Any) -> Self { cpk_setPlaceholder(any) return self } @@ -57,7 +57,7 @@ public extension UITextView { .font(someLabel.font) ... **/ - @discardableResult public func font(_ any: Any) -> Self { + @objc @discardableResult public func font(_ any: Any) -> Self { self.font = Font(any) return self } @@ -73,7 +73,7 @@ public extension UITextView { .color(someLabel.textColor) ... */ - @discardableResult public func color(_ any: Any) -> Self { + @objc @discardableResult public func color(_ any: Any) -> Self { self.textColor = Color(any) return self } @@ -83,7 +83,7 @@ public extension UITextView { * Usages: .maxLength(10) */ - @discardableResult public func maxLength(_ length: CGFloat) -> Self { + @objc @discardableResult public func maxLength(_ length: CGFloat) -> Self { self.cpkMaxLength = Int(length) return self } @@ -108,7 +108,7 @@ public extension UITextView { .align(.justified) ... */ - @discardableResult public func align(_ textAlignment: NSTextAlignment) -> Self { + @objc @discardableResult public func align(_ textAlignment: NSTextAlignment) -> Self { self.textAlignment = textAlignment return self } diff --git a/Cupcake/View.swift b/Cupcake/View.swift index b640bc7..a81466b 100644 --- a/Cupcake/View.swift +++ b/Cupcake/View.swift @@ -28,7 +28,7 @@ public extension UIView { .bg("cat") //using image ... */ - @discardableResult public func bg(_ any: Any) -> Self { + @objc @discardableResult public func bg(_ any: Any) -> Self { self.backgroundColor = Color(any) ?? Color(Img(any)) return self } @@ -41,7 +41,7 @@ public extension UIView { .tint("red") .tint("#00F") */ - @discardableResult public func tint(_ any: Any) -> Self { + @objc @discardableResult public func tint(_ any: Any) -> Self { self.tintColor = Color(any) return self } @@ -54,7 +54,7 @@ public extension UIView { .radius(10) .radius(-1) //passing negative number means using auto rounding */ - @discardableResult public func radius(_ cornerRadius: CGFloat) -> Self { + @objc @discardableResult public func radius(_ cornerRadius: CGFloat) -> Self { if cornerRadius < 0 { self.layer.cornerRadius = self.bounds.height / 2 self.cpkAutoRoundingRadius = true @@ -75,7 +75,7 @@ public extension UIView { .border(1) .border(1, "red") */ - @discardableResult public func border(_ borderWidth: CGFloat, _ borderColor: Any? = nil) -> Self { + @objc @discardableResult public func border(_ borderWidth: CGFloat, _ borderColor: Any? = nil) -> Self { self.layer.borderWidth = borderWidth self.layer.borderColor = Color(borderColor)?.cgColor return self @@ -88,10 +88,10 @@ public extension UIView { .shadow(0.7, 2) .shadow(0.7, 3, 0, 0) */ - @discardableResult public func shadow(_ shadowOpacity: CGFloat, - _ shadowRadius: CGFloat = 3, - _ shadowOffsetX: CGFloat = 0, - _ shadowOffsetY: CGFloat = 3) -> Self { + @objc @discardableResult public func shadow(_ shadowOpacity: CGFloat, + _ shadowRadius: CGFloat = 3, + _ shadowOffsetX: CGFloat = 0, + _ shadowOffsetY: CGFloat = 3) -> Self { self.layer.shadowOpacity = Float(shadowOpacity) self.layer.shadowRadius = shadowRadius @@ -108,7 +108,7 @@ public extension UIView { .styles(myStyle1, myStyle2, "globalStyle1") .styles(someView) //retrieve styles direct from view */ - @discardableResult public func styles(_ s1: Any, _ s2: Any? = nil, _ s3: Any? = nil, _ s4: Any? = nil) -> Self { + @objc @discardableResult public func styles(_ s1: Any, _ s2: Any? = nil, _ s3: Any? = nil, _ s4: Any? = nil) -> Self { var array = Array() array.append(s1) @@ -142,7 +142,7 @@ public extension UIView { .touchInsets(10, 20, 30) //top: 10, left: 20, bottom: 0 , right: 30 .touchInsets(10, 20, 30, 40) //top: 10, left: 20, bottom: 30, right: 40 */ - @discardableResult public func touchInsets(_ p1: Any, _ p2: Any? = nil, _ p3: Any? = nil, _ p4: Any? = nil) -> Self { + @objc @discardableResult public func touchInsets(_ p1: Any, _ p2: Any? = nil, _ p3: Any? = nil, _ p4: Any? = nil) -> Self { self.cpkTouchInsets = cpk_edgeInsetsFromParameters(p1, p2, p3, p4) return self } @@ -156,7 +156,7 @@ public extension UIView { .onClick({ _ in /* ... */ }) //if you don't care at all .onClick({ [weak self] _ in /* ... */ }) //capture self as weak reference when needed */ - @discardableResult public func onClick(_ closure: @escaping (UIView)->()) -> Self { + @objc @discardableResult public func onClick(_ closure: @escaping (UIView)->()) -> Self { cpk_onClick(closure, nil) return self } @@ -166,7 +166,7 @@ public extension UIView { * Usages: .addTo(superView) */ - @discardableResult public func addTo(_ superview: UIView) -> Self { + @objc @discardableResult public func addTo(_ superview: UIView) -> Self { superview.addSubview(self) return self } @@ -206,7 +206,7 @@ public extension UIView { .margin(10, 20, 30) //top: 10, left: 20, bottom: 0 , right: 30 .margin(10, 20, 30, 40) //top: 10, left: 20, bottom: 30, right: 40 */ - @discardableResult public func margin(_ p1: Any, _ p2: Any? = nil, _ p3: Any? = nil, _ p4: Any? = nil) -> Self { + @objc @discardableResult public func margin(_ p1: Any, _ p2: Any? = nil, _ p3: Any? = nil, _ p4: Any? = nil) -> Self { self.layoutMargins = cpk_edgeInsetsFromParameters(p1, p2, p3, p4) return self } @@ -271,7 +271,7 @@ public extension UIView { _.size.equal(100, 100) }) */ - @discardableResult public func makeCons(_ closure: (ConsMaker)->()) -> Self { + @objc @discardableResult public func makeCons(_ closure: (ConsMaker)->()) -> Self { let maker = ConsMaker(firstItem: self) closure(maker) maker.updateConstraints() @@ -287,7 +287,7 @@ public extension UIView { _.size.equal(anotherView) }) */ - @discardableResult public func remakeCons(_ closure: (ConsMaker)->()) -> Self { + @objc @discardableResult public func remakeCons(_ closure: (ConsMaker)->()) -> Self { let maker = ConsMaker(firstItem: self) closure(maker) maker.remakeConstraints() @@ -310,9 +310,9 @@ public extension UIView { * Usages: .embedIn(superview, "10", 20, "30", 40) //topMargin: 10, left: 20, bottomMargin: 30, right: 40 */ - @discardableResult public func embedIn(_ superview: UIView, - _ p1: Any? = "", _ p2: Any? = "", - _ p3: Any? = "", _ p4: Any? = "") -> Self { + @objc @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 98db883..51e12c2 100644 --- a/Cupcake/__Private__Implementations__.swift +++ b/Cupcake/__Private__Implementations__.swift @@ -502,9 +502,6 @@ let CPKLabelLinkAttributeValue = "CPKLabelLinkValue" fileprivate let CPKLinkColor = UIColor(red: 0, green: 0.478431, blue: 1, alpha: 1) -fileprivate let CPKFixLineSpacingIssueAttributeName = "CPKFixLineSpacingIssue" -fileprivate let CPKFixLineSpacingIssueAttributeValue = "Fix single line Label with lineSpacing issue" - public extension NSObject { @@ -525,27 +522,27 @@ public extension NSObject { return false } - var m1 = class_getInstanceMethod(self, s1) - var m2 = class_getInstanceMethod(self, s2) + var m1 = class_getInstanceMethod(self, s1!) + var m2 = class_getInstanceMethod(self, s2!) if m1 == nil || m2 == nil { return false } - class_addMethod(self, s1, method_getImplementation(m1), method_getTypeEncoding(m1)) - class_addMethod(self, s2, method_getImplementation(m2), method_getTypeEncoding(m2)) + class_addMethod(self, s1!, method_getImplementation(m1!), method_getTypeEncoding(m1!)) + class_addMethod(self, s2!, method_getImplementation(m2!), method_getTypeEncoding(m2!)) - m1 = class_getInstanceMethod(self, s1) - m2 = class_getInstanceMethod(self, s2) - method_exchangeImplementations(m1, m2) + m1 = class_getInstanceMethod(self, s1!) + m2 = class_getInstanceMethod(self, s2!) + method_exchangeImplementations(m1!, m2!) return true } - @discardableResult - public static func cpk_swizzleClass(method1: Any, method2: Any) -> Bool { - return object_getClass(self).cpk_swizzle(method1: method1, method2: method2) - } +// @discardableResult +// public static func cpk_swizzleClass(method1: Any, method2: Any) -> Bool { +// return object_getClass(self).cpk_swizzle(method1: method1, method2: method2) +// } @discardableResult public func cpk_safePerform(selector: Selector) -> Any? { @@ -586,6 +583,34 @@ public extension NSObject { } + +extension String { + func cpk_substring(with range: Range) -> String { + #if swift(>=4.0) + return String(self[range]) + #else + return self.substring(with: range) + #endif + } + + func cpk_substring(to index: String.Index) -> String { + #if swift(>=4.0) + return String(self[.. String { + #if swift(>=4.0) + return String(self[index...]) + #else + return self.substring(from: index) + #endif + } +} + + extension NSMutableAttributedString { private var cpkSelectedRanges: NSMutableIndexSet { @@ -624,20 +649,28 @@ extension NSMutableAttributedString { } } + func cpk_addAttribute(_ name: String, value: Any, range: NSRange) { + #if swift(>=4.0) + addAttribute(NSAttributedStringKey(rawValue: name), value: value, range: range) + #else + addAttribute(name, value: value, range: range) + #endif + } + func cpk_addAttribute(name: String, value: Any) { self.cpkIsJustSelectingRange = false self.cpkSelectedRanges.enumerateRanges({ (range, stop) in if name == CPKLabelLinkAttributeName { - addAttribute(name, value: value, range: range) - addAttribute(NSForegroundColorAttributeName, value: CPKLinkColor, range: range) + cpk_addAttribute(name, value: value, range: range) + cpk_addAttribute("NSColor", value: CPKLinkColor, range: range) } else { if self.cpkPreventOverrideAttribute { cpk_addAttributeIfNotExisted(name: name, value: value, range: range) } else { - addAttribute(name, value: value, range: range) + cpk_addAttribute(name, value: value, range: range) } } }); @@ -645,14 +678,29 @@ extension NSMutableAttributedString { func cpk_addAttributeIfNotExisted(name: String, value: Any, range: NSRange) { let indexSets = NSMutableIndexSet(indexesIn: range) - enumerateAttribute(name, in: range, options: NSAttributedString.EnumerationOptions(rawValue: 0)) { (value, range, stop) in + + #if swift(>=4.0) + enumerateAttribute(NSAttributedStringKey(rawValue: name), + in: range, + options: NSAttributedString.EnumerationOptions(rawValue: 0)) + { (value, range, stop) in if value != nil { indexSets.remove(in: range) } } + #else + enumerateAttribute(name, + in: range, + options: NSAttributedString.EnumerationOptions(rawValue: 0)) + { (value, range, stop) in + if value != nil { + indexSets.remove(in: range) + } + } + #endif indexSets.enumerateRanges({ (range, stop) in - addAttribute(name, value: value, range: range) + cpk_addAttribute(name, value: value, range: range) }) } @@ -660,7 +708,7 @@ extension NSMutableAttributedString { let targetRange = range ?? NSMakeRange(0, self.length) var mutableStyle: NSMutableParagraphStyle - if let paraStyle = attribute(NSParagraphStyleAttributeName, + if let paraStyle = attribute("NSParagraphStyle", at: targetRange.location, longestEffectiveRange: nil, in: targetRange) as? NSParagraphStyle { @@ -673,11 +721,7 @@ extension NSMutableAttributedString { } mutableStyle.setValue(value, forKey: key) - addAttribute(NSParagraphStyleAttributeName, value: mutableStyle, range: targetRange) - - if key == "lineSpacing" { - addAttribute(CPKFixLineSpacingIssueAttributeName, value: CPKFixLineSpacingIssueAttributeValue, range: targetRange) - } + cpk_addAttribute("NSParagraphStyle", value: mutableStyle, range: targetRange) } } @@ -726,12 +770,12 @@ extension UIView { set { cpk_setAssociated(object: newValue, forKey: #function) } } - func cpk_setBounds(_ frame: CGRect) { + @objc func cpk_setBounds(_ frame: CGRect) { cpk_setBounds(frame) cpk_updateCornerRadiusIfNeed() } - func cpk_point(inside point: CGPoint, with event: UIEvent?) -> Bool { + @objc func cpk_point(inside point: CGPoint, with event: UIEvent?) -> Bool { if let insets = self.cpkTouchInsets { let rect = UIEdgeInsetsInsetRect(self.bounds, insets) return rect.contains(point) @@ -740,7 +784,7 @@ extension UIView { } } - func cpk_masksToBoundsIfNeed() { + @objc func cpk_masksToBoundsIfNeed() { self.layer.masksToBounds = false } @@ -776,7 +820,7 @@ extension UIView { } } - func cpk_onClickHandler() { + @objc func cpk_onClickHandler() { let callback = cpk_associatedObjectFor(key: "cpk_OnClick") if let closure = callback as? ()->() { @@ -883,12 +927,12 @@ extension UITextField { set { cpk_setAssociated(object: newValue, forKey: #function); cpk_watchOnEndEvent() } } - public func cpk_textRect(forBounds bounds: CGRect) -> CGRect { + @objc public func cpk_textRect(forBounds bounds: CGRect) -> CGRect { let rect = self.cpk_textRect(forBounds: bounds) return UIEdgeInsetsInsetRect(rect, self.cpkPadding) } - public func cpk_editingRect(forBounds bounds: CGRect) -> CGRect { + @objc public func cpk_editingRect(forBounds bounds: CGRect) -> CGRect { let rect = cpk_editingRect(forBounds: bounds) return UIEdgeInsetsInsetRect(rect, self.cpkPadding) } @@ -905,7 +949,7 @@ extension UITextField { addTarget(self, action: sel, for: .editingDidEndOnExit) } - func cpk_textDidChange() { + @objc func cpk_textDidChange() { let hasMarked = cpk_limitTextInput(self, maxLength: self.cpkMaxLength) if !hasMarked { if let closure = self.cpkTextChangedClosure as? (UITextField)->() { @@ -914,7 +958,7 @@ extension UITextField { } } - func cpk_didEndOnExit() { + @objc func cpk_didEndOnExit() { if let closure = self.cpkDidEndOnExistClosure as? (UITextField)->() { closure(self) } @@ -948,6 +992,21 @@ extension CPKViewPinOptions : ExpressibleByIntegerLiteral, ExpressibleByFloatLit } +#if swift(>=4.0) +extension UILayoutPriority : ExpressibleByIntegerLiteral, ExpressibleByFloatLiteral { + public init(integerLiteral value: Int) { + self = UILayoutPriority(rawValue: Float(value)) + } + public init(floatLiteral value: Float) { + self = UILayoutPriority(rawValue: value) + } +} +extension NSAttributedStringKey : ExpressibleByStringLiteral { + public init(stringLiteral value: String) { + self = NSAttributedStringKey(rawValue: value) + } +} +#endif @@ -1012,7 +1071,7 @@ public class AlertMaker { if let attTitle = title as? NSAttributedString { titleString = attTitle.string - titleColor = attTitle.attribute(NSForegroundColorAttributeName, at: 0, effectiveRange: nil) as? UIColor + titleColor = attTitle.attribute("NSColor", at: 0, effectiveRange: nil) as? UIColor } else { titleString = String(describing: title) } @@ -1216,7 +1275,7 @@ public class Cons: ConsAtts { } private func priorityValue(atIndex index: Int) -> UILayoutPriority { - var priority: UILayoutPriority = UILayoutPriorityRequired + var priority: UILayoutPriority = 1000 if index < priorityValues.count { priority = priorityValues[index] @@ -1256,7 +1315,11 @@ public class Cons: ConsAtts { multiplier: multiplier, constant: constant) + #if swift(>=4.0) + c.priority = priority + #else c.priority = Float(priority) + #endif layoutConstraints.append(c) } @@ -2212,7 +2275,7 @@ public class StaticRow: UIView { return CPKTransformLayer.self } - func switchDidChange() { + @objc func switchDidChange() { if let callback = onChangeHandler { callback(self) } @@ -2511,7 +2574,7 @@ extension UITextView { return self.viewWithTag(31415) as? UITextViewPlaceholder } - public func cpk_deinit() { + @objc public func cpk_deinit() { if let label = self.cpkPlaceholderLabel { for keyPath in cpkTextViewObservingKeys { self.removeObserver(label, forKeyPath: keyPath) @@ -2533,7 +2596,7 @@ extension UITextView { object: self) } - func cpk_textDidChange() { + @objc func cpk_textDidChange() { let hasMarked = cpk_limitTextInput(self, maxLength: self.cpkMaxLength) if !hasMarked { if let closure = self.cpkTextChangedClosure as? (UITextView)->() { @@ -2774,7 +2837,7 @@ extension UILabel { set { cpk_setAssociated(object: newValue, forKey: #function) } } - public func ner_setText(_ text: String) { + @objc public func ner_setText(_ text: String) { self.ner_setText(text) cpk_updateAttributedString() } @@ -2791,7 +2854,7 @@ extension UILabel { extension UILabel { - func cpk_handleLinkGesture(_ gesture: LinkGestureRecognizer) { + @objc func cpk_handleLinkGesture(_ gesture: LinkGestureRecognizer) { func cpk_calculateTextYOffset() -> CGFloat { let layoutManager = self.cpkLayoutManager @@ -2832,7 +2895,7 @@ extension UILabel { } } - if let ps = layoutManager.textStorage?.attribute(NSParagraphStyleAttributeName, + if let ps = layoutManager.textStorage?.attribute("NSParagraphStyle", at: range.location, longestEffectiveRange: nil, in: range) as? NSParagraphStyle { @@ -2877,7 +2940,7 @@ extension UILabel { } } - attStr.enumerateAttribute(CPKLabelLinkAttributeName, + attStr.enumerateAttribute("CPKLabelLink", in: fullRange, options: NSAttributedString.EnumerationOptions.init(rawValue: 0), using: handler) @@ -2919,7 +2982,7 @@ extension UILabel { } } - func cpk_addHighlightedLayers(for linkInfo: LinkInfo) { + @objc func cpk_addHighlightedLayers(for linkInfo: LinkInfo) { for rect in linkInfo.boundingRects { if rect.size.width > 0 && rect.size.height > 0 { var color = self.cpkLinkSelectionColor ?? UIColor.darkGray diff --git a/README.md b/README.md index 4c7445e..8c6e37a 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,8 @@

-Language +Language +Swift4 Platform Version License