From 0eb21b5a86b3e9c852f80da67929d1c2b15a7bbf Mon Sep 17 00:00:00 2001 From: caiyuanpeng <28578093@qq.com> Date: Thu, 8 Jun 2017 14:25:00 +0800 Subject: [PATCH] init project --- .../Cupcake-Demo.xcodeproj/project.pbxproj | 420 +++ .../contents.xcworkspacedata | 7 + .../UserInterfaceState.xcuserstate | Bin 0 -> 139875 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 5 + .../xcschemes/Cupcake-Demo.xcscheme | 91 + .../xcschemes/xcschememanagement.plist | 22 + Cupcake-Demo/Cupcake-Demo/AppDelegate.swift | 44 + .../Cupcake-Demo/AppStoreViewController.swift | 100 + .../AppIcon.appiconset/Contents.json | 48 + .../Assets.xcassets/AppStore/Contents.json | 6 + .../AppStore/bitmoji.imageset/Bitmoji@2x.jpeg | Bin 0 -> 4648 bytes .../AppStore/bitmoji.imageset/Contents.json | 21 + .../fivenights.imageset/Contents.json | 21 + .../fivenights.imageset/fivehights@2x.jpeg | Bin 0 -> 11761 bytes .../AppStore/mario.imageset/Contents.json | 21 + .../AppStore/mario.imageset/mario@2x.jpeg | Bin 0 -> 11576 bytes .../AppStore/messenger.imageset/Contents.json | 21 + .../messenger.imageset/messenger@2x.jpeg | Bin 0 -> 5179 bytes .../AppStore/minecraft.imageset/Contents.json | 21 + .../minecraft.imageset/minecraft@2x.jpeg | Bin 0 -> 6484 bytes .../AppStore/snapchat.imageset/Contents.json | 21 + .../snapchat.imageset/snapchat@2x.jpeg | Bin 0 -> 5317 bytes .../AppStore/youtube.imageset/Contents.json | 21 + .../AppStore/youtube.imageset/youtube@2x.jpeg | Bin 0 -> 3282 bytes .../Assets.xcassets/Contents.json | 6 + .../Assets.xcassets/Examples/Contents.json | 6 + .../Examples/customers.imageset/Contents.json | 21 + .../Examples/customers.imageset/customers.png | Bin 0 -> 1216 bytes .../Examples/dashboard.imageset/Contents.json | 21 + .../Examples/dashboard.imageset/dashboard.png | Bin 0 -> 1956 bytes .../Examples/entities.imageset/Contents.json | 21 + .../Examples/entities.imageset/entities.png | Bin 0 -> 891 bytes .../Examples/jobsites.imageset/Contents.json | 21 + .../Examples/jobsites.imageset/jobsites.png | Bin 0 -> 1539 bytes .../Examples/requests.imageset/Contents.json | 21 + .../Examples/requests.imageset/requests.png | Bin 0 -> 1695 bytes .../Examples/shubox.imageset/Contents.json | 21 + .../Examples/shubox.imageset/shubox.png | Bin 0 -> 140424 bytes .../Assets.xcassets/Settings/Contents.json | 6 + .../Settings/airplane.imageset/Contents.json | 21 + .../Settings/airplane.imageset/airplane.png | Bin 0 -> 3022 bytes .../Settings/display.imageset/Contents.json | 21 + .../Settings/display.imageset/display.png | Bin 0 -> 2844 bytes .../Settings/disturb.imageset/Contents.json | 21 + .../Settings/disturb.imageset/disturb.png | Bin 0 -> 2858 bytes .../Settings/general.imageset/Contents.json | 21 + .../Settings/general.imageset/general.png | Bin 0 -> 4495 bytes .../Settings/wlan.imageset/Contents.json | 21 + .../Settings/wlan.imageset/wlan.png | Bin 0 -> 3171 bytes .../arrow.imageset/Contents.json | 21 + .../arrow.imageset/arrow@2x.png | Bin 0 -> 323 bytes .../candle.imageset/Contents.json | 21 + .../candle.imageset/candle@2x.png | Bin 0 -> 2456 bytes .../cat.imageset/Contents.json | 21 + .../Assets.xcassets/cat.imageset/cat.png | Bin 0 -> 1593 bytes .../Base.lproj/LaunchScreen.storyboard | 27 + .../Cupcake-Demo/Base.lproj/Main.storyboard | 54 + .../Cupcake-Demo/BasicViewController.swift | 60 + .../EnhancementViewController.swift | 67 + .../Cupcake-Demo/ExamplesViewController.swift | 183 + Cupcake-Demo/Cupcake-Demo/Info.plist | 36 + .../Cupcake-Demo/StackViewController.swift | 63 + .../Cupcake-Demo/StaticViewController.swift | 282 ++ .../Cupcake-Demo/ViewController.swift | 40 + Cupcake-Demo/Cupcake-Demo/appList.plist | 118 + Cupcake.podspec | 21 + Cupcake/Alert.swift | 120 + Cupcake/AttStr.swift | 359 ++ Cupcake/Button.swift | 227 ++ Cupcake/CPKStackView.swift | 708 ++++ Cupcake/Color.swift | 106 + Cupcake/Cons.swift | 230 ++ Cupcake/Font.swift | 50 + Cupcake/ImageView.swift | 54 + Cupcake/Img.swift | 123 + Cupcake/Label.swift | 120 + Cupcake/Stack.swift | 118 + Cupcake/StaticTable.swift | 447 +++ Cupcake/Str.swift | 160 + Cupcake/Styles.swift | 160 + Cupcake/TextField.swift | 198 + Cupcake/TextView.swift | 130 + Cupcake/View.swift | 362 ++ Cupcake/__Privates__Implementation__.swift | 3312 +++++++++++++++++ res/appstore.png | Bin 0 -> 55359 bytes res/cupcake.png | Bin 0 -> 53350 bytes 86 files changed, 9137 insertions(+) create mode 100644 Cupcake-Demo/Cupcake-Demo.xcodeproj/project.pbxproj create mode 100644 Cupcake-Demo/Cupcake-Demo.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Cupcake-Demo/Cupcake-Demo.xcodeproj/project.xcworkspace/xcuserdata/admin.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 Cupcake-Demo/Cupcake-Demo.xcodeproj/xcuserdata/admin.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 Cupcake-Demo/Cupcake-Demo.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/Cupcake-Demo.xcscheme create mode 100644 Cupcake-Demo/Cupcake-Demo.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 Cupcake-Demo/Cupcake-Demo/AppDelegate.swift create mode 100644 Cupcake-Demo/Cupcake-Demo/AppStoreViewController.swift create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/Contents.json create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/bitmoji.imageset/Bitmoji@2x.jpeg create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/bitmoji.imageset/Contents.json create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/fivenights.imageset/Contents.json create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/fivenights.imageset/fivehights@2x.jpeg create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/mario.imageset/Contents.json create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/mario.imageset/mario@2x.jpeg create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/messenger.imageset/Contents.json create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/messenger.imageset/messenger@2x.jpeg create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/minecraft.imageset/Contents.json create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/minecraft.imageset/minecraft@2x.jpeg create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/snapchat.imageset/Contents.json create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/snapchat.imageset/snapchat@2x.jpeg create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/youtube.imageset/Contents.json create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/youtube.imageset/youtube@2x.jpeg create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Contents.json create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Examples/Contents.json create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Examples/customers.imageset/Contents.json create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Examples/customers.imageset/customers.png create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Examples/dashboard.imageset/Contents.json create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Examples/dashboard.imageset/dashboard.png create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Examples/entities.imageset/Contents.json create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Examples/entities.imageset/entities.png create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Examples/jobsites.imageset/Contents.json create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Examples/jobsites.imageset/jobsites.png create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Examples/requests.imageset/Contents.json create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Examples/requests.imageset/requests.png create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Examples/shubox.imageset/Contents.json create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Examples/shubox.imageset/shubox.png create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Settings/Contents.json create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Settings/airplane.imageset/Contents.json create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Settings/airplane.imageset/airplane.png create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Settings/display.imageset/Contents.json create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Settings/display.imageset/display.png create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Settings/disturb.imageset/Contents.json create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Settings/disturb.imageset/disturb.png create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Settings/general.imageset/Contents.json create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Settings/general.imageset/general.png create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Settings/wlan.imageset/Contents.json create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Settings/wlan.imageset/wlan.png create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/arrow.imageset/Contents.json create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/arrow.imageset/arrow@2x.png create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/candle.imageset/Contents.json create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/candle.imageset/candle@2x.png create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/cat.imageset/Contents.json create mode 100644 Cupcake-Demo/Cupcake-Demo/Assets.xcassets/cat.imageset/cat.png create mode 100644 Cupcake-Demo/Cupcake-Demo/Base.lproj/LaunchScreen.storyboard create mode 100644 Cupcake-Demo/Cupcake-Demo/Base.lproj/Main.storyboard create mode 100644 Cupcake-Demo/Cupcake-Demo/BasicViewController.swift create mode 100644 Cupcake-Demo/Cupcake-Demo/EnhancementViewController.swift create mode 100644 Cupcake-Demo/Cupcake-Demo/ExamplesViewController.swift create mode 100644 Cupcake-Demo/Cupcake-Demo/Info.plist create mode 100644 Cupcake-Demo/Cupcake-Demo/StackViewController.swift create mode 100644 Cupcake-Demo/Cupcake-Demo/StaticViewController.swift create mode 100644 Cupcake-Demo/Cupcake-Demo/ViewController.swift create mode 100644 Cupcake-Demo/Cupcake-Demo/appList.plist create mode 100644 Cupcake.podspec create mode 100644 Cupcake/Alert.swift create mode 100644 Cupcake/AttStr.swift create mode 100644 Cupcake/Button.swift create mode 100644 Cupcake/CPKStackView.swift create mode 100644 Cupcake/Color.swift create mode 100644 Cupcake/Cons.swift create mode 100644 Cupcake/Font.swift create mode 100644 Cupcake/ImageView.swift create mode 100644 Cupcake/Img.swift create mode 100644 Cupcake/Label.swift create mode 100644 Cupcake/Stack.swift create mode 100644 Cupcake/StaticTable.swift create mode 100644 Cupcake/Str.swift create mode 100644 Cupcake/Styles.swift create mode 100644 Cupcake/TextField.swift create mode 100644 Cupcake/TextView.swift create mode 100644 Cupcake/View.swift create mode 100644 Cupcake/__Privates__Implementation__.swift create mode 100644 res/appstore.png create mode 100644 res/cupcake.png diff --git a/Cupcake-Demo/Cupcake-Demo.xcodeproj/project.pbxproj b/Cupcake-Demo/Cupcake-Demo.xcodeproj/project.pbxproj new file mode 100644 index 0000000..ede404f --- /dev/null +++ b/Cupcake-Demo/Cupcake-Demo.xcodeproj/project.pbxproj @@ -0,0 +1,420 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 841B2C721E7BC5900084B37C /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 841B2C711E7BC5900084B37C /* AppDelegate.swift */; }; + 841B2C741E7BC5900084B37C /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 841B2C731E7BC5900084B37C /* ViewController.swift */; }; + 841B2C771E7BC5900084B37C /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 841B2C751E7BC5900084B37C /* Main.storyboard */; }; + 841B2C791E7BC5900084B37C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 841B2C781E7BC5900084B37C /* Assets.xcassets */; }; + 841B2C7C1E7BC5900084B37C /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 841B2C7A1E7BC5900084B37C /* LaunchScreen.storyboard */; }; + 8429690F1EE900EC0060C61D /* __Privates__Implementation__.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842968FD1EE900EC0060C61D /* __Privates__Implementation__.swift */; }; + 842969101EE900EC0060C61D /* Alert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842968FE1EE900EC0060C61D /* Alert.swift */; }; + 842969111EE900EC0060C61D /* AttStr.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842968FF1EE900EC0060C61D /* AttStr.swift */; }; + 842969121EE900EC0060C61D /* Button.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842969001EE900EC0060C61D /* Button.swift */; }; + 842969131EE900EC0060C61D /* Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842969011EE900EC0060C61D /* Color.swift */; }; + 842969141EE900EC0060C61D /* Cons.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842969021EE900EC0060C61D /* Cons.swift */; }; + 842969151EE900EC0060C61D /* CPKStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842969031EE900EC0060C61D /* CPKStackView.swift */; }; + 842969161EE900EC0060C61D /* Font.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842969041EE900EC0060C61D /* Font.swift */; }; + 842969171EE900EC0060C61D /* ImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842969051EE900EC0060C61D /* ImageView.swift */; }; + 842969181EE900EC0060C61D /* Img.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842969061EE900EC0060C61D /* Img.swift */; }; + 842969191EE900EC0060C61D /* Label.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842969071EE900EC0060C61D /* Label.swift */; }; + 8429691A1EE900EC0060C61D /* Stack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842969081EE900EC0060C61D /* Stack.swift */; }; + 8429691B1EE900EC0060C61D /* StaticTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842969091EE900EC0060C61D /* StaticTable.swift */; }; + 8429691C1EE900EC0060C61D /* Str.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8429690A1EE900EC0060C61D /* Str.swift */; }; + 8429691D1EE900EC0060C61D /* Styles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8429690B1EE900EC0060C61D /* Styles.swift */; }; + 8429691E1EE900EC0060C61D /* TextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8429690C1EE900EC0060C61D /* TextField.swift */; }; + 8429691F1EE900EC0060C61D /* TextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8429690D1EE900EC0060C61D /* TextView.swift */; }; + 842969201EE900EC0060C61D /* View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8429690E1EE900EC0060C61D /* View.swift */; }; + 842ADB421EB9C53D0031B56C /* ExamplesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842ADB411EB9C53D0031B56C /* ExamplesViewController.swift */; }; + 84B599B31EB1FF56005ADDFB /* BasicViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84B599B21EB1FF56005ADDFB /* BasicViewController.swift */; }; + 84B599B51EB1FF6C005ADDFB /* EnhancementViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84B599B41EB1FF6C005ADDFB /* EnhancementViewController.swift */; }; + 84B599B71EB32A9C005ADDFB /* StackViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84B599B61EB32A9C005ADDFB /* StackViewController.swift */; }; + 84B599B91EB32CE3005ADDFB /* appList.plist in Resources */ = {isa = PBXBuildFile; fileRef = 84B599B81EB32CE3005ADDFB /* appList.plist */; }; + 84B599BB1EB334EA005ADDFB /* StaticViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84B599BA1EB334EA005ADDFB /* StaticViewController.swift */; }; + 84CC7DF81EC94EC300817678 /* AppStoreViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84CC7DF71EC94EC300817678 /* AppStoreViewController.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 841B2C6E1E7BC5900084B37C /* Cupcake-Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Cupcake-Demo.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 841B2C711E7BC5900084B37C /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 841B2C731E7BC5900084B37C /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 841B2C761E7BC5900084B37C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 841B2C781E7BC5900084B37C /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 841B2C7B1E7BC5900084B37C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 841B2C7D1E7BC5900084B37C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 842968FD1EE900EC0060C61D /* __Privates__Implementation__.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = __Privates__Implementation__.swift; sourceTree = ""; }; + 842968FE1EE900EC0060C61D /* Alert.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Alert.swift; sourceTree = ""; }; + 842968FF1EE900EC0060C61D /* AttStr.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AttStr.swift; sourceTree = ""; }; + 842969001EE900EC0060C61D /* Button.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Button.swift; sourceTree = ""; }; + 842969011EE900EC0060C61D /* Color.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Color.swift; sourceTree = ""; }; + 842969021EE900EC0060C61D /* Cons.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Cons.swift; sourceTree = ""; }; + 842969031EE900EC0060C61D /* CPKStackView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CPKStackView.swift; sourceTree = ""; }; + 842969041EE900EC0060C61D /* Font.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Font.swift; sourceTree = ""; }; + 842969051EE900EC0060C61D /* ImageView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageView.swift; sourceTree = ""; }; + 842969061EE900EC0060C61D /* Img.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Img.swift; sourceTree = ""; }; + 842969071EE900EC0060C61D /* Label.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Label.swift; sourceTree = ""; }; + 842969081EE900EC0060C61D /* Stack.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Stack.swift; sourceTree = ""; }; + 842969091EE900EC0060C61D /* StaticTable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StaticTable.swift; sourceTree = ""; }; + 8429690A1EE900EC0060C61D /* Str.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Str.swift; sourceTree = ""; }; + 8429690B1EE900EC0060C61D /* Styles.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Styles.swift; sourceTree = ""; }; + 8429690C1EE900EC0060C61D /* TextField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextField.swift; sourceTree = ""; }; + 8429690D1EE900EC0060C61D /* TextView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextView.swift; sourceTree = ""; }; + 8429690E1EE900EC0060C61D /* View.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = View.swift; sourceTree = ""; }; + 842ADB411EB9C53D0031B56C /* ExamplesViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExamplesViewController.swift; sourceTree = ""; }; + 84B599B21EB1FF56005ADDFB /* BasicViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BasicViewController.swift; sourceTree = ""; }; + 84B599B41EB1FF6C005ADDFB /* EnhancementViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EnhancementViewController.swift; sourceTree = ""; }; + 84B599B61EB32A9C005ADDFB /* StackViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StackViewController.swift; sourceTree = ""; }; + 84B599B81EB32CE3005ADDFB /* appList.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = appList.plist; sourceTree = ""; }; + 84B599BA1EB334EA005ADDFB /* StaticViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StaticViewController.swift; sourceTree = ""; }; + 84CC7DF71EC94EC300817678 /* AppStoreViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppStoreViewController.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 841B2C6B1E7BC5900084B37C /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 841B2C651E7BC5900084B37C = { + isa = PBXGroup; + children = ( + 841B2C701E7BC5900084B37C /* Cupcake-Demo */, + 841B2C6F1E7BC5900084B37C /* Products */, + ); + sourceTree = ""; + }; + 841B2C6F1E7BC5900084B37C /* Products */ = { + isa = PBXGroup; + children = ( + 841B2C6E1E7BC5900084B37C /* Cupcake-Demo.app */, + ); + name = Products; + sourceTree = ""; + }; + 841B2C701E7BC5900084B37C /* Cupcake-Demo */ = { + isa = PBXGroup; + children = ( + 842968FC1EE900EC0060C61D /* Cupcake */, + 841B2C711E7BC5900084B37C /* AppDelegate.swift */, + 841B2C731E7BC5900084B37C /* ViewController.swift */, + 84B599B21EB1FF56005ADDFB /* BasicViewController.swift */, + 84B599B41EB1FF6C005ADDFB /* EnhancementViewController.swift */, + 84B599B61EB32A9C005ADDFB /* StackViewController.swift */, + 84B599BA1EB334EA005ADDFB /* StaticViewController.swift */, + 842ADB411EB9C53D0031B56C /* ExamplesViewController.swift */, + 84CC7DF71EC94EC300817678 /* AppStoreViewController.swift */, + 841B2C751E7BC5900084B37C /* Main.storyboard */, + 841B2C781E7BC5900084B37C /* Assets.xcassets */, + 841B2C7A1E7BC5900084B37C /* LaunchScreen.storyboard */, + 84B599B81EB32CE3005ADDFB /* appList.plist */, + 841B2C7D1E7BC5900084B37C /* Info.plist */, + ); + path = "Cupcake-Demo"; + sourceTree = ""; + }; + 842968FC1EE900EC0060C61D /* Cupcake */ = { + isa = PBXGroup; + children = ( + 8429690A1EE900EC0060C61D /* Str.swift */, + 842968FF1EE900EC0060C61D /* AttStr.swift */, + 842969041EE900EC0060C61D /* Font.swift */, + 842969061EE900EC0060C61D /* Img.swift */, + 842969011EE900EC0060C61D /* Color.swift */, + 8429690E1EE900EC0060C61D /* View.swift */, + 842969071EE900EC0060C61D /* Label.swift */, + 842969051EE900EC0060C61D /* ImageView.swift */, + 842969001EE900EC0060C61D /* Button.swift */, + 8429690C1EE900EC0060C61D /* TextField.swift */, + 8429690D1EE900EC0060C61D /* TextView.swift */, + 842969091EE900EC0060C61D /* StaticTable.swift */, + 842968FE1EE900EC0060C61D /* Alert.swift */, + 842969081EE900EC0060C61D /* Stack.swift */, + 842969021EE900EC0060C61D /* Cons.swift */, + 8429690B1EE900EC0060C61D /* Styles.swift */, + 842969031EE900EC0060C61D /* CPKStackView.swift */, + 842968FD1EE900EC0060C61D /* __Privates__Implementation__.swift */, + ); + name = Cupcake; + path = ../../Cupcake; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 841B2C6D1E7BC5900084B37C /* Cupcake-Demo */ = { + isa = PBXNativeTarget; + buildConfigurationList = 841B2C801E7BC5900084B37C /* Build configuration list for PBXNativeTarget "Cupcake-Demo" */; + buildPhases = ( + 841B2C6A1E7BC5900084B37C /* Sources */, + 841B2C6B1E7BC5900084B37C /* Frameworks */, + 841B2C6C1E7BC5900084B37C /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Cupcake-Demo"; + productName = "Cupcake-Demo"; + productReference = 841B2C6E1E7BC5900084B37C /* Cupcake-Demo.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 841B2C661E7BC5900084B37C /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0820; + LastUpgradeCheck = 0820; + ORGANIZATIONNAME = nerdycat; + TargetAttributes = { + 841B2C6D1E7BC5900084B37C = { + CreatedOnToolsVersion = 8.2.1; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 841B2C691E7BC5900084B37C /* Build configuration list for PBXProject "Cupcake-Demo" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 841B2C651E7BC5900084B37C; + productRefGroup = 841B2C6F1E7BC5900084B37C /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 841B2C6D1E7BC5900084B37C /* Cupcake-Demo */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 841B2C6C1E7BC5900084B37C /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 84B599B91EB32CE3005ADDFB /* appList.plist in Resources */, + 841B2C7C1E7BC5900084B37C /* LaunchScreen.storyboard in Resources */, + 841B2C791E7BC5900084B37C /* Assets.xcassets in Resources */, + 841B2C771E7BC5900084B37C /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 841B2C6A1E7BC5900084B37C /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 842969201EE900EC0060C61D /* View.swift in Sources */, + 842969141EE900EC0060C61D /* Cons.swift in Sources */, + 84B599B51EB1FF6C005ADDFB /* EnhancementViewController.swift in Sources */, + 84B599B31EB1FF56005ADDFB /* BasicViewController.swift in Sources */, + 8429691E1EE900EC0060C61D /* TextField.swift in Sources */, + 8429691C1EE900EC0060C61D /* Str.swift in Sources */, + 842969171EE900EC0060C61D /* ImageView.swift in Sources */, + 8429691B1EE900EC0060C61D /* StaticTable.swift in Sources */, + 841B2C741E7BC5900084B37C /* ViewController.swift in Sources */, + 842ADB421EB9C53D0031B56C /* ExamplesViewController.swift in Sources */, + 8429691D1EE900EC0060C61D /* Styles.swift in Sources */, + 842969151EE900EC0060C61D /* CPKStackView.swift in Sources */, + 842969131EE900EC0060C61D /* Color.swift in Sources */, + 84CC7DF81EC94EC300817678 /* AppStoreViewController.swift in Sources */, + 842969191EE900EC0060C61D /* Label.swift in Sources */, + 8429691F1EE900EC0060C61D /* TextView.swift in Sources */, + 841B2C721E7BC5900084B37C /* AppDelegate.swift in Sources */, + 84B599B71EB32A9C005ADDFB /* StackViewController.swift in Sources */, + 842969121EE900EC0060C61D /* Button.swift in Sources */, + 842969111EE900EC0060C61D /* AttStr.swift in Sources */, + 842969161EE900EC0060C61D /* Font.swift in Sources */, + 8429690F1EE900EC0060C61D /* __Privates__Implementation__.swift in Sources */, + 8429691A1EE900EC0060C61D /* Stack.swift in Sources */, + 842969181EE900EC0060C61D /* Img.swift in Sources */, + 842969101EE900EC0060C61D /* Alert.swift in Sources */, + 84B599BB1EB334EA005ADDFB /* StaticViewController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 841B2C751E7BC5900084B37C /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 841B2C761E7BC5900084B37C /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 841B2C7A1E7BC5900084B37C /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 841B2C7B1E7BC5900084B37C /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 841B2C7E1E7BC5900084B37C /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 10.2; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 841B2C7F1E7BC5900084B37C /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 10.2; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 841B2C811E7BC5900084B37C /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = "Cupcake-Demo/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "nerdycat.Cupcake-Demo"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Debug; + }; + 841B2C821E7BC5900084B37C /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = "Cupcake-Demo/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "nerdycat.Cupcake-Demo"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 841B2C691E7BC5900084B37C /* Build configuration list for PBXProject "Cupcake-Demo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 841B2C7E1E7BC5900084B37C /* Debug */, + 841B2C7F1E7BC5900084B37C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 841B2C801E7BC5900084B37C /* Build configuration list for PBXNativeTarget "Cupcake-Demo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 841B2C811E7BC5900084B37C /* Debug */, + 841B2C821E7BC5900084B37C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 841B2C661E7BC5900084B37C /* Project object */; +} diff --git a/Cupcake-Demo/Cupcake-Demo.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Cupcake-Demo/Cupcake-Demo.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..4c44220 --- /dev/null +++ b/Cupcake-Demo/Cupcake-Demo.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + 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 new file mode 100644 index 0000000000000000000000000000000000000000..d314c1c3a4b636ac5c5204d664cddb6efcdff11f GIT binary patch literal 139875 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 literal 0 HcmV?d00001 diff --git a/Cupcake-Demo/Cupcake-Demo.xcodeproj/xcuserdata/admin.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/Cupcake-Demo/Cupcake-Demo.xcodeproj/xcuserdata/admin.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..fe2b454 --- /dev/null +++ b/Cupcake-Demo/Cupcake-Demo.xcodeproj/xcuserdata/admin.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,5 @@ + + + diff --git a/Cupcake-Demo/Cupcake-Demo.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/Cupcake-Demo.xcscheme b/Cupcake-Demo/Cupcake-Demo.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/Cupcake-Demo.xcscheme new file mode 100644 index 0000000..9ea478e --- /dev/null +++ b/Cupcake-Demo/Cupcake-Demo.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/Cupcake-Demo.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Cupcake-Demo/Cupcake-Demo.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/xcschememanagement.plist b/Cupcake-Demo/Cupcake-Demo.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..fc6bf52 --- /dev/null +++ b/Cupcake-Demo/Cupcake-Demo.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + Cupcake-Demo.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + 841B2C6D1E7BC5900084B37C + + primary + + + + + diff --git a/Cupcake-Demo/Cupcake-Demo/AppDelegate.swift b/Cupcake-Demo/Cupcake-Demo/AppDelegate.swift new file mode 100644 index 0000000..06c85a2 --- /dev/null +++ b/Cupcake-Demo/Cupcake-Demo/AppDelegate.swift @@ -0,0 +1,44 @@ +// +// AppDelegate.swift +// Cupcake-Demo +// +// Created by nerdycat on 2017/3/17. +// Copyright © 2017 nerdycat. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + func applicationWillResignActive(_ application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(_ application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(_ application: UIApplication) { + // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(_ application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(_ application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } +} + diff --git a/Cupcake-Demo/Cupcake-Demo/AppStoreViewController.swift b/Cupcake-Demo/Cupcake-Demo/AppStoreViewController.swift new file mode 100644 index 0000000..2348c75 --- /dev/null +++ b/Cupcake-Demo/Cupcake-Demo/AppStoreViewController.swift @@ -0,0 +1,100 @@ +// +// AppStoreViewController.swift +// Cupcake-Demo +// +// Created by nerdycat on 2017/5/15. +// Copyright © 2017 nerdycat. All rights reserved. +// + +import UIKit + +class AppStoreCell: UITableViewCell { + var iconView: UIImageView! + var actionButton: UIButton! + var indexLabel, titleLabel, categoryLabel: UILabel! + var ratingLabel, countLabel, iapLabel: UILabel! + + func update(app: Dictionary, index: Int) { + indexLabel.str(index + 1) + iconView.img(app["iconName"] as! String) + titleLabel.text = app["title"] as? String + categoryLabel.text = app["category"] as? String + countLabel.text = Str("(%@)", app["commentCount"] as! NSNumber) + iapLabel.isHidden = !(app["iap"] as! Bool) + + let rating = (app["rating"] as! NSNumber).intValue + var result = "" + for i in 0..<5 { result = result + (i < rating ? "★" : "☆") } + ratingLabel.text = result + + let price = app["price"] as! String + actionButton.str( price.characters.count > 0 ? "$" + price : "GET") + } + + func setupUI() { + indexLabel = Label.font(17).color("darkGray").align(.center).pin(.w(44)) + iconView = ImageView.pin(64, 64).radius(10).border(1.0 / UIScreen.main.scale, "#CCC") + + titleLabel = Label.font(15).lines(2) + categoryLabel = Label.font(13).color("darkGray") + + ratingLabel = Label.font(11).color("orange") + countLabel = Label.font(11).color("darkGray") + + actionButton = Button.font("15").color("#0065F7").border(1, "#0065F7").radius(3) + actionButton.highColor("white").highBg("#0065F7").padding(5, 10) + + iapLabel = Label.font(9).color("darkGray").lines(2).str("In-App\nPurchases").align(.center) + + let ratingStack = HStack(ratingLabel, countLabel).gap(5) + let midStack = VStack(titleLabel, categoryLabel, ratingStack).gap(4) + let actionStack = VStack(actionButton, iapLabel).gap(4).align(.center) + + HStack(indexLabel, iconView, 10, midStack, "<-->", 10, actionStack).embedIn(self.contentView, 10, 0, 10, 15) + } + + override init(style: UITableViewCellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + setupUI() + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + + +class AppStoreViewController: UITableViewController { + + var appList: Array>! + + override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + return UITableViewAutomaticDimension + } + + override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return appList.count + } + + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! AppStoreCell + let app = self.appList[indexPath.row] + cell.update(app: app, index: indexPath.row) + return cell + } + + override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + tableView.deselectRow(at: indexPath, animated: true) + } + + override func viewDidLoad() { + super.viewDidLoad() + + self.tableView.estimatedRowHeight = 84 + self.tableView.register(AppStoreCell.self, forCellReuseIdentifier: "cell") + + let path = Bundle.main.path(forResource: "appList", ofType: "plist") + appList = NSArray(contentsOfFile: path!) as? Array> + for _ in 1..<5 { appList.append(contentsOf: appList) } + } +} diff --git a/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppIcon.appiconset/Contents.json b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..b8236c6 --- /dev/null +++ b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,48 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/Contents.json b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/bitmoji.imageset/Bitmoji@2x.jpeg b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/bitmoji.imageset/Bitmoji@2x.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..17e5e7815dcdc6317e94992f692acd4c6611746a GIT binary patch literal 4648 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 AD*ylh literal 0 HcmV?d00001 diff --git a/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/bitmoji.imageset/Contents.json b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/bitmoji.imageset/Contents.json new file mode 100644 index 0000000..8117a99 --- /dev/null +++ b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/bitmoji.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Bitmoji@2x.jpeg", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/fivenights.imageset/Contents.json b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/fivenights.imageset/Contents.json new file mode 100644 index 0000000..c775aa8 --- /dev/null +++ b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/fivenights.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "fivehights@2x.jpeg", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/fivenights.imageset/fivehights@2x.jpeg b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/fivenights.imageset/fivehights@2x.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..0ba0a170c9ef5abdefac70d2f737833c5cedd053 GIT binary patch literal 11761 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 literal 0 HcmV?d00001 diff --git a/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/mario.imageset/Contents.json b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/mario.imageset/Contents.json new file mode 100644 index 0000000..2a3d688 --- /dev/null +++ b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/mario.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "mario@2x.jpeg", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/mario.imageset/mario@2x.jpeg b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/mario.imageset/mario@2x.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..ef526c2d0a328d3e0d539a67093f39daaac0aeea GIT binary patch literal 11576 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 EALIKTD*ylh literal 0 HcmV?d00001 diff --git a/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/messenger.imageset/Contents.json b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/messenger.imageset/Contents.json new file mode 100644 index 0000000..438fdbe --- /dev/null +++ b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/messenger.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "messenger@2x.jpeg", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/messenger.imageset/messenger@2x.jpeg b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/messenger.imageset/messenger@2x.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..4cee1932862c6a23d41bb39397dca5c4c012c225 GIT binary patch literal 5179 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 U!OT13VE2q8yG`q6*VX)g0UxV0yZ`_I literal 0 HcmV?d00001 diff --git a/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/snapchat.imageset/Contents.json b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/snapchat.imageset/Contents.json new file mode 100644 index 0000000..3bce919 --- /dev/null +++ b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/snapchat.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "snapchat@2x.jpeg", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/snapchat.imageset/snapchat@2x.jpeg b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/snapchat.imageset/snapchat@2x.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..eb698885438c1bf996cef3d2969d15cb492b0ee6 GIT binary patch literal 5317 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 QK)L#-?@sdH1KZvI11IIK%>V!Z literal 0 HcmV?d00001 diff --git a/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/youtube.imageset/Contents.json b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/youtube.imageset/Contents.json new file mode 100644 index 0000000..dd88e83 --- /dev/null +++ b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/youtube.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "youtube@2x.jpeg", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/youtube.imageset/youtube@2x.jpeg b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/AppStore/youtube.imageset/youtube@2x.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..00e8f0cb732f7d65b505a9400aa4bf2dd5c1e370 GIT binary patch literal 3282 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 O!2Nj*|CNn~YUV2sQR zi71Ki^|4CM&(%vz$xlkvtH>8?tx|+mh4pF`@A3=GUdo-U3d7J_RhS9=5p${atxx7h!A za%Y;Qs_=h-o-0aQYr5A@xzxcG#G~uYA^QJg@^9%n0gLxn_wOorFz@~Q-#_Qww|pMQl>3>X!TEdt%BIM*AG;=` zFaLc1{j`@4)n48{*2l5!(3?Y>!hbHlHc{=T!u1V1S_Gyy|JhT%c+;61i@qE=kY(1k z@S)$1%%fk~e!nQ%ad`#9)GE1q-+P?CTs^MPqt)uq{J4{+!#5)%Sgj-J)WUbA{O4K( zY*;E>B+hET{`k{WpyuO2t9jhpH$4e^`1wJ_s)z&5nG^q&yp(nn5VNuCYTYwu%L-!NwuzLMRX9gAHjMBQO9 zwhEr(J0bC=lv_K;;?oOuCJU?y>o~l@ce_c0X;CikrFr{bGuNePE)l!hd^2ZSUdzKp z57wvyr+=Xf(LQhvXc%T+URwo zTJ7~S?gH;sO(*Zy*PPgQ(;mx_(n~nOF7RJF1m}j&?8JhF?t$GBq?;EEEW2VhlgF<^389YmSt8@BFT8 zsJeGo&+y9n3;wUx9M+B~J2oS9R%Xuo-oip5)&H#iS>-IN?E8*@3K~yWKbLh*2~7a@ C*9kKK literal 0 HcmV?d00001 diff --git a/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Examples/dashboard.imageset/Contents.json b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Examples/dashboard.imageset/Contents.json new file mode 100644 index 0000000..fc1819a --- /dev/null +++ b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Examples/dashboard.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "dashboard.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Examples/dashboard.imageset/dashboard.png b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Examples/dashboard.imageset/dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..af05b1a1fcbb45bcff5ad845860f312bd0884a70 GIT binary patch literal 1956 zcmY*adpr|rAD`nALs&RX#msGyZRV28kn3D?Ih4!k9Bej=UE0PL-VEV&$Vx8lHC?%B3iscp`>Zow!4U?01s<-!jpU>xcp5OC(zQ6DH_kI3(GJTI@6oDE*005xq z?&j<--VMZ4T~~OgSP_!z~jhohf4zh62ZiPAV!e4mo=6`f`{WM5s`2f zi7EyH0BDxAI3z_f!XYeD44H1tvW0#@Sc~J`Gy)3w0%1hkLW8`0Ax;!pB*YwU21i2e zfDi}-O~c`>{heLEm5Wcd&?p9jYK=fJnM^p-6i%TL5GGbuRtO{tfkGLJ5ytehWJWm4 zm`vCCO7b5b=SVu1Mx-)`6f$I&H#~w8%dmw)cZI%>uYEFz`2Q-A>ECRL4I*}L5GHUW z;ybsv6uq0Z_Ms6Y#mc+jUSFH4+H36QBV0`~Ja-c3G7Fgq!OgNsj>Cs*3vOn%x~ zYTYPmSKU_fKIx}YWjq}$?WzNC5!ObblKc1giADt1RePxwfeSX+kJHi2kic3t`;h|H zCs`Pk@``QuROqy!RNQUqCFYj^Q7^G>LpNN79rYpm^71CIFeNegY+rWxN+8Ps>= z;fILyosLRHnKXV~OE;@^Z?kLEN(?VdRu>Xn;D1;_?y$bA)a8|$+wI(jcUOi|ASXZ* z!7asF-if32_|Gg*q$zgm85K5PF||hO;NMO^z^lCD@%mw7R_}%4-yHuuF3%a8sqvXg z45~R=2IuGzkq+}MkjI|C$zhVrC0*kSD(_}~%63GJavH~C6Zo^iF5}!xp&MPJu>L`L)0#$DF(J(2E#rH@nQBIZYm$8!gP_(pO>x}j=z-utB&5} zTDxcX$}mL4nwFAk&-fhB9&))b@1*)LZNtu$o8Pzpq22Uyow@PN^+2Cy#CX{J)L}~~ zj!YC*3iIsGpJQJl6e_6BDFLP2X>%G+o;Ma8sUH6Gbu|o~8$UNUI-r~C)k8PPZ#(uh z_g3e$hTteLNkKD!Ob0%t?Q}g^{@6Nd%*>mlyLzP8Dm^|C8L+m!&DRBOV$%uBmQB%2 z(T&Q+0oU;qx#ZGnAA=A)MnP|)wwd?Rmam-i0z5OOrbgh_L@cUgzSoz;>+9vG#GE}X zZ;uQE0kwZz3iLm>7}2#sKz3Izr~vB*j+B6aeLSoizDbCP+UfnBL~+(mBDuRa^0#1Y zdHHOCzNU2j1C~zG{6EWJ&Y)vIpSfA3P4d)x7SUVm*nX;KsTA!XVI_AdYiOswc(ALV zKI`j7zIB^8l&|>;4^A20FR?lRh7=uiy02MoUpw2J@W|gHkQHYK<@Wv1lWPLKt`!rk z{?qtR@ab80n(4gq-n7l$HX}lNmIv3X8EKFr zlW#beHH6xe{MO3^`{q#w%$ua1rPzGW@Hd3f&X!@&b6*@IGgi-X` zN)pv{UzUEW=?(B=K3a+MtPg5^XsML{(Tx~vte<@`upepa!s3wKvIUqNpn^l)8@#?G zZepTq*!t8peH#j=iYEt)!_R>$Cga&=#v+-{&K*^dM0PzRR3wa^=!c`N3Y(6~lz1L% z*<8eihX+Ivnnqq0uV z>tnc?g(3k{?cyOVQB#oDRGduu5;jf8acd;id`mI|SCqwN&z`hSs`1;u&sMps?J@Mn ztIPPr+VGd!c+T-MP<%Vbf0?c`V^3WX2ShK>rJy&1NR>Md{ym&(w;&t zFI8nA#4L0|K+&Bqh-_@MpPS~g;J>cCkrwq0%XK7pbkfxyTq-@5@Ud{LZ49qIR9x(X zx(q-mdZves`(D&T$dx~cc=rO9?{OyaxQKg4anJ|E{u$%dBfG(1rltI=k1n&m_Of50 zGX_zYx4e@HY6Hy7%$!rq1$4w$NfSNQ@-i?+Saked61Jk=TXSe816;o@rE;gxkWOZ? i1h?+Li|Z{+6dmx~JRNiJHal|nGj(@4?p)&-mhx{7pKSjC literal 0 HcmV?d00001 diff --git a/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Examples/entities.imageset/Contents.json b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Examples/entities.imageset/Contents.json new file mode 100644 index 0000000..62bc7fc --- /dev/null +++ b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Examples/entities.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "entities.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Examples/entities.imageset/entities.png b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Examples/entities.imageset/entities.png new file mode 100644 index 0000000000000000000000000000000000000000..b2898119a60a3eb2d78020e8e3dbccaca7038751 GIT binary patch literal 891 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 literal 0 HcmV?d00001 diff --git a/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Examples/shubox.imageset/Contents.json b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Examples/shubox.imageset/Contents.json new file mode 100644 index 0000000..ee77309 --- /dev/null +++ b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Examples/shubox.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "shubox.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Examples/shubox.imageset/shubox.png b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Examples/shubox.imageset/shubox.png new file mode 100644 index 0000000000000000000000000000000000000000..f1d189765bdcb60c21db5cce3045eddd9114d434 GIT binary patch literal 140424 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%0Dhnqz%eaR__G&l+1=|4ic0!ONE!v8{-Qo2-NMG=y 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 IfARkR0gz-(CIA2c literal 0 HcmV?d00001 diff --git a/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Settings/Contents.json b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Settings/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Settings/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Settings/airplane.imageset/Contents.json b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Settings/airplane.imageset/Contents.json new file mode 100644 index 0000000..ca09572 --- /dev/null +++ b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Settings/airplane.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "airplane.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Settings/airplane.imageset/airplane.png b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Settings/airplane.imageset/airplane.png new file mode 100644 index 0000000000000000000000000000000000000000..f05a1a554200896c4eb0641de7323f3aeea84e9f GIT binary patch literal 3022 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 literal 0 HcmV?d00001 diff --git a/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Settings/display.imageset/Contents.json b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Settings/display.imageset/Contents.json new file mode 100644 index 0000000..c20c203 --- /dev/null +++ b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Settings/display.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "display.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Settings/display.imageset/display.png b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Settings/display.imageset/display.png new file mode 100644 index 0000000000000000000000000000000000000000..3adcb73d8d74b6064d087be8ab3a8ed002bf9e3d GIT binary patch literal 2844 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 literal 0 HcmV?d00001 diff --git a/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Settings/disturb.imageset/Contents.json b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Settings/disturb.imageset/Contents.json new file mode 100644 index 0000000..f76f483 --- /dev/null +++ b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Settings/disturb.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "disturb.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Settings/disturb.imageset/disturb.png b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Settings/disturb.imageset/disturb.png new file mode 100644 index 0000000000000000000000000000000000000000..a279475e9c4aaa83b7073b5b1ba4952b65b87e71 GIT binary patch literal 2858 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 literal 0 HcmV?d00001 diff --git a/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Settings/wlan.imageset/Contents.json b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Settings/wlan.imageset/Contents.json new file mode 100644 index 0000000..4dbdf2f --- /dev/null +++ b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Settings/wlan.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "wlan.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Settings/wlan.imageset/wlan.png b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/Settings/wlan.imageset/wlan.png new file mode 100644 index 0000000000000000000000000000000000000000..75fa53e93530a832452daf4fa37795b13406aa36 GIT binary patch literal 3171 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 literal 0 HcmV?d00001 diff --git a/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/cat.imageset/Contents.json b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/cat.imageset/Contents.json new file mode 100644 index 0000000..4064081 --- /dev/null +++ b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/cat.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "cat.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/cat.imageset/cat.png b/Cupcake-Demo/Cupcake-Demo/Assets.xcassets/cat.imageset/cat.png new file mode 100644 index 0000000000000000000000000000000000000000..8a467814e886cb0e71bf705c832fb9e13a53d378 GIT binary patch literal 1593 zcmZ8gdpJ~S93D~btV@beJwKVAfU#f!Ltz>f(X=zV56}aagku~!0 zto0+eUvj;UUJkJ;ptWw{ z59#KRdpgOzFt`)}MCpep13b!L4`rwi5Wx@t!~MXU0pKkw^X)&tC?{)lkUA=)jt^1a zi>MQ?sgvC~(<8LmceJ@t+J`aP{CnER3Hql=`r;^Yaf<$BhQ1`Ge}yqiU!DP$=PFmk zz{*_Zw|^_Y!QqC9_FZPF_hxRb6AV)|PF$+js5$*~r+;{DAdA zTO`WC+0Db#+ZPuQ6dr+(ii=N3zMYc#C?~J*3E>$)udHI!)Hbz%oX)OZLH{e^(3_EW zW8)K(Q`0lzkBgtbF0X!zW9pc|m)X)8Y45RBTio(FK+#Wk(+9_jd_n)~-`mUcYff36 z6YHs6O0KQ|_UZ$_V%p?t9JzDD6A2G|@XoXQLRKagT5f!At@~5hq|vbBlCNQG?Nwb_ z&E<;Fr{|I$Yq|*0?H80(1DaOv{gH@e#nO`^8tn@2m7<@BGQ5-a85&RD@z`i^!ZA}H z*1tNN z77fN4a1=3%(J58=*|mh^jG|zG5wh7NI2n2UROjX3M~rwigNrgK#a=^W3|}s7{&x1s z;0M7=J5GXf>5Gr8c_>AlooA2mE#(KzG1$B6mbVC2y+kiYk(&CLmC4H@<&v@cd$+4T z)-vdEDqyAVEmMux98)uqE`DTDeEQ*bLXA1V=UiQ1zS?>dpp(JY0E+MtT1MNldo}d zpsmQqF8<3tQASEBTfd?1Vt&qq{~6WY#>LeIWiAVSr)|7%l}Jh1)F-lRzMZG9nAD?j_2B9V~THTkGD`WGbf=u;&s9k%2B`k@k7LgPxk2wL^AF0joW8E zp#i~u-;HijSm?3wT*d*E71#c>n&n5ImlR-9Ue;h+ZmF_Cc;A&H)t1aHLrS!<3j!6# z!wN<#p*c*#Phz8j<}B(twAl%*lY2a6b9cJh)oXf9+x73S#)ovpZJ+eMP|d&-FNKCh fI-OPfwp?%&bKz=go + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Cupcake-Demo/Cupcake-Demo/Base.lproj/Main.storyboard b/Cupcake-Demo/Cupcake-Demo/Base.lproj/Main.storyboard new file mode 100644 index 0000000..53d73e0 --- /dev/null +++ b/Cupcake-Demo/Cupcake-Demo/Base.lproj/Main.storyboard @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Cupcake-Demo/Cupcake-Demo/BasicViewController.swift b/Cupcake-Demo/Cupcake-Demo/BasicViewController.swift new file mode 100644 index 0000000..1e60506 --- /dev/null +++ b/Cupcake-Demo/Cupcake-Demo/BasicViewController.swift @@ -0,0 +1,60 @@ +// +// BasicViewController.swift +// Cupcake-Demo +// +// Created by nerdycat on 2017/4/27. +// Copyright © 2017 nerdycat. All rights reserved. +// + +import UIKit + +class BasicViewController: BaseViewController { + + override func setupUI() { + + //View + let box = View.bg("red").pin(20, 20, 50, 50).border(4).onClick({ _ in + print("box") + }) + + let circle = View.bg("blue").makeCons({ + $0.left.top.equal(box).right.top.offset(20, 0) + $0.size.equal(50, 50) + }).radius(-1).shadow(0.7) + + + //Label + let label = Label.str("This is a normal Label.").font(17).color("66,66,66").pin(.xy(20, 100)) + + var att = AttStr("This is an attributed Label.").font(17).color("#3A3A3A") + att.select("attributed Label").underline().select(.range(8, 2)).color("red") + + let attLabel = Label.str(att).pin(.xy(20, 130)) + + + //ImageView + let candle = ImageView.img("candle").pin(.xy(20, 180)) + let tintedCandle = ImageView.img("$candle").tint("#86BD5B").pin(.xy(70, 180)) + + + //Button + let done = Button.str("Done").padding(5, 10).bg("red").highBg("blue").pin(.xy(20, 260)).radius(6) + + att = AttStr("Friends\n1024").font(13).select(.number).font("17") + + let friends = Button.str(att).border(1).highBg("darkGray,0.2").makeCons({ + $0.left.centerY.equal(done).right.centerY.offset(20, 0) + }).padding(10).lines() + + let more = Button.str("More").img("arrow").color("black").gap(5).reversed().makeCons({ make in + make.left.centerY.equal(friends).right.centerY.offset(20, 0) + }).onClick({ _ in + Alert.title("Alert").message("You just clicked the button.").action("OK").show() + }).touchInsets(-20) + + self.view.addSubviews(box, circle, label, attLabel, candle, tintedCandle, done, friends, more) + } +} + + + diff --git a/Cupcake-Demo/Cupcake-Demo/EnhancementViewController.swift b/Cupcake-Demo/Cupcake-Demo/EnhancementViewController.swift new file mode 100644 index 0000000..5a416b5 --- /dev/null +++ b/Cupcake-Demo/Cupcake-Demo/EnhancementViewController.swift @@ -0,0 +1,67 @@ +// +// EnhancementViewController.swift +// Cupcake-Demo +// +// Created by nerdycat on 2017/4/27. +// Copyright © 2017 nerdycat. All rights reserved. +// + +import UIKit + +class EnhancementViewController: BaseViewController { + + override func setupUI() { + + //Label with lineSpacing and link + let str = "With #Cupcake, @Label now support lineSpacing and Link handing. Additionally, @TextField and @TextView both have the abilities to set max length and placeholder. " + + let attStr = AttStr(str).select("Link handing", .hashTag, .nameTag).link() + + let label = Label.str(attStr).lineGap(10).lines().onLink({ text in + print(text) + }).embedIn(self.view, 15, 15, 15) + + + //TextField with maxLength + let nameField = TextField.pin(40).padding(0, 8).border(1).maxLength(5).hint("normal") + let codeField = TextField.pin(40).padding(0, 8).border(1).maxLength(4).hint("secure").keyboard(.numberPad).secure() + + nameField.makeCons({ make in + make.top.equal(label).bottom.offset(20) + make.left.offset(15) + + }).onFinish({ _ in + codeField.becomeFirstResponder() + }) + + codeField.makeCons({ make in + make.top.equal(nameField) + make.left.equal(nameField).right.offset(10) + make.right.offset(-15) + make.width.equal(nameField) + + }).onChange({ [unowned self] codeField in + if codeField.text?.characters.count == 4 { + self.view.viewWithTag(101)?.becomeFirstResponder() + } + }) + + + //TextView with placeholder and maxLength + let textView = TextView.padding(8).maxLength(40).border(1).makeCons({ make in + make.left.right.offset(15, -15) + make.top.equal(nameField).bottom.offset(10) + make.height.equal(100) + }).hint("comment") + + textView.tag = 101 + self.view.addSubviews(nameField, codeField, textView) + + self.view.onClick({ view in + view.endEditing(true) + }) + } +} + + + diff --git a/Cupcake-Demo/Cupcake-Demo/ExamplesViewController.swift b/Cupcake-Demo/Cupcake-Demo/ExamplesViewController.swift new file mode 100644 index 0000000..0a6eeb2 --- /dev/null +++ b/Cupcake-Demo/Cupcake-Demo/ExamplesViewController.swift @@ -0,0 +1,183 @@ +// +// ExamplesViewController.swift +// Cupcake-Demo +// +// Created by nerdycat on 2017/5/3. +// Copyright © 2017 nerdycat. All rights reserved. +// + +import UIKit + + +class ExamplesViewController: BaseViewController { + + override func setupUI() { + let titles = ["Signup", "Shubox", "Dashboard", "AppStore"] + + PlainTable(titles).embedIn(self.view).onClick({ [unowned self] row in + var target: UIViewController! + + switch row.indexPath.row { + case 0: target = SignupViewController() + case 1: target = ShuboxViewController() + case 2: target = DashboardViewController() + case 3: target = AppStoreViewController() + default: break + } + + target.title = row.cell.textLabel?.text + self.push(target) + }) + } +} + + + +class SignupViewController: BaseViewController { + + override func setupUI() { + //https://dribbble.com/shots/3346069-001-Log-in-Sing-up + + self.view.bg("#184367") + + let iphone5 = UIScreen.main.bounds.width == 320 + let card = View.bg("white").radius(4).embedIn(self.view, iphone5 ? 40 : 60, 30) + + let inputStyle = Styles.pin(40, .lowHugging).font(14) + Styles("ruler").bg("#C7C7CD").pin(1) + + let name = Label.str("FULL NAME").font(17) + let nameField = TextField.hint("Enter your full name").maxLength(15).styles(inputStyle) + let line1 = View.styles("ruler") + + let email = Label.str("E-MAIL").font(17) + let emailField = TextField.hint("Your E-mail goes here").keyboard(.emailAddress).styles(inputStyle) + let line2 = View.styles("ruler") + + let pw = Label.str("Password").font(17) + let pwField = TextField.hint("Enter your password").maxLength(10).secure().styles(inputStyle) + let line3 = View.styles("ruler") + + let statement = Label.str("☑️ I agree all statements in").color("lightGray").font(12) + let term = Button.str( AttStr("Terms of service").color("#8DD6E5").font("12").underline() ).margin(0, -22) + + let login = Button.str("LOG IN").font(15).bg("#4A96E3").pin(44, .lowHugging).radius(4) + + VStack(name, nameField, line1, 30, email, emailField, line2, 30, + pw, pwField, line3, 30, statement , term, "<-->", login).embedIn(card, iphone5 ? 30: 50, 30, 30, 30) + + + Button.str("X").font(13).color("#D2E0E8").bg("#EDF2F5").radius(-1).pin(16, 16, .maxX(-10), .y(10)).addTo(card) + Button.str("HELP").font(13).padding(10).pin(.centerX(0), .maxY(-5)).addTo(self.view) + } + + override func touchesBegan(_ touches: Set, with event: UIEvent?) { + self.view.endEditing(true) + } +} + + + +class ShuboxViewController: BaseViewController { + + override func setupUI() { + //https://dribbble.com/shots/3462307-Responsive-Shubox + + let logo = Label.str("Shubox").color("#FC6560").font("30") + + let navStyle = Styles.color("darkGray").highColor("red").font(15) + Styles("btn").color("#FC6560").highColor("white").highBg("#FC6560").font("15").padding(12, 30).border(3, "#FC6560").radius(-1) + + let pricing = Button.str("Pricing").styles(navStyle) + let docs = Button.str("Docs").styles(navStyle) + let demos = Button.str("Demos").styles(navStyle) + let blog = Button.str("Blog").styles(navStyle) + let signIn = Button.str("Sign In").styles(navStyle).color("#FC6560") + + let nav = HStack(pricing, docs, demos, blog, signIn).gap(15) + + let simpleFast = Label.str("Simple. Fast. \nCustomizable.").color("#7C60CE").font("30").lines().align(.center) + let upload = Label.str("Upload images from your web app directly to Amazon S3.").color("#BE9FDE").font(15).lines().align(.center) + + let startTrial = Button.str("Start Your Free Trial").styles("btn") + let image = ImageView.img("shubox").pin(.ratio) + + let items: [Any] = [logo, 15, nav, 45, simpleFast, 15, upload, 30, startTrial, "<-->", image] + VStack(items).align(.center).embedIn(self.view, 10, 15, 0, 15) + } +} + + + +class DashboardViewController: BaseViewController { + + class DashButton: UIButton { + let subtitle: String! + + override func setTitle(_ title: String?, for state: UIControlState) { + if state == .normal { + let att = AttStr( + AttStr(title).font("18").color("#181D42"), "\n", + AttStr(subtitle).font(11).color("darkGray") + ).lineGap(3).align(.center) + self.str(att) + } else { + super.setTitle(title, for: state) + } + } + + init(_ subtitle: String) { + self.subtitle = subtitle + super.init(frame: CGRect.zero) + self.pin(.lowHugging, 80).lines().gap(15).highBg("lightGray,0.2") + self.adjustsImageWhenHighlighted = false + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + } + + override func setupUI() { + //https://dribbble.com/shots/3441336-Mobile-dashboard-items-list-light-design + + let logo = ImageView.img("dashboard") + let profile = Button.img("customers") + let header = HStack(logo, "<-->", profile) + + let welcome = Label.str("Welcome back,\nAndrew").font(18).color("darkGray").lines(2) + + let number = Label.str(83).font("AvenirNext-Bold,90").color("#181D42") + let dash = View.pin(12, 3).bg("#DE2F43").radius(-1) + let jobsites = Label.str("Jobsites\nrequests").font(13).color("darkGray").lines(2) + let requests = HStack(number, 20, VStack(dash, 3, jobsites)).align(.baseline) + + let jobBtn = DashButton("Jobsites").img("jobsites").str(346) + let requestsBtn = DashButton("Requests").img("requests").str(83) + let customersBtn = DashButton("Customers").img("customers").str(12) + + let entitiesBtn = DashButton("Entities").img("entities").str(22).makeCons({ + $0.width.equal(jobBtn) + $0.width.equal(requestsBtn) + $0.width.equal(customersBtn) + }) + + let tiles = View.margin(0, 10) + VStack(HStack(jobBtn, requestsBtn), HStack(customersBtn, entitiesBtn)).embedIn(tiles) + + VStack(header, 30, welcome, 15, requests, 40, tiles).embedIn(self.view, 30, 30, 30) + + let horLine = View.bg("lightGray,0.4").pin(1).makeCons({ + $0.left.bottom.equal(jobBtn) + $0.width.equal(jobBtn).multiply(2) + }) + + let verLine = View.bg("lightGray,0.4").pin(.w(1)).makeCons({ + $0.top.right.equal(jobBtn) + $0.height.equal(jobBtn).multiply(2) + }) + + self.view.addSubviews(horLine, verLine) + } +} + diff --git a/Cupcake-Demo/Cupcake-Demo/Info.plist b/Cupcake-Demo/Cupcake-Demo/Info.plist new file mode 100644 index 0000000..93b96dc --- /dev/null +++ b/Cupcake-Demo/Cupcake-Demo/Info.plist @@ -0,0 +1,36 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + + + diff --git a/Cupcake-Demo/Cupcake-Demo/StackViewController.swift b/Cupcake-Demo/Cupcake-Demo/StackViewController.swift new file mode 100644 index 0000000..ecc77cf --- /dev/null +++ b/Cupcake-Demo/Cupcake-Demo/StackViewController.swift @@ -0,0 +1,63 @@ +// +// StackViewController.swift +// Cupcake-Demo +// +// Created by nerdycat on 2017/4/28. +// Copyright © 2017 nerdycat. All rights reserved. +// + +import UIKit + +class StackViewController: BaseViewController { + + var stack: CPKStackView! + + func randomView() -> UIView { + let width = CGFloat(arc4random_uniform(30) + 20) + let height = CGFloat(arc4random_uniform(30) + 20) + let view = View.bg("random").pin(.wh(width, height)).onClick({ + $0.removeFromSuperview() + }) + return view + } + + func setupButtons() { + let s = Styles.padding(3, 5).bg("red").font(15) + + let addView = Button.styles(s).str("add").onClick({[unowned self] _ in + self.stack.addArrangedSubview(item: self.randomView()) + }) + + let attachGap = Button.styles(s).str("attachGap").onClick({[unowned self] _ in + self.stack.addArrangedSubview(item: arc4random_uniform(30)) + }) + + let gap = Button.styles(s).str("gap").onClick({[unowned self] _ in + self.stack.spacing = CGFloat(arc4random_uniform(30)) + }) + + let align = Button.styles(s).str("align").onClick({[unowned self] _ in + var next = self.stack.alignment.rawValue + 1 + if next > 2 { next = 0 } + let alignment = CPKStackAlignment(rawValue: next)! + self.stack.alignment = alignment + }) + + let axis = Button.styles(s).str("axis").onClick({[unowned self] _ in + self.stack.axis = self.stack.axis == .vertical ? .horizontal : .vertical + }) + + HStack("<-->", addView, attachGap, gap, align, axis, "<-->").gap(8).embedIn(self.view, nil, 0, 0, 0) + } + + override func setupUI() { + super.setupUI() + + Label.str("click view to remove").font(15).color("lightGray").align(.center).embedIn(self.view, 10, 0, 0) + stack = VStack(randomView()).border(1).pin(.center).addTo(self.view) + + setupButtons() + } +} + + diff --git a/Cupcake-Demo/Cupcake-Demo/StaticViewController.swift b/Cupcake-Demo/Cupcake-Demo/StaticViewController.swift new file mode 100644 index 0000000..e96e0c7 --- /dev/null +++ b/Cupcake-Demo/Cupcake-Demo/StaticViewController.swift @@ -0,0 +1,282 @@ +// +// StaticViewController.swift +// Cupcake-Demo +// +// Created by nerdycat on 2017/4/28. +// Copyright © 2017 nerdycat. All rights reserved. +// + +import UIKit + +class StaticViewController: BaseViewController { + + override func setupUI() { + weak var weakSelf = self + + GroupTable( + Section( + Row.img("airplane").str("Airplane Mode").switchOn(false).onChange({ row in + print(row.switchView.isOn) + }), + Row.img("wlan").str("WLAN").detail("Not connected").arrow().onClick({ _ in + weakSelf?.push(WLANViewController()) + }), + Row.img("disturb").str("Do Not Disturb").arrow().onClick({ _ in + weakSelf?.push(DisturbViewController()) + }) + ), + + Section( + Row.img("general").str("General").arrow().custom({ row in + let badge = Button.pin(22, 22, .maxX(-5), .centerY(0)).radius(-1).str("1").font(14).bg("red") + badge.isUserInteractionEnabled = false + row.cell.contentView.addSubview(badge) + }).onClick({ _ in + weakSelf?.push(GeneralViewController()) + }), + Row.img("display").str("Display & Brightness").arrow().onClick({ _ in + + }).onClick({ _ in + weakSelf?.push(DisplayViewController()) + }) + ) + + ).embedIn(self.view) + } +} + + +class WLANViewController: BaseViewController { + override func setupUI() { + let footer = "Known networks will be joined automatically. If no known networks are available, you will have to manually select a network." + + GroupTable( + Section( + Row.str("WLAN").switchOn().onChange({ row in + print(row.switchView.isOn) + }) + ), + + Section( + Row.str("Wireless 1").detail("\u{0001F512} \u{268C}").accessory(.detailButton).onButton({ _ in + Alert.title("Wireless 1").message("detail button tapped").action("OK").show() + }).onClick({ _ in + print("Wireless 1") + }), + + Row.str("Wireless 2").detail("\u{0001F513} \u{2630}").accessory(.detailButton).onButton({ _ in + Alert.title("Wireless 2").message("detail button tapped").action("OK", { + print("OK") + }).cancel("Cancel").show() + }).onClick({ _ in + print("Wireless 2") + }) + ).header("CHOOSE A NETWORK..."), + + Section( + Row.str("Ask to Join Networks").switchOn(false).onChange({ row in + print(row.switchView.isOn) + }) + ).footer(footer) + ).embedIn(self.view) + } +} + + +class DisturbViewController: BaseViewController { + override func setupUI() { + + let footer1 = "When Do Not Disturb is enabled calls and alerts that arrive while locked will be silenced, and a moon icon will appear in the status bar." + let footer2 = "Incoming calls and notifications will be silenced while iPhone is either locked or unlocked." + + GroupTable( + Section( + Row.str("Manual").switchOn(false).onChange({ row in + print(row.switchView.isOn) + }) + ).footer(footer1), + + Section( + Row.str("Always").check().onClick({ _ in + print("always") + }), + Row.str("Only while iPhone is locked").onClick({ _ in + print("only locked") + }) + ).singleCheck().header("SILENCE:").footer(footer2) + + ).embedIn(self.view) + } +} + + +class GeneralViewController: BaseViewController { + var table: StaticTableView! + + override func setupUI() { + weak var weakSelf = self + + table = GroupTable( + Section( + Row.str("Name").arrow().onClick({ _ in + weakSelf?.push(NameViewController()) + }) + ), + Section( + Row.str("Software Update").arrow().onClick({ _ in + weakSelf?.push(UpdateViewController()) + }) + ) + ).embedIn(self.view) + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + table.update(detail: NameViewController.name, at: IndexPath(row: 0, section: 0)) + } +} + + +class DisplayViewController: BaseViewController { + var autoLockRow: StaticRow! + + override func setupUI() { + autoLockRow = Row.str("Auto-Lock").detail("").arrow().onClick({ [unowned self] _ in + self.push(AutoLockViewController()) + }) + + GroupTable( + Section( + Row.custom({ row in + let slider = UISlider().embedIn(row.cell.contentView, 0, 15) + slider.minimumValueImage = Img("$candle").resize(0.5) + slider.maximumValueImage = Img("$candle").resize(0.7) + }) + ).header("BRIGHTNESS"), + + Section(autoLockRow) + ).embedIn(self.view) + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + autoLockRow.detail(AutoLockViewController.selectedOption()) + } +} + + +class NameViewController: BaseViewController { + static var name = "My-iPhone" + var textField: UITextField! + + override func setupUI() { + let name = NameViewController.name + + GroupTable( + Row.custom({ row in + self.textField = TextField.str(name).hint(name).clearMode(.whileEditing).onFinish({ [unowned self] textField in + NameViewController.name = textField.text ?? "" + self.navigationController!.popViewController(animated: true) + }).embedIn(row.cell.contentView, 0, 15) + }) + ).embedIn(self.view) + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + textField.becomeFirstResponder() + } +} + + +class UpdateViewController: BaseViewController { + override func setupUI() { + let desc = "iOS 10.3.1 introduces new features including the ability to locate AirPods using Find my iPhone and more ways to use Siri with payment, ride booking and automaker apps.\n\nFor information on the security content of Apple software update, please visit this website: https://support.apple.com/kb/HT201222" + + let attDesc = AttStr(desc).font(15).select(.url).link() + + GroupTable( + Section( + Row.custom({ row in + let icon = ImageView.pin(60, 60).img("general") + let title = Label.str("iOS 10.3.1").font("15") + let cops = Label.str("Apple Inc.").font(13) + let status = Label.str("Downloaded").font(13) + + let desc = Label.str(attDesc).lines().onLink({ text in + print(text) + }) + + VStack( + HStack( icon, VStack(title, cops, status).gap(2) ).gap(10), + 12, + desc + ).embedIn(row.cell.contentView, 10, 15) + }).height(-1), + + Row.str("Learn More").arrow().onClick({ _ in + print("learn more") + }) + ), + + Section( + Row.str(AttStr("Install Now").color("#157EFB")).onClick({ _ in + print("install") + }) + ) + ).embedIn(self.view) + } +} + + +class AutoLockViewController: BaseViewController { + static let options = ["30 Seconds", "1 Minute", "2 Minutes", "3 Minutes", "4 Minutes", "Never"] + static var optionIndex = 1 + + var tableView: StaticTableView! + + class func selectedOption() -> String { + return options[optionIndex] + } + + override func setupUI() { + tableView = GroupTable( + Section(AutoLockViewController.options).singleCheck() + ).custom({ row in + if row.indexPath.row == AutoLockViewController.optionIndex { + row.check() + } + }).embedIn(self.view) + } + + override func viewWillDisappear(_ animated: Bool) { + super.viewWillAppear(animated) + AutoLockViewController.optionIndex = tableView.checkedIndexPaths.first!.row + } +} + + +class BaseViewController: UIViewController { + + func push(_ vc: UIViewController) { + self.navigationController?.pushViewController(vc, animated: true) + } + + func setupUI() { + + } + + override func viewDidLoad() { + super.viewDidLoad() + self.view.backgroundColor = .white + setupUI() + } +} + + + + + + + + diff --git a/Cupcake-Demo/Cupcake-Demo/ViewController.swift b/Cupcake-Demo/Cupcake-Demo/ViewController.swift new file mode 100644 index 0000000..53d5484 --- /dev/null +++ b/Cupcake-Demo/Cupcake-Demo/ViewController.swift @@ -0,0 +1,40 @@ +// +// ViewController.swift +// Cupcake-Demo +// +// Created by nerdycat on 2017/3/17. +// Copyright © 2017 nerdycat. All rights reserved. +// + +import UIKit + +class ViewController: BaseViewController { + + override func setupUI() { + self.title = "Cupcake" + + let titles = ["Basic", "Enhancement", "Stack", "StaticTable", "Examples"] + + PlainTable(titles).embedIn(self.view).onClick({ [unowned self] row in + var target: UIViewController! + + switch row.indexPath.row { + case 0: target = BasicViewController() + case 1: target = EnhancementViewController() + case 2: target = StackViewController() + case 3: target = StaticViewController() + case 4: target = ExamplesViewController() + default: break + } + + target.title = row.cell.textLabel?.text + self.push(target) + }) + } +} + + + + + + diff --git a/Cupcake-Demo/Cupcake-Demo/appList.plist b/Cupcake-Demo/Cupcake-Demo/appList.plist new file mode 100644 index 0000000..a4307e5 --- /dev/null +++ b/Cupcake-Demo/Cupcake-Demo/appList.plist @@ -0,0 +1,118 @@ + + + + + + iconName + mario.jpeg + title + Super Mario Run + category + Games + rating + 3 + commentCount + 6053 + price + + iap + + + + iconName + bitmoji.jpeg + title + Bitmoji - Your Personal Emoji + category + Utilities + rating + 4 + commentCount + 11 + price + + iap + + + + iconName + messenger.jpeg + title + Messenger + category + Social Netowrking + rating + 3 + commentCount + 2052 + price + + iap + + + + iconName + youtube.jpeg + title + YouTube - Watch and Share Videos, Music & Clips Support + category + Photo & Video + rating + 3.5 + commentCount + 38 + price + + iap + + + + iconName + snapchat.jpeg + title + Snapchat + category + Photo & Video + rating + 3 + commentCount + 33 + price + + iap + + + + iconName + fivenights.jpeg + title + Five Nights at Freddy's: Sister Location Support + category + Games + rating + 4.5 + commentCount + 814 + price + 2.99 + iap + + + + iconName + minecraft.jpeg + title + Minecraft: Pocket Edition Support + category + Games + rating + 4.5 + commentCount + 869 + price + 0.99 + iap + + + + diff --git a/Cupcake.podspec b/Cupcake.podspec new file mode 100644 index 0000000..864e558 --- /dev/null +++ b/Cupcake.podspec @@ -0,0 +1,21 @@ +Pod::Spec.new do |s| + + s.name = "Cupcake" + s.version = "0.1.0" + s.summary = "An easy way to create and layout UI components for iOS." + + s.description = <<-DESC + An easy way to create and layout UI components for iOS. Written in Swift. + DESC + + s.homepage = "https://github.com/nerdycat/Cupcake" + s.license = "MIT" + s.author = { "nerdycat" => "nerdymozart@gmail.com" } + + s.platform = :ios, "8.0" + s.source = { :git => "https://github.com/nerdycat/Cupcake.git", :tag => "#{s.version}" } + s.requires_arc = true + + s.source_files = "Cupcake/*.swift" + +end diff --git a/Cupcake/Alert.swift b/Cupcake/Alert.swift new file mode 100644 index 0000000..02e962b --- /dev/null +++ b/Cupcake/Alert.swift @@ -0,0 +1,120 @@ +// +// Alert.swift +// Cupcake +// +// Created by nerdycat on 2017/3/28. +// Copyright © 2017 nerdycat. All rights reserved. +// + +import UIKit + +/** + * An easy way to Create Alert and ActionSheet. + * Usages: + + Alert.title("Title").message("Message go here").cancel("Cancel").action("OK", { + print("OK") + }).show() + + ActionSheet.title("Title").message("Message go here").action("Action1", { + print("Action1") + }).action("Action2", { + print("Action2") + }).destructive("Delete", { + print("Delete") + }).cancel("Cancel").show() + */ + +public var Alert: AlertMaker { + return AlertMaker(style: .alert) +} + +public var ActionSheet: AlertMaker { + return AlertMaker(style: .actionSheet) +} + + +public extension AlertMaker { + + /** + * Setting Alert/ActionSheet title + * Usages: + .title("Title") + */ + @discardableResult public func title(_ title: Any) -> Self { + self.cpkTitle = title + return self + } + + /** + * Setting Alert/ActionSheet message + * Usages: + .message("Message go here") + */ + @discardableResult public func message(_ message: Any) -> Self { + self.cpkMessage = message + return self + } + + /** + * Setting tintColor + * tint use Color() internally, so it can take any kind of values that Color() supported. + * See Color.swift for more information. + * Usages: + .tint("red") + .tint("#00F") + ... + */ + @discardableResult public func tint(_ tint: Any) -> Self { + self.cpkTint = tint + return self + } + + /** + * Adding action button with title and a optional callback handler. + * You can have multiply action button at the same time. + * Usages: + .action("Option1") + .action("Option2", { /* do something */ }) + */ + @discardableResult public func action(_ title: Any, _ callback: (()->())? = nil) -> Self { + self.cpk_addAction(style: .default, title: title, handler: callback) + return self + } + + /** + * Adding cancel button with title and a optional callback handler. + * You can only have one cancel button. + * Usages: + .cancel("Cancel") + .cancel("Cancel", { /* do something */ } + */ + @discardableResult public func cancel(_ title: Any, _ callback: (()->())? = nil) -> Self { + self.cpk_addAction(style: .cancel, title: title, handler: callback) + return self + } + + /** + * Adding destructive button with title and a optional callback handler. + * You can have multiply action button at the same time. + * Usages: + .destructive("Delete") + .destructive("Delete", { /* do someting */ } + */ + @discardableResult public func destructive(_ title: Any, _ callback: (()->())? = nil) -> Self { + self.cpk_addAction(style: .destructive, title: title, handler: callback) + return self + } + + /** + * Present Alert/ActionSheet + * You must call this method in the end to make Alert/ActionSheet visible. + * Usages: + .show() //present in the top visible controller + .show(someController) //present in someController + */ + public func show(_ inside: UIViewController? = nil) { + self.cpk_present(inside) + } +} + diff --git a/Cupcake/AttStr.swift b/Cupcake/AttStr.swift new file mode 100644 index 0000000..3503003 --- /dev/null +++ b/Cupcake/AttStr.swift @@ -0,0 +1,359 @@ +// +// AttStr.swift +// Cupcake +// +// Created by nerdycat on 2017/3/17. +// Copyright © 2017 nerdycat. All rights reserved. +// + +import UIKit + +/** + * Create NSMutableAttributedString with String or UIImage. + * Usages: + AttStr("hello world").select("world").color("red") + AttStr("A big smile ", Img("smile"), " !!") //insert image attachment + */ +public func AttStr(_ objects: Any?...) -> NSMutableAttributedString { + let result = NSMutableAttributedString() + + for object in objects { + var subAtt: NSAttributedString? = nil + + if object is NSAttributedString { + subAtt = object as? NSAttributedString + + } else if object is String { + subAtt = NSAttributedString(string: object as! String) + + } else if object is UIImage { + let attachment = NSTextAttachment() + attachment.image = object as? UIImage + subAtt = NSAttributedString(attachment: attachment) + } + + if subAtt != nil { + result.append(subAtt!) + } + } + + result.cpk_select(range: NSMakeRange(0, result.length), setFlag: false) + return result +} + + +extension NSMutableAttributedString { + + /** + * NSFontAttributeName + * font use Font() internally, so it can take any kind of values that Font() supported. + * See Font.siwft for more information. + * Usages: + .font(15) + .font("20") + .font("body") + .font(someLabel.font) + ... + */ + @discardableResult public func font(_ style: Any) -> Self { + cpk_addAttribute(name: NSFontAttributeName, value: Font(style)) + return self + } + + /** + * NSForegroundColorAttributeName + * color use Color() internally, so it can take any kind of values that Color() supported. + * See Color.swift for more information. + * Usages: + .color(@"red") + .color(@"#F00") + .color(@"255,0,0") + .color(someView.backgroundColor) + ... + */ + @discardableResult public func color(_ any: Any) -> Self { + cpk_addAttribute(name: NSForegroundColorAttributeName, value: Color(any)!) + return self + } + + /** + * NSBackgroundColorAttributeName + * bg use Color() internally, so it can take any kind of values that Color() supported. + * See Color.swift for more information. + * Usages: + .bg(@"red") + .bg(@"#F00") + .bg(@"255,0,0") + .bg(someView.backgroundColor) + .bg("cat") //using image + ... + */ + @discardableResult public func bg(_ any: Any) -> Self { + cpk_addAttribute(name: NSBackgroundColorAttributeName, value: Color(any) ?? Color(Img(any))!) + return self + } + + /** + * NSUnderlineStyleAttributeName, NSUnderlineColorAttributeName + * underline's second argument use Color() internally, so it can take any kind of values that Color() supported. + * See Color.swift for more information. + * Usages: + .underline() //single underline with the same color of text + .underline(.patternDash) //dash underline with the same color of text + .underline("red") //single underline with red color + .underline(.styleDouble, "red") //double underline with red color + ... + */ + @discardableResult public func underline(_ style: NSUnderlineStyle = .styleSingle, _ color: Any? = nil) -> Self { + var styles = NSNumber(value: style.rawValue) + if style != .styleNone && style != .styleSingle && style != .styleThick && style != .styleDouble { + styles = NSNumber(value: style.rawValue | NSUnderlineStyle.styleSingle.rawValue) + } + + cpk_addAttribute(name: NSUnderlineStyleAttributeName, value: styles) + if let underlineColor = Color(color) { + cpk_addAttribute(name: NSUnderlineColorAttributeName, value: underlineColor) + } + return self + } + + @discardableResult public func underline(_ color: Any) -> Self { + return underline(.styleSingle, color) + } + + /** + * NSStrikethroughStyleAttributeName, NSStrikethroughColorAttributeName + * strikethrough's second argument use Color() internally, so it can take any kind of values that Color() supported. + * See Color.swift for more information. + * Usages: + .strikethrough() //single strikethrough with the same color of text + .strikethrough(.patternDash) //dash strikethrough with the same color of text + .strikethrough("red") //single strikethrough with red color + .strikethrough(.styleDouble, "red") //double strikethrough with red color + ... + */ + @discardableResult public func strikethrough(_ style: NSUnderlineStyle = .styleSingle, _ color: Any? = nil) -> Self { + var styles = NSNumber(value: style.rawValue) + if style != .styleNone && style != .styleSingle && style != .styleThick && style != .styleDouble { + styles = NSNumber(value: style.rawValue | NSUnderlineStyle.styleSingle.rawValue) + } + + cpk_addAttribute(name: NSStrikethroughStyleAttributeName, value: styles) + if let strikethroughColor = Color(color) { + cpk_addAttribute(name: NSStrikethroughColorAttributeName, value: strikethroughColor) + } + return self + } + + @discardableResult + public func strikethrough(_ color: Any) -> Self { + return strikethrough(.styleSingle, color) + } + + /** + * NSStrokeWidthAttributeName, NSStrokeColorAttributeName + * stroke's second argument use Color() internally, so it can take any kind of values that Color() supported. + * See Color.swift for more information. + * Usages: + .stroke(1) + .stroke(-4, "red") + */ + @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) + } + return self + } + + /** + * NSObliquenessAttributeName + * Usages: + .oblique(0.3) + .oblique(-0.3) + */ + @discardableResult + public func oblique(_ value: CGFloat) -> Self { + cpk_addAttribute(name: NSObliquenessAttributeName, value: value) + return self + } + + /** + * NSBaselineOffsetAttributeName + * Usages: + .offset(20) + .offset(-20) + */ + @discardableResult + public func offset(_ offset: CGFloat) -> Self { + cpk_addAttribute(name: NSBaselineOffsetAttributeName, value: offset) + return self + } + + /** + * NSLinkAttributeName + * Also can be used to add clickable link for UILabel. + * Usages: + .link("http://www.google.com") + .link() //mark as link for UILabel + */ + @discardableResult + public func link(_ url: String? = nil) -> Self { + if let urlString = url { + cpk_addAttribute(name: NSLinkAttributeName, value: urlString) + } else { + cpk_addAttribute(name: CPKLabelLinkAttributeName, value: CPKLabelLinkAttributeValue) + } + return self + } + + /** + * Line spacing + * Usages: + .lineGap(10) + */ + @discardableResult + public func lineGap(_ spacing: CGFloat) -> Self { + cpk_addParagraphAttribute(key: "lineSpacing", value: spacing) + return self + } + + /** + * First line head indent + * Usages: + .indent(20) + */ + @discardableResult + public func indent(_ headIntent: CGFloat) -> Self { + cpk_addParagraphAttribute(key: "firstLineHeadIndent", value: headIntent) + return self + } + + /** + * TextAlignment + * Usages: + .align(.center) + .align(.justified) + ... + */ + @discardableResult + public func align(_ alignment: NSTextAlignment) -> Self { + cpk_addParagraphAttribute(key: "alignment", value: NSNumber(value: alignment.rawValue)) + return self + } + + /** + * Select substrings + * By default Attributes are applied to the whole string. + You can make them only affect some parts of them by selecting substrings with regular expression or range. + + * You can pass multiply options at the same time. + * See AttStrSelectionOptions for more information. + + * Usages: + AttStr("hello world").select("world").color("red") //only "world" are red + AttStr("abc123").select("[a-z]+").color("red") //only "abc" are red + AttStr("abc123").select(.number).color("red") //only "123" are red + AttStr("@Tim at #Apple").select(.nameTag, .hashTag).color("red") //@Tim" and "#Apple" are red + AttStr("@Tim at #apple").select(.range(5, 2)).color("red") //only "@at" are red + ... + + * .select("pattern") is just the shorthand of .select(.match("pattern")) + */ + @discardableResult + public func select(_ optionOrStringLiterals: AttStrSelectionOptions...) -> Self { + + for option in optionOrStringLiterals { + var regExp: NSRegularExpression? + var patternString: String? + var selectedRange = false + + switch option { + case .all: + cpk_select(range: NSMakeRange(0, self.length)) + + case .url: + regExp = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue) + + case .date: + regExp = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.date.rawValue) + + case .phoneNumber: + regExp = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.phoneNumber.rawValue) + + case .hashTag: + patternString = "(?= 0 ? location : self.length + location, length)) + return self + } + + if patternString != nil { + regExp = try? NSRegularExpression(pattern: patternString!, + options: NSRegularExpression.Options(rawValue: 0)) + } + + if regExp != nil { + let matches = regExp!.matches(in: self.string, + options: NSRegularExpression.MatchingOptions(rawValue: 0), + range: NSMakeRange(0, self.length)) + + for result in matches { + cpk_select(range: result.range) + selectedRange = true + } + } + + if !selectedRange { + cpk_select(range: nil) + } + } + + return self + } + + /** + * Prevent overriding attribute. + * By default, the attribute value applied later will override the previous one if they are the same attributes. + * Usages: + 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 { + self.cpkPreventOverrideAttribute = flag + return self + } +} + + +public enum AttStrSelectionOptions { + case all //select whole string + case url //select all urls + case date //select all dates + case number //select all numbers + case phoneNumber //select all phone numbers + case hashTag //select all hash tags + case nameTag //select all name tags + + case match(Any) //select substrings with regExp pattern or regExp Object + case range(Int, Int) //select substring with range +} + + + diff --git a/Cupcake/Button.swift b/Cupcake/Button.swift new file mode 100644 index 0000000..9db8a1e --- /dev/null +++ b/Cupcake/Button.swift @@ -0,0 +1,227 @@ +// +// Button.swift +// Cupcake +// +// Created by nerdycat on 2017/3/23. +// Copyright © 2017 nerdycat. All rights reserved. +// + +import UIKit + +public var Button: UIButton { + let button = UIButton() + cpk_higherHuggingAndResistance(forView: button) + return button +} + +public extension UIButton { + + /** + * Setting normal title or normal attributedTitle + * str can take any kind of value, even primitive type like Int. + * Usages: + .str(1024) + .str("hello world") + .str( AttStr("hello world").strikethrough() ) + ... + */ + @discardableResult public func str(_ any: Any) -> Self { + if let attStr = any as? NSAttributedString { + setAttributedTitle(attStr, for: .normal) + } else { + setTitle(String(describing: any), for: .normal) + } + return self + } + + /** + * Setting font + * font use Font() internally, so it can take any kind of values that Font() supported. + * See Font.siwft for more information. + * Usages: + .font(15) + .font("20") + .font("body") + .font("Helvetica,15") + .font(someLabel.font) + ... + **/ + @discardableResult public func font(_ any: Any) -> Self { + self.titleLabel?.font = Font(any) + return self + } + + /** + * Setting titleColor + * color use Color() internally, so it can take any kind of values that Color() supported. + * See Color.swift for more information. + * Usages: + .color(@"red") + .color(@"#F00") + .color(@"255,0,0") + .color(someLabel.textColor) + ... + */ + @discardableResult public func color(_ any: Any) -> Self { + setTitleColor(Color(any), for: .normal) + return self + } + + /** + * Setting highlighted titleColor + * highColor use Color() internally, so it can take any kind of values that Color() supported. + * See Color.swift for more information. + * Usages: + .highColor(@"red") + .highColor(@"#F00") + .highColor(@"255,0,0") + .highColor(someLabel.textColor) + ... + */ + @discardableResult public func highColor(_ any: Any) -> Self { + setTitleColor(Color(any), for: .highlighted) + return self + } + + /** + * Setting normal image + * img use Img() internally, so it can take any kind of values that Img() supported. + * See Img.swift for more information. + * Usages: + .img("cat") + .img("#button-background") + .img("$home-icon") + .img(someImage) + ... + */ + @discardableResult public func img(_ any: Any) -> Self { + let image = Img(any) + setImage(image, for: .normal) + if self.frame.isEmpty { + self.frame.size = image.size + } + return self + } + + /** + * Setting highlighted image + * highImg use Img() internally, so it can take any kind of values that Img() supported. + * See Img.swift for more information. + * Usages: + .highImg("cat") + .highImg("#button-background") + .highImg("$home-icon") + .highImg(someImage) + ... + */ + @discardableResult public func highImg(_ any: Any) -> Self { + setImage(Img(any), for: .highlighted) + return self + } + + /** + * Setting background with Color or Image. + * bg use Img() internally, so it can take any kind of values that Img() supported. + * See Img.swift for more information. + * Usages: + .bg(@"red") + .bg(@"#F00") + .bg(@"255,0,0") + .bg(someView.backgroundColor) + .bg("cat") //using image + .bg(someImage) //using image + ... + */ + @discardableResult override public func bg(_ any: Any) -> Self { + let image = Img(any) + setBackgroundImage(image, for: .normal) + cpk_masksToBoundsIfNeed() + + if self.frame.isEmpty { + self.frame.size = image.size + } + return self + } + + /** + * Setting highlighted background with Color or Image. + * highBg use Img() internally, so it can take any kind of values that Img() supported. + * See Img.swift for more information. + * Usages: + .highBg(@"red") + .highBg(@"#F00") + .highBg(@"255,0,0") + .highBg(someView.backgroundColor) + .highBg("cat") //using image + .highBg(someImage) //using image + ... + */ + @discardableResult public func highBg(_ any: Any) -> Self { + setBackgroundImage(Img(any), for: .highlighted) + cpk_masksToBoundsIfNeed() + return self + } + + /** + * Setting contentEdgeInsets + * Usages: + .padding(10) //top: 10, left: 10, bottom: 10, right: 10 + .padding(10, 20) //top: 10, left: 20, bottom: 10, right: 20 + .padding(10, 20, 30) //top: 10, left: 20, bottom: 0 , right: 30 + .padding(10, 20, 30, 40) //top: 10, left: 20, bottom: 30, right: 40 + */ + @discardableResult public func padding(_ contentEdgeInsets: CGFloat...) -> Self { + cpk_updatePadding(contentEdgeInsets, forView: self) + return self + } + + /** + * Setting spacing between title and image. + * Usages: + .gap(10) + */ + @discardableResult public func gap(_ spacing: CGFloat) -> Self { + self.cpkGap = spacing + let halfGap = spacing / 2 + + self.titleEdgeInsets = UIEdgeInsetsMake(0, halfGap, 0, -halfGap) + self.imageEdgeInsets = UIEdgeInsetsMake(0, -halfGap, 0, halfGap) + + var insets = self.cpkInsets ?? UIEdgeInsetsMake(0, 0, 0, 0) + insets.left += halfGap + insets.right += halfGap + self.contentEdgeInsets = insets + + return self + } + + /** + * Swapping title and image position. + * Usages: + .reversed() + .reversed(false) + */ + @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 + self.titleLabel?.layer.transform = t + return self + } + + /** + * Enable multilines for Button. + * Usages: + .lines(2) + .lines(0) //multilines + .lines() //same as .lines(0) + */ + @discardableResult public func lines(_ numberOfLines: CGFloat = 0) -> Self { + self.titleLabel?.numberOfLines = Int(numberOfLines) + self.titleLabel?.lineBreakMode = .byWordWrapping + self.titleLabel?.textAlignment = .center + return self + } +} + + diff --git a/Cupcake/CPKStackView.swift b/Cupcake/CPKStackView.swift new file mode 100644 index 0000000..4818859 --- /dev/null +++ b/Cupcake/CPKStackView.swift @@ -0,0 +1,708 @@ +// +// StackView.swift +// Cupcake +// +// Created by nerdycat on 2017/3/29. +// Copyright © 2017 nerdycat. All rights reserved. +// + +import UIKit + + +/** + * Usually you don't use CPKStackView directly. + * Use HStack and VStack instread. See Stack.swift for more information. + */ + +fileprivate let kDefaultEnclosurePriority: UILayoutPriority = 200 +fileprivate let kAlignmentPriority: UILayoutPriority = 1000 +fileprivate let kSpacingPriority: UILayoutPriority = 1000 +fileprivate let kSpringPriority: UILayoutPriority = 1000 + +let kFixSizePriority: UILayoutPriority = 900 +let kLowPriority: UILayoutPriority = 100 +let kDefaultHuggingPriority: UILayoutPriority = 250 + + +public class CPKStackView: UIView { + + private var alignmentConstraints = [NSLayoutConstraint]() + private var spacingConstraints = [NSLayoutConstraint]() + private var enslosureConstraints = [NSLayoutConstraint]() + private var springConstraints = [NSLayoutConstraint]() + + private var _alignment: CPKStackAlignment = .left + private var _spacing: CGFloat = 0 + private var _axis: UILayoutConstraintAxis = .horizontal + + public private(set) var arrangedSubviews = [UIView]() + + + public var alignment: CPKStackAlignment { + get { return _alignment } + set { if _alignment != newValue { _alignment = newValue; alignmentDidChange() } } + } + + public var spacing: CGFloat { + get { return _spacing } + set { if _spacing != newValue { _spacing = newValue; spacingDidChange() } } + } + + public var axis: UILayoutConstraintAxis { + get { return _axis } + set { if _axis != newValue { _axis = newValue; axisDidChange() } } + } + + + public func addArrangedSubview(item: Any) { + insertArrangedSubview(item: item, at: self.arrangedSubviews.count) + } + + public func addArrangedSubviews(items: [Any]) { + for item in items { + if let array = item as? Array { + for item in array { + self.addArrangedSubview(item: item) + } + } else { + self.addArrangedSubview(item: item) + } + } + } + + public func insertArrangedSubview(item: Any, at index: Int) { + let sub = item is String ? StackSpring() : item + + if let view = sub as? UIView { + + self.insertSubview(view, at: index) + self.arrangedSubviews.insert(view, at: index) + + view.translatesAutoresizingMaskIntoConstraints = false + view.addObserver(self, forKeyPath: "hidden", options: [.new, .old], context: nil) + + if UIEdgeInsetsEqualToEdgeInsets(view.layoutMargins, UIEdgeInsetsMake(8, 8, 8, 8)) { + view.layoutMargins = UIEdgeInsets.zero + } + + if !view.isHidden { + addAndActivateConstraintsForView(at: index) + } + + } else if let array = sub as? [Any] { + for i in 0.. CGSize { + return systemLayoutSizeFitting(UILayoutFittingCompressedSize) + } + + + + //MARK: KVO + public override func observeValue(forKeyPath keyPath: String?, + of object: Any?, + change: [NSKeyValueChangeKey : Any]?, + context: UnsafeMutableRawPointer?) { + + if keyPath == "hidden" { + let oldValue = change?[.oldKey] as? Bool + let newValue = change?[.newKey] as? Bool + + if newValue != oldValue { + if let item = object as? UIView { + if let index = self.arrangedSubviews.index(of: item) { + + if item.isHidden { + removeAndDeactivateConstraintsForView(at: index) + } else { + addAndActivateConstraintsForView(at: index) + } + } + } + } + } + } + + + + //MARK: Constraints + private func addAndActivateConstraintsForView(at index: Int) { + if itemAt(index: index).isHidden { + return; + } + + var oldConstraints = [NSLayoutConstraint]() + var newConstraints = [NSLayoutConstraint]() + + let previousIndex = previousVisibleViewIndexForView(at: index) + let nextIndex = nextVisibleViewIndexForView(at: index) + + newConstraints.append(contentsOf: addAlignmentConstraint(at: index)) + newConstraints.append(contentsOf: addEnclosureConstraints(at: index)) + + if let c = removeSpacingConstraintBetween(index1: previousIndex, index2: nextIndex) { + oldConstraints.append(c) + } + + if let c = addSpacingConstraintBetween(index1: previousIndex, index2: index) { + newConstraints.append(c) + } + + if let c = addSpacingConstraintBetween(index1: index, index2: nextIndex) { + newConstraints.append(c) + } + + NSLayoutConstraint.deactivate(oldConstraints) + NSLayoutConstraint.activate(newConstraints) + + if let spring = itemAt(index: index) as? StackSpring { + spring.axis = self.axis + addAndActivateSpringConstraintsForSpring(at: index) + } + } + + private func addAndActivateConstraintsForAll() { + addAndActivateAlignmentConstraintsForAll() + addAndActivateSpacingConstraintsForAll() + addAndActivateEnclosureConstraintsForAll() + + for (i, item) in self.arrangedSubviews.enumerated() { + if let spring = item as? StackSpring { + spring.axis = self.axis + addAndActivateSpringConstraintsForSpring(at: i) + } + } + } + + private func removeAndDeactivateConstraintsForView(at index: Int) { + var oldConstraints = [NSLayoutConstraint]() + + if let c = removeAlignmentConstraint(at: index) { + oldConstraints.append(c) + } + + oldConstraints.append(contentsOf: removeEnclosureConstraints(at: index)) + NSLayoutConstraint.deactivate(oldConstraints) + + removeAndRebuildSpacingConstraints(at: index) + removeAndDeactivateSpringConstraintsForSpring(at: index) + } + + private func removeAndDeactivateAllConstriants() { + removeAndDeactivateAllAlignmentConstriants() + removeAndDeactivateAllEnclosureConstraints() + removeAndDeactivateAllSpacingConstraints() + removeAndDeactivateAllSpringsConstraints() + } + + + + //MARK: Alignment + @discardableResult + private func addAlignmentConstraint(at index: Int) -> [NSLayoutConstraint] { + var newConstraints = [NSLayoutConstraint]() + var att = NSLayoutAttribute.notAnAttribute + + if self.alignment == .fill { + + if self.axis == .vertical { + newConstraints.append( makeConstraint(index, .leftMargin, .equal, -1, .leftMargin, 1, 0, 1000) ) + newConstraints.append( makeConstraint(index, .rightMargin, .equal, -1, .rightMargin, 1, 0, 1000) ) + } else { + newConstraints.append( makeConstraint(index, .topMargin, .equal, -1, .topMargin, 1, 0, 1000) ) + newConstraints.append( makeConstraint(index, .bottomMargin, .equal, -1, .bottomMargin, 1, 0, 1000) ) + } + + } else { + if self.axis == .vertical { + if self.alignment == .left { att = .leftMargin } + if self.alignment == .right { att = .rightMargin } + if self.alignment == .center { att = .centerXWithinMargins } + + } else { + if self.alignment == .top { att = .topMargin } + if self.alignment == .bottom { att = .bottomMargin } + if self.alignment == .center { att = .centerYWithinMargins } + if self.alignment == .baseline { att = .lastBaseline } + } + + newConstraints.append( makeConstraint(index, att, .equal, -1, att, 1, 0, kAlignmentPriority) ) + } + + + self.alignmentConstraints.append(contentsOf: newConstraints) + return newConstraints + } + + private func addAndActivateAlignmentConstraintsForAll() { + for i in 0.. NSLayoutConstraint? { + let item = itemAt(index: index) + + if item != self { + for (i, c) in self.alignmentConstraints.enumerated() { + if c.firstItem === item || c.secondItem === item { + self.alignmentConstraints.remove(at: i) + return c + } + } + } + + return nil + } + + private func removeAndDeactivateAllAlignmentConstriants() { + NSLayoutConstraint.deactivate(self.alignmentConstraints) + self.alignmentConstraints.removeAll() + } + + + + //MARK: Enclosure + @discardableResult + private func addEnclosureConstraints(at index: Int) -> [NSLayoutConstraint] { + var newConstraints = [NSLayoutConstraint]() + + let enclosurePriority = kDefaultEnclosurePriority + + if self.axis == .vertical { + newConstraints.append(makeConstraint(index, .leftMargin, .equal, -1, .leftMargin, enclosurePriority)) + newConstraints.append(makeConstraint(index, .leftMargin, .greaterThanOrEqual, -1, .leftMargin, 1000)) + newConstraints.append(makeConstraint(index, .rightMargin, .equal, -1, .rightMargin, enclosurePriority)) + newConstraints.append(makeConstraint(index, .rightMargin, .lessThanOrEqual, -1, .rightMargin, 1000)) + + } else { + newConstraints.append(makeConstraint(index, .topMargin, .equal, -1, .topMargin, enclosurePriority)) + newConstraints.append(makeConstraint(index, .topMargin, .greaterThanOrEqual, -1, .topMargin, 1000)) + + var att: NSLayoutAttribute = .bottomMargin + if self.alignment == .baseline { + att = .lastBaseline + } + + newConstraints.append(makeConstraint(index, att, .equal, -1, att, enclosurePriority)) + newConstraints.append(makeConstraint(index, att, .lessThanOrEqual, -1, att, 1000)) + } + + self.enslosureConstraints.append(contentsOf: newConstraints) + return newConstraints + } + + private func addAndActivateEnclosureConstraintsForAll() { + for i in 0.. [NSLayoutConstraint] { + var oldConstriants = [NSLayoutConstraint]() + let item = itemAt(index: index) + + for i in stride(from: self.enslosureConstraints.count - 1, through: 0, by: -1) { + let c = self.enslosureConstraints[i] + if c.firstItem === item || c.secondItem === item { + oldConstriants.append(c) + self.enslosureConstraints.remove(at: i) + } + } + + return oldConstriants + } + + private func removeAndDeactivateAllEnclosureConstraints() { + NSLayoutConstraint.deactivate(self.enslosureConstraints) + self.enslosureConstraints.removeAll() + } + + + + //MARK: Spacing + @discardableResult + private func addSpacingConstraintBetween(index1: Int, index2: Int) -> NSLayoutConstraint? { + let item1 = itemAt(index: index1) + let item2 = itemAt(index: index2) + + if item1 === item2 { + return nil + } + + var att1 = NSLayoutAttribute.notAnAttribute + var att2 = NSLayoutAttribute.notAnAttribute + + if self.axis == .vertical { + att1 = (item1 == self ? .topMargin : .bottomMargin) + att2 = (item2 != self ? .topMargin : .bottomMargin) + } else { + att1 = (item1 == self ? .leftMargin : .rightMargin) + att2 = (item2 != self ? .leftMargin : .rightMargin) + } + + var spacing: CGFloat = 0 + + if let attachSpacing = item1.cpkAttachSpacing { + spacing = -attachSpacing + } else if item1 != self && item2 != self { + spacing = -self.spacing + } + + let c = makeConstraint(index1, att1, .equal, index2, att2, 1, spacing, kSpacingPriority) + self.spacingConstraints.append(c) + return c + } + + private func addAndActivateSpacingConstraintsForAll() { + if self.arrangedSubviews.count > 0 { + var index1 = -1 + + while index1 < self.arrangedSubviews.count { + let index2 = nextVisibleViewIndexForView(at: index1) + addSpacingConstraintBetween(index1: index1, index2: index2) + index1 = index2 + } + + NSLayoutConstraint.activate(self.spacingConstraints) + } + } + + private func removeSpacingConstraintBetween(index1: Int, index2: Int) -> NSLayoutConstraint? { + let item1 = itemAt(index: index1) + let item2 = itemAt(index: index2) + + for (i, c) in self.spacingConstraints.enumerated() { + if c.firstItem === item1 && c.secondItem === item2 { + self.spacingConstraints.remove(at: i) + return c + } + } + + return nil + } + + private func removeAndDeactivateAllSpacingConstraints() { + NSLayoutConstraint.deactivate(self.spacingConstraints) + self.spacingConstraints.removeAll() + } + + private func removeAndRebuildSpacingConstraints(at index: Int) { + var oldConstraints = [NSLayoutConstraint]() + var newConstarints = [NSLayoutConstraint]() + + let previousIndex = previousVisibleViewIndexForView(at: index) + let nextIndex = nextVisibleViewIndexForView(at: index) + + if let c = removeSpacingConstraintBetween(index1: previousIndex, index2: index) { + oldConstraints.append(c) + } + + if let c = removeSpacingConstraintBetween(index1: index, index2: nextIndex) { + oldConstraints.append(c) + } + + if oldConstraints.count > 0 { + if let c = addSpacingConstraintBetween(index1: previousIndex, index2: nextIndex) { + newConstarints.append(c) + } + } + + NSLayoutConstraint.deactivate(oldConstraints) + NSLayoutConstraint.activate(newConstarints) + } + + + private func attachSpaceDidChangeForView(at index: Int) { + let item1 = itemAt(index: index) + let item2 = itemAt(index: index + 1) + + if let spacing = item1.cpkAttachSpacing { + for c in self.spacingConstraints { + if c.firstItem === item1 && c.secondItem === item2 { + c.constant = -spacing + break + } + } + } + } + + + + //MARK: Spring + private func addAndActivateSpringConstraintsForSpring(at index: Int) { + var newConstraints = [NSLayoutConstraint]() + + for i in 0.. NSLayoutConstraint { + + let item1 = itemAt(index: index1) + let item2 = itemAt(index: index2) + + let c = NSLayoutConstraint(item: item1, + attribute: att1, + relatedBy: relation, + toItem: item2, + attribute: att2, + multiplier: multiplier, + constant: constant) + + c.priority = priority + return c + } + + private func makeConstraint(_ index1: Int, + _ att1: NSLayoutAttribute, + _ relation: NSLayoutRelation, + _ index2: Int, + _ att2: NSLayoutAttribute, + _ priority: UILayoutPriority) -> NSLayoutConstraint { + + return makeConstraint(index1, att1, relation, index2, att2, 1, 0, priority) + } + + private func previousVisibleViewIndexForView(at index: Int) -> Int { + for i in stride(from: index - 1, through: 0, by: -1) { + let item = itemAt(index: i) + if !item.isHidden { return i } + } + return -1 + } + + private func nextVisibleViewIndexForView(at index: Int) -> Int { + for i in stride(from: index + 1, to: self.arrangedSubviews.count, by: 1) { + let item = itemAt(index: i) + if !item.isHidden { return i } + } + return self.arrangedSubviews.count + } + + private func itemAt(index: Int) -> UIView { + if index >= 0 && index < self.arrangedSubviews.count { + return self.arrangedSubviews[index] + } else { + return self + } + } + + private func alignmentDidChange() { + removeAndDeactivateAllAlignmentConstriants() + removeAndDeactivateAllEnclosureConstraints() + + addAndActivateAlignmentConstraintsForAll() + addAndActivateEnclosureConstraintsForAll() + } + + private func spacingDidChange() { + for c in self.spacingConstraints { + let item1 = c.firstItem as! UIView + let item2 = c.secondItem as! UIView + + if item1 != self && item2 != self { + if let attachSpacing = item1.cpkAttachSpacing { + c.constant = -attachSpacing + } else { + c.constant = -self.spacing + } + } + } + } + + private func axisDidChange() { + removeAndDeactivateAllConstriants() + addAndActivateConstraintsForAll() + } +} + + + +extension UIView { + var cpkAttachSpacing: CGFloat? { + get { return cpk_associatedObjectFor(key: #function) as? CGFloat } + set { cpk_setAssociated(object: newValue, forKey: #function) } + } +} + + +class CPKTransformLayer: CATransformLayer { + override var isOpaque: Bool { + set {} + get { return true } + } +} + + +public class StackSpring: UIView { + private var _axis: UILayoutConstraintAxis = .horizontal + + fileprivate var axis: UILayoutConstraintAxis { + get { return _axis } + set { + if _axis != newValue { + _axis = newValue + updateContentPriorities() + invalidateIntrinsicContentSize() + } + } + } + + override init(frame: CGRect) { + super.init(frame: frame) + self.isUserInteractionEnabled = false + updateContentPriorities() + } + + public required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + public override var intrinsicContentSize: CGSize { + return CGSize.zero + } + + public override var backgroundColor: UIColor? { + set {} + get { return nil } + } + + public override var isOpaque: Bool { + set {} + get { return true } + } + + public override var clipsToBounds: Bool { + set {} + get { return false } + } + + public override class var layerClass: Swift.AnyClass { + return CPKTransformLayer.self + } + + private func updateContentPriorities() { + let horPriority = UILayoutPriority(self.axis == .horizontal ? 1 : 1000) + let verPriority = UILayoutPriority(self.axis == .horizontal ? 1000 : 1) + + setContentHuggingPriority(horPriority, for: .horizontal) + setContentHuggingPriority(verPriority, for: .vertical) + setContentCompressionResistancePriority(horPriority, for: .horizontal) + setContentCompressionResistancePriority(verPriority, for: .vertical) + } +} + + diff --git a/Cupcake/Color.swift b/Cupcake/Color.swift new file mode 100644 index 0000000..3f27bd7 --- /dev/null +++ b/Cupcake/Color.swift @@ -0,0 +1,106 @@ +// +// Color.swift +// Cupcake +// +// Created by nerdycat on 2017/3/17. +// Copyright © 2017 nerdycat. All rights reserved. +// + +import UIKit + +/** + * Create UIColor Object. + * Color argument can be: + 1) UIColor object + 2) UIImage object, return a pattern image color + 3) "red", "green", "blue", "clear", etc. (any system color) + 5) "random": randomColor + 6) "255,0,0": RGB color + 7) "#FF0000" or "0xF00": Hex color + + * All the string representation can have an optional alpha value. + + * Usages: + Color([UIColor redColor]) + Color("red") + Color("red,0.1") //with alpha + Color("255,0,0) + Color("255,0,0,1") //with alpha + Color("#FF0000") + Color("#F00,0.1") //with alpha + Color("random,0.5") + Color(Img("image")) //using image + ... + */ +func Color(_ any: Any?) -> UIColor? { + if any == nil { + return nil + } + + if let color = any as? UIColor { + return color; + } + + if let image = any as? UIImage { + return UIColor(patternImage: image) + } + + guard any is String else { + return nil + } + + var alpha: CGFloat = 1 + var components = (any as! String).components(separatedBy: ",") + + if components.count == 2 || components.count == 4 { + alpha = min(CGFloat(Float(components.last!) ?? 1), 1) + components.removeLast() + } + + var r: Int?, g: Int? , b: Int? + + if components.count == 1 { + let string = components.first! + let sel = NSSelectorFromString(string + "Color") + + //system color + if let color = UIColor.cpk_safePerform(selector: sel) as? UIColor { + return color.withAlphaComponent(alpha) + + } + + if string == "random" { + r = Int(arc4random_uniform(256)) + g = Int(arc4random_uniform(256)) + b = Int(arc4random_uniform(256)) + + } else if string.hasPrefix("#") { + if string.characters.count == 4 { + r = Int(string.subAt(1), radix:16)! * 17 + g = Int(string.subAt(2), radix:16)! * 17 + b = Int(string.subAt(3), radix:16)! * 17 + + } else if string.characters.count == 7 { + r = Int(string.subAt(1...2), radix:16) + g = Int(string.subAt(3...4), radix:16) + b = Int(string.subAt(5...6), radix:16) + } + } + + } else if components.count == 3 { + r = Int(components[0]) + g = Int(components[1]) + b = Int(components[2]) + } + + if r != nil && g != nil && b != nil { + return UIColor(red: CGFloat(r!) / 255.0, + green: CGFloat(g!) / 255.0, + blue: CGFloat(b!) / 255.0, + alpha: alpha) + } + + return nil +} + + diff --git a/Cupcake/Cons.swift b/Cupcake/Cons.swift new file mode 100644 index 0000000..49330e9 --- /dev/null +++ b/Cupcake/Cons.swift @@ -0,0 +1,230 @@ +// +// Constraint.swift +// Cupcake +// +// Created by nerdycat on 2017/3/22. +// Copyright © 2017 nerdycat. All rights reserved. +// + +import UIKit + +/** + * A SnapKit like syntax to setup constraints. + + * Usages: + view1.makeCons({ make in + make.left.top.equal(view2).offset(20, 20) + make.width.height.equal(100, 100) + }) + + view1.remakeCons({ + $0.left.equal(20) + $0.top.euqal(view2).bottom.offset(20) + $0.size.equal(view2).multiply(0.5) + }) + */ + +public extension ConsAtts { + + public var left: Cons { + return addAttributes(.left) + } + + public var leftMargin: Cons { + return addAttributes(.leftMargin) + } + + public var right: Cons { + return addAttributes(.right) + } + + public var rightMargin: Cons { + return addAttributes(.rightMargin) + } + + public var top: Cons { + return addAttributes(.top) + } + + public var topMargin: Cons { + return addAttributes(.topMargin) + } + + public var bottom: Cons { + return addAttributes(.bottom) + } + + public var bottomMargin: Cons { + return addAttributes(.bottomMargin) + } + + public var leading: Cons { + return addAttributes(.leading) + } + + public var leadingMargin: Cons { + return addAttributes(.leadingMargin) + } + + public var trailing: Cons { + return addAttributes(.trailing) + } + + public var trailingMagin: Cons { + return addAttributes(.trailingMargin) + } + + public var width: Cons { + return addAttributes(.width) + } + + public var height: Cons { + return addAttributes(.height) + } + + public var centerX: Cons { + return addAttributes(.centerX) + } + + public var centerY: Cons { + return addAttributes(.centerY) + } + + public var centerXInMargins: Cons { + return addAttributes(.centerXWithinMargins) + } + + public var centerYInMargins: Cons { + return addAttributes(.centerYWithinMargins) + } + + public var baseline: Cons { + return addAttributes(.lastBaseline) + } + + public var firstBaseline: Cons { + return addAttributes(.firstBaseline) + } + + public var center: Cons { + return addAttributes(.centerX, .centerY) + } + + public var origin: Cons { + return addAttributes(.left, .top) + } + + public var size: Cons { + return addAttributes(.width, .height) + } + + public var edge: Cons { + return addAttributes(.top, .left, .bottom, .right) + } +} + + +public extension Cons { + + /** + * equal relationship, can be UIView or values. This is the default relationship. + * If you don't specify item2 (by using equal, lessEqual or greaterEqual), + and the item1's attribute is not width and height, + then the item2 is automatically refer to item1's superview. + + * Usages: + make.left.equal(superview) + make.left.offset(0) //same as above + make.width.equal(100) + make.size.equal(100, 200) + */ + @discardableResult public func equal(_ item2OrValues: Any...) -> Self { + self.relation = .equal + updateSecondItem(item2OrValues) + return self + } + + /** + * lessThanOrEqual relationship, can be UIView or values. + * Usages: + make.left.lessEqual(superview) + make.width.lessEqual(100) + make.size.lessEqual(100, 200) + */ + @discardableResult public func lessEqual(_ item2OrValues: Any...) -> Self { + self.relation = .lessThanOrEqual + updateSecondItem(item2OrValues) + return self + } + + /** + * greaterThanOrEqual relationship, can be UIView or values. + * Usages: + make.left.greaterEqual(superview) + make.width.greaterEqual(100) + make.size.greaterEqual(100, 200) + */ + @discardableResult public func greaterEqual(_ item2OrValues: Any...) -> Self { + self.relation = .greaterThanOrEqual + updateSecondItem(item2OrValues) + return self + } + + /** + * offset can accept multiply values. + * Usages: + make.left.offset(20) + make.left.top.offset(20, 40) + make.edge.offset(10, 20, 30, 40) + ... + */ + @discardableResult public func offset(_ offsets: CGFloat...) -> Self { + self.constantValues = offsets + return self + } + + /** + * multiply can accept multiply values. + * Usages: + make.width.equal(view2).multiply(0.5) + make.size.equal(view2).multiply(0.5, 0.8) + ... + */ + @discardableResult public func multiply(_ multipliers: CGFloat...) -> Self { + self.multiplierValues = multipliers + return self + } + + /** + * priority can accept multiply values. + * Usages: + make.width.equal(100).priority(800) + make.edge.offset(10).priority(1000, 1000, 900, 900) + ... + */ + @discardableResult public func priority(_ priorities: UILayoutPriority...) -> Self { + self.priorityValues = priorities + return self + } + + /** + * Save constraints to variables, it can accept multiply values. + * Very useful when you need to alter constraint later. + * Usages: + var topConstriant = NSLayoutConstraint() + + View.bg("red").addTo(self.view).makeCons({ + $0.size.equal(100, 100) + $0.center.offset(0).priority(900) + $0.top.offset(0).saveTo(&topConstriant) + }) + ... + topConstraint.isActivate = false + */ + @discardableResult public func saveTo(_ constraints: UnsafeMutablePointer...) -> Self { + self.storePointers = constraints + return self + } +} + + diff --git a/Cupcake/Font.swift b/Cupcake/Font.swift new file mode 100644 index 0000000..7cb0e43 --- /dev/null +++ b/Cupcake/Font.swift @@ -0,0 +1,50 @@ +// +// Font.swift +// Cupcake +// +// Created by nerdycat on 2017/3/17. +// Copyright © 2017 nerdycat. All rights reserved. +// + +import UIKit + +/** + * Create UIFont object. + * Font argument can be: + 1) UIFont object + 2) 15: systemFontOfSize 15 + 3) "15": boldSystemFontOfSize 15 + 4) "headline", "body", "caption1", and any other UIFontTextStyle. + 5) "Helvetica,15": fontName + fontSize, separated by comma. + + * Usages: + Font(someLabel.font), + Font(15) + Font("15") + Font("body") + Font("Helvetica,15") + ... + */ +public func Font(_ any: Any) -> UIFont { + if let font = any as? UIFont { + return font + } + + if let string = any as? String { + let elements = string.components(separatedBy: ",") + if elements.count == 2 { + return UIFont(name: elements[0], size: CGFloat(Float(elements[1])!))! + } + + if let fontSize = Float(string), fontSize > 0 { + return UIFont.boldSystemFont(ofSize: CGFloat(fontSize)) + } + + let value = "UICTFontTextStyle" + string.capitalized + return UIFont.preferredFont(forTextStyle: UIFontTextStyle(rawValue: value)) + } + + return UIFont.systemFont(ofSize: CPKFloat(any)) +} + + diff --git a/Cupcake/ImageView.swift b/Cupcake/ImageView.swift new file mode 100644 index 0000000..adccf19 --- /dev/null +++ b/Cupcake/ImageView.swift @@ -0,0 +1,54 @@ +// +// ImageView.swift +// Cupcake +// +// Created by nerdycat on 2017/3/23. +// Copyright © 2017 nerdycat. All rights reserved. +// + +import UIKit + +public var ImageView: UIImageView { + let imageView = UIImageView() + cpk_higherHuggingAndResistance(forView: imageView) + return imageView +} + +public extension UIImageView { + + /** + * Setting image + * img use Img() internally, so it can take any kind of values that Img() supported. + * See Img.swift for more information. + * Usages: + .img("cat") + .img("#button-background") + .img("$home-icon") + .img(someImage) + ... + */ + @discardableResult public func img(_ any: Any) -> Self { + self.image = Img(any) + + if self.image != nil { + if self.frame.isEmpty { + self.frame.size = self.image!.size + } + } + + cpk_masksToBoundsIfNeed() + return self + } + + /** + * Setting contentMode + * Usages: + .mode(.scaleAspectFit) + .mode(.center) + ... + */ + @discardableResult public func mode(_ contentMode: UIViewContentMode) -> Self { + self.contentMode = contentMode + return self + } +} diff --git a/Cupcake/Img.swift b/Cupcake/Img.swift new file mode 100644 index 0000000..c0c8b59 --- /dev/null +++ b/Cupcake/Img.swift @@ -0,0 +1,123 @@ +// +// Img.swift +// Cupcake +// +// Created by nerdycat on 2017/3/17. +// Copyright © 2017 nerdycat. All rights reserved. +// + +import UIKit + +/** + * Create UIImage object. + * Img argument can be: + 1) UIImage object + 2) "imageName" + 3) "#imageName": stretchable image + 4) "$imageName": template image + 5) Any color value that Color() supported. + + * Prefixing image name with # character will create a stretchable image. + * Prefixing image name with $ character will create a template image. + * Passing a color value will create an 1x1 size image with specific color. + + * Usages: + Img(someImage) + Img("cat") + Img("#button-background") + Img("$home-icon") + Img("33,33,33,0.5") + Img("red").resize(100, 100) + ... + */ +public func Img(_ any: Any) -> UIImage { + + if let image = any as? UIImage { + return image + } + + if let string = any as? String { + let stretching = string.hasPrefix("#") + let templating = string.hasPrefix("$") + + let imageName = (stretching || templating) ? string.subFrom(1) : string + var image = UIImage(named: imageName) + + if stretching { + if image == nil { + image = UIImage(named: string) + } else { + let leftCap = Int(image!.size.width) / 2 + let topCap = Int(image!.size.height) / 2 + image = image?.stretchableImage(withLeftCapWidth:leftCap, topCapHeight: topCap) + } + } + + if templating { + if image == nil { + image = UIImage(named: string) + } else { + image = image?.withRenderingMode(.alwaysTemplate) + } + } + + if image != nil { + return image! + } + } + + if let color = Color(any) { + return cpk_onePointImageWithColor(color) + } else { + assert(false, "invalid image") + return UIImage() + } +} + + +public extension UIImage { + + /** + * Resize image. + * When passing integer value, it means the target size. + * When passing floating value, it means multiply with original size. + * Usages: + .resize(100, 100) //resize to 100x100 + .resize(100) //same as .resize(100, 100) + .resize(0.8, 0.8) //0.8 * original size + .resize(0.8) //same as .resize(0.8, 0.8) + */ + @discardableResult public func resize(_ p1: Any, _ p2: Any? = nil) -> UIImage { + var newWidth: CGFloat = 0 + var newHeight: CGFloat = 0 + + if let width = p1 as? Int { + newWidth = CGFloat(width) + } else { + newWidth = CPKFloat(p1) * self.size.width + } + + if p2 == nil { + newHeight = newWidth + + } else { + if let height = p2 as? Int { + newHeight = CGFloat(height) + } else { + newHeight = CPKFloat(p2!) * self.size.height + } + } + + let rect = CGRect(x: 0, y: 0, width: newWidth, height: newHeight) + let hasAlpha = cpk_imageHasAlphaChannel(self) + + UIGraphicsBeginImageContextWithOptions(rect.size, !hasAlpha, self.scale) + self.draw(in: rect) + let newImage = UIGraphicsGetImageFromCurrentImageContext() + UIGraphicsEndImageContext() + + return newImage! + } +} + + diff --git a/Cupcake/Label.swift b/Cupcake/Label.swift new file mode 100644 index 0000000..6b06061 --- /dev/null +++ b/Cupcake/Label.swift @@ -0,0 +1,120 @@ +// +// Label.swift +// Cupcake +// +// Created by nerdycat on 2017/3/17. +// Copyright © 2017 nerdycat. All rights reserved. +// + +import UIKit + +public var Label: UILabel { + let label = UILabel() + return label +} + +public extension UILabel { + + /** + * Setting text or attributedText + * str can take any kind of value, even primitive type like Int. + * Usages: + .str(1024) + .str("hello world") + .str( AttStr("hello world").strikethrough() ) + ... + */ + @discardableResult public func str(_ any: Any) -> Self { + if let attStr = any as? NSAttributedString { + self.attributedText = attStr + } else { + self.text = String(describing: any) + } + return self + } + + /** + * Setting font + * font use Font() internally, so it can take any kind of values that Font() supported. + * See Font.swift for more information. + * Usages: + .font(15) + .font("20") + .font("body") + .font("Helvetica,15") + .font(someLabel.font) + ... + **/ + @discardableResult public func font(_ any: Any) -> Self { + self.font = Font(any) + return self + } + + /** + * Setting textColor + * color use Color() internally, so it can take any kind of values that Color() supported. + * See Color.swift for more information. + * Usages: + .color(@"red") + .color(@"#F00") + .color(@"255,0,0") + .color(someLabel.textColor) + ... + */ + @discardableResult public func color(_ any: Any) -> Self { + self.textColor = Color(any) + return self + } + + /** + * Setting numberOfLines + * Usages: + .lines(2) + .lines(0) //multilines + .lines() //same as .lines(0) + */ + @discardableResult public func lines(_ numberOfLines: CGFloat = 0) -> Self { + self.numberOfLines = Int(numberOfLines) + return self + } + + /** + * Setting lineSpacing + * Usages: + .lineGap(8) + */ + @discardableResult public func lineGap(_ lineSpacing: CGFloat) -> Self { + self.cpkLineGap = lineSpacing + return self + } + + /** + * Setting textAlignment + * Usages: + .align(.center) + .align(.justified) + ... + */ + @discardableResult public func align(_ textAlignment: NSTextAlignment) -> Self { + self.textAlignment = textAlignment + return self + } + + /** + * Setup link handler. + * Use onLink in conjunction with AttStr's link method to make text clickable. + * This will automatically set isUserInteractionEnabled to true as well. + * Be aware of retain cycle when using this method. + * Usages: + .onLink({ text in print(text) }) + .onLink({ [weak self] text in //capture self as weak reference when needed + print(text) + }) + */ + @discardableResult func onLink(_ closure: @escaping (String)->()) -> Self { + self.isUserInteractionEnabled = true + self.cpkLinkHandler = closure + return self + } +} + diff --git a/Cupcake/Stack.swift b/Cupcake/Stack.swift new file mode 100644 index 0000000..d2a5f22 --- /dev/null +++ b/Cupcake/Stack.swift @@ -0,0 +1,118 @@ +// +// Stack.swift +// Cupcake +// +// Created by nerdycat on 2017/3/29. +// Copyright © 2017 nerdycat. All rights reserved. +// + +import UIKit + +public enum CPKStackAlignment : Int { + case left //left alignment for VStack + case right //right alignment for VStack + + case center //center alignment for HStack and VStack + case fill //make subviews fill the the Stack + + case baseline //lastBaseline alignment for HStack + + //top alignment for HStack + public static var top: CPKStackAlignment { return CPKStackAlignment.left } + //bottom alignment for HStack + public static var bottom: CPKStackAlignment { return CPKStackAlignment.right } +} + + +/** + * Create horizontal/vertical StackView with items. + + * There are two special items: + 1. Number: represent individual gap between two items. + 2. String: represent a Spring that will take as much space as possible. + + * There are three way to specified spacing between items: + 1. Using Number as StackView item, which will add spacing between two items. + 2. Using .gap() method, which will add spacing to all items. + 3. Using .margin() method on UIView. A negative value of margin will add spacing around view. + + * If you use Number and .gap() at the same time, the individual spacing will take precedence. + + * By default, all items are enclosured inside StackView. + You can make a view exceeding the bounds of StackView by using a positive value of margin. + + * Usages: + HStack( + View.bg("random").pin(30, 30), + 20, + View.bg("random").pin(60, 60), + 20, + View.bg("random").pin(90, 90) + ).pin(.xy(20, 20)).addTo(self.view).border(1) + + VStack( + View.bg("random").pin(30, 30), + View.bg("random").pin(60, 60), + View.bg("random").pin(90, 90) + ).gap(20).pin(.xy(20, 140)).addTo(self.view).border(1) + + VStack( + HStack( + View.bg("random").pin(30, 30), + "<-->", + View.bg("random").pin(30, 30) + ), + View.bg("random").pin(30).margin(-10), + View.bg("random").pin(30).margin(0, 10) + ).embedIn(self.view, 390, 20, 20).border(1) + */ + +public func HStack(_ items: Any...) -> CPKStackView { + let stack = CPKStackView() + stack.axis = .horizontal + stack.alignment = .center + stack.addArrangedSubviews(items: items) + return stack +} + +public func VStack(_ items: Any...) -> CPKStackView { + let stack = CPKStackView() + stack.axis = .vertical + stack.alignment = .left + stack.addArrangedSubviews(items: items) + return stack +} + + +public extension CPKStackView { + + /** + * Universal gap between items. + * For individual gap between items, use Number as StackView item. + * Usages: + .gap(10) + */ + @discardableResult public func gap(_ spacing: CGFloat) -> Self { + self.spacing = spacing + return self + } + + /** + * StackView alignment + * For HStack, the default alignment is .center. + * For VStack, the default alignment is .left. + * Usages: + .align(.top) + .align(.fill) + ... + */ + @discardableResult public func align(_ alignment: CPKStackAlignment) -> Self { + self.alignment = alignment + return self + } +} + + + + + diff --git a/Cupcake/StaticTable.swift b/Cupcake/StaticTable.swift new file mode 100644 index 0000000..069bac3 --- /dev/null +++ b/Cupcake/StaticTable.swift @@ -0,0 +1,447 @@ +// +// StaticTable.swift +// Cupcake +// +// Created by nerdycat on 2017/4/21. +// Copyright © 2017 nerdycat. All rights reserved. +// + +import UIKit + +/** + * PlainTable and GroupTable allow you to create static tableView with ease. + * Usages: + + PlainTable("Option1", "Option2", "Option3").singleCheck().embedIn(self.view) + PlainTable(["Option1", "Option2", "Option3"]).multiCheck().embedIn(self.view) + + GroupTable( + Section( + Row.str("Row1").detail("detail1"), + Row.str("Row2").arrow().onClick({_ in print("row2") }) + ), + + Section( + Row.str("Row3").detail("detail3").style(.subtitle), + Row.str(AttStr("Row4").color("red")).switchOn().onChange({ row in + print(row.switchView.isOn) + }) + ).header(20), + + Row.custom({ row in + Label.str("Delete").color("red").align(.center).embedIn(row.cell.contentView) + }) + + ).embedIn(self.view) + */ + +public func PlainTable(_ sectionsOrRows: Any...) -> StaticTableView { + let tableView = StaticTableView(sectionsOrRows: sectionsOrRows, style: .plain) + tableView.tableFooterView = UIView() + return tableView +} + +public func GroupTable(_ sectionsOrRows: Any...) -> StaticTableView { + return StaticTableView(sectionsOrRows: sectionsOrRows, style: .grouped) +} + +public func Section(_ rowsOrStrings: Any...) -> StaticSection { + return StaticSection(rowsOrStrings: rowsOrStrings) +} + +public var Row: StaticRow { + return StaticRow() +} + + +public extension StaticTableView { + + /** + * Setting font for all titleLabels. + * If you only want to change one particular titleLabel's font, use AttStr instead. + * font use Font() internally, so it can take any kind of values that Font() supported. + * See Font.swift for more information. + * Usages: + .font(15) + .font("20") + .font("body") + .font(someLabel.font) + ... + */ + @discardableResult func font(_ any: Any) -> Self { + self.textFont = any + return self + } + + /** + * Setting textColor for all titleLabels. + * If you only want to change one particular titleLabel's textColor, use AttStr instead. + * color use Color() internally, so it can take any kind of values that Color() supported. + * See Color.swift for more information. + * Usages: + .color(@"red") + .color(@"#F00") + .color(@"255,0,0") + .color(someLabel.textColor) + ... + */ + @discardableResult func color(_ any: Any) -> Self { + self.textColor = any + return self + } + + /** + * Setting font for all detailTextLabels. + * If you only want to change one particular detailTextLabel's font, use AttStr instead. + * font use Font() internally, so it can take any kind of values that Font() supported. + * See Font.swift for more information. + * Usages: + .font(15) + .font("20") + .font("body") + .font(someLabel.font) + ... + */ + @discardableResult func detailFont(_ any: Any) -> Self { + self.detailFont = any + return self + } + + /** + * Setting textColor for all detailTextLabels. + * If you only want to change one particular detailTextLabel's textColor, use AttStr instead. + * color use Color() internally, so it can take any kind of values that Color() supported. + * See Color.swift for more information. + * Usages: + .color(@"red") + .color(@"#F00") + .color(@"255,0,0") + .color(someLabel.textColor) + ... + */ + @discardableResult func detailColor(_ any: Any) -> Self { + self.detailColor = any + return self + } + + /** + * Setting height for all cells. + * Usages: + .rowHeight(50) + .rowHeight(-1) //negative value means use UITableViewAutomaticDimension + */ + @discardableResult func rowHeight(_ height: CGFloat) -> Self { + self.cellHeight = height + return self + } + + /** + * Setting separator line indent for all cells. + * Usages: + .lineIndent(0) + .lineIndent(10) + */ + @discardableResult func lineIndent(_ indent: CGFloat) -> Self { + self.separatorIndent = indent + return self + } + + /** + * Shorthand for setting disclosureIndicator for all cells. + * Usages: + .arrow() + .arrow(false) + */ + @discardableResult func arrow(_ showArrow: Bool = true) -> Self { + self.accessoryType = (showArrow ? .disclosureIndicator : nil) + return self + } + + /** + * Call when cell is about to appear. + * You can use this method to further customize cell. + * Be aware of retain cycle when using this method. + * Usages: + .custom({ [weak self] row in + let cell = row.cell + let indexPath = row.indexPath + ... + }) + */ + @discardableResult func custom(_ handler: @escaping (StaticRow)->()) -> Self { + self.customHandler = handler + return self + } + + /** + * Call when cell is being selected. + * By passing a callback handler, all the cells will become selectable. + * Be aware of retain cycle when using this method. + * Usages: + .onClick({ [weak self] row in + let cell = row.cell + let indexPath = row.indexPath + ... + }) + */ + @discardableResult override func onClick(_ callback: @escaping (StaticRow)->()) -> Self { + self.onClickHandler = callback + return self + } +} + + +public extension StaticSection { + + /** + * Setting section header. + * By default, grouped style tableView' sections have default header and footer height. + * Header can be Number, String, View. + * Usages: + .header(10) //10 point header height, useful for changing GroupTableView's section gap. + .header("Header1") //header with string + .header(headerView) //header with view + */ + @discardableResult func header(_ any: Any) -> Self { + self.headerValue = any + return self + } + + /** + * Setting section footer. + * By default, grouped style tableView' sections have default header and footer height. + * Footer can be Number, String, View. + * Usages: + .footer(10) //10 point footer height, useful for changing GroupTableView's section gap. + .footer("Footer1") //footer with string + .footer(footerView) //footer with view + */ + @discardableResult func footer(_ any: Any) -> Self { + self.footerValue = any + return self + } + + /** + * Turning on single-check behavior for section. + * To find out which cells are being checked, use checkedIndexPaths property on StaticTableView. + * Usages: + .singleCheck() //use system checkmark + .singleCheck("checked") //use custom image + .singleCheck("checked", "unchecked") //use custom images + */ + @discardableResult 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 + return self + } + + /** + * Turning on multi-mheck behavior for section. + * To find out which cells are being checked, use checkedIndexPaths property on StaticTableView. + * Usages: + .multiCheck() //use system checkmark + .multiCheck("checked") //use custom image + .multiCheck("checked", "unchecked") //use custom images + */ + @discardableResult 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 + return self + } +} + + +public extension StaticRow { + + + /** + * Setting image for cell. + * img use Img() internally, so it can take any kind of values that Img() supported. + * See Img.swift for more information. + * Usages: + .img("cat") + .img("#button-background") + .img("$home-icon") + .img(someImage) + ... + */ + @discardableResult func img(_ any: Any) -> Self { + self.image = Img(any) + return self + } + + /** + * Setting text or attributedText for cell's textLabel. + * str can take any kind of value, even primitive type like Int. + * Usages: + .str(1024) + .str("hello world") + .str( AttStr("hello world").strikethrough() ) + ... + */ + @discardableResult func str(_ any: Any) -> Self { + self.text = any + return self + } + + /** + * Setting text or attributedText for cell's detailTextLabel. + * detail can take any kind of value, even primitive type like Int. + * Usages: + .detail(1024) + .detail("hello world") + .detail( AttStr("hello world").strikethrough() ) + ... + */ + @discardableResult func detail(_ any: Any) -> Self { + self.detailText = any + return self + } + + /** + * Setting cell style. + * Usages: + .style(.subtitle) + .style(.value2) + ... + */ + @discardableResult func style(_ style: UITableViewCellStyle) -> Self { + self.cellStyle = style + return self + } + + /** + * Setting accessoryType or accessoryView. + * Usages: + .accessory(.disclosureIndicator) + .accessory(.detailButton) + .accessory(.view(someView)) //setting accessoryView + ... + */ + @discardableResult func accessory(_ type: CPKTableViewCellAccessoryType) -> Self { + self.accessoryType = type + return self + } + + /** + * Shorthand for setting accessoryType with .disclosureIndicator. + * Usages: + .arrow() + .arrow(false) + */ + @discardableResult func arrow(_ showArrow: Bool = true) -> Self { + self.accessoryType = showArrow ? .disclosureIndicator : CPKTableViewCellAccessoryType.none + return self + } + + /** + * Shorthand for setting accessoryType with .checkmark. + * Usages: + .check() + .check(false) + */ + @discardableResult func check(_ checked: Bool = true) -> Self { + self.accessoryType = checked ? .checkmark : CPKTableViewCellAccessoryType.none + return self + } + + /** + * Shorthand for setting accessoryView with UISwitch. + * Usages: + .switchOn() + .switchOn(false) + */ + @discardableResult func switchOn(_ isOn: Bool = true) -> Self { + let sw: UISwitch! = self.switchView ?? {self.switchView = UISwitch(); return self.switchView}() + sw.isOn = isOn + self.accessory(.view(sw)) + return self + } + + /** + * Settting cell height. + * Usages: + .height(50) + .height(-1) //negative value means use UITableViewAutomaticDimension + */ + @discardableResult func height(_ height: CGFloat) -> Self { + self.cellHeight = height + return self + } + + /** + * Setting separator line indent. + * Usages: + .lineIndent(10) + */ + @discardableResult func lineIndent(_ indent: CGFloat) -> Self { + self.separatorIndent = indent + return self + } + + /** + * Call when cell is being selected. + * By passing a callback handler, the cell become selectable. + * Be aware of retain cycle when using this method. + * Usages: + .onClick({ [weak self] row in + let cell = row.cell + let indexPath = row.indexPath + ... + }) + */ + @discardableResult override func onClick(_ callback: @escaping (StaticRow)->()) -> Self { + self.onClickHandler = callback + return self + } + + /** + * Call when cell's detailButton is being clicked. + * Be aware of retain cycle when using this method. + * Usages: + .onButton({ [weak self] row in + let cell = row.cell + let indexPath = row.indexPath + ... + }) + */ + @discardableResult func onButton(_ callback: @escaping (StaticRow)->()) -> Self { + self.onButtonHandler = callback + return self + } + + /** + * Call when switch's value is changed. + * Be aware of retain cycle when using this method. + * Usages: + .onChange({ [weak self] row in + let sw = row.switchView + let indexPath = row.indexPath + ... + }) + */ + @discardableResult func onChange(_ callback: @escaping (StaticRow)->()) -> Self { + self.onChangeHandler = callback + return self + } + + /** + * Call when cell is about to appear. + * You can use this method to further customize cell. + * Usages: + .custom({ row in + let cell = row.cell + let indexPath = row.indexPath + ... + }) + */ + @discardableResult func custom(_ handler: @escaping (StaticRow)->()) -> Self { + self.customHandler = handler + return self + } +} + + + diff --git a/Cupcake/Str.swift b/Cupcake/Str.swift new file mode 100644 index 0000000..faffe13 --- /dev/null +++ b/Cupcake/Str.swift @@ -0,0 +1,160 @@ +// +// Str.swift +// Cupcake +// +// Created by nerdycat on 2017/3/17. +// Copyright © 2017 nerdycat. All rights reserved. +// + +import UIKit + +/** + * Create String from formatted string. + * Also can be use to convert any type to String. + * Usages: + Str("1+1=%d", 2) //"1+1=2" + Str(1024) //"1024" + Str(3.14) //"3.14" + ... + */ +public func Str(_ any: Any, _ arguments: CVarArg...) -> String { + let str = String(format: String(describing: any), arguments: Array(arguments)) + return str +} + + +public extension String { + + /** + * Return substring from index or to some particular string. + * Usages: + "hello world".subFrom(6) //"world" + "hello world".subFrom(-5) //"world" + "hello world".subFrom("wo") //"world" + */ + @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)) + + } else if let substr = indexOrSubstring as? String { + if let range = self.range(of: substr) { + return self.substring(from: range.lowerBound) + } + } + + return "" + } + + + /** + * Return substring to index or to some particular string. + * Usages: + "hello world".subTo(5) //"hello" + "hello world".subTo(-6) //"hello" + "hello world".subTo(" ") //"hello" + */ + @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)) + + } else if let substr = indexOrSubstring as? String { + if let range = self.range(of: substr) { + return self.substring(to: range.lowerBound) + } + } + + return "" + } + + + /** + * Return substring at index or in range. + * Usages: + "hello world".subAt(1) //"e" + "hello world".subAt(1..<4) //"ell" + */ + @discardableResult public func subAt(_ indexOrRange: Any) -> String { + if let index = indexOrRange as? Int { + return String(self[self.index(self.startIndex, offsetBy: index)]) + + } else if let range = indexOrRange as? Range { + return self.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.. String { + let options = NSRegularExpression.Options(rawValue: 0) + + if let exp = try? NSRegularExpression(pattern: pattern, options: options) { + let options = NSRegularExpression.MatchingOptions(rawValue: 0) + + let matchRange = exp.rangeOfFirstMatch(in: self, + options:options, + range: NSMakeRange(0, self.characters.count)) + + if matchRange.location != NSNotFound { + return self.subAt(matchRange) + } + } + + return "" + } + + + /** + * Replace substring with template. + * Usages: + "abc123".subReplace("abc", "ABC") //ABC123 + "abc123".subReplace("([a-z]+)(\\d+)", "$2$1") //"123abc" + */ + @discardableResult public func subReplace(_ pattern: String, _ template: String) -> String { + let options = NSRegularExpression.Options(rawValue: 0) + + if let exp = try? NSRegularExpression(pattern: pattern, options: options) { + let options = NSRegularExpression.MatchingOptions(rawValue: 0) + + return exp.stringByReplacingMatches(in: self, + options: options, + range: NSMakeRange(0, self.characters.count), + withTemplate: template) + } + + return "" + } +} + diff --git a/Cupcake/Styles.swift b/Cupcake/Styles.swift new file mode 100644 index 0000000..0697fb9 --- /dev/null +++ b/Cupcake/Styles.swift @@ -0,0 +1,160 @@ +// +// Styles.swift +// Cupcake +// +// Created by nerdycat on 2017/5/3. +// Copyright © 2017 nerdycat. All rights reserved. +// + +import UIKit + + +/** + * Some of the chainable property can be set as style. + + * There are two type of styles: + 1) Global style: + Styles("GlobalStyleName").color("red").font(15) + 2) Local style: + let localStyle = Styles.color("red").font(15) + + * After creation, you can apply styles to any UIView: + Label.styles("GlobalStyleName", localStyle) + Button.styles(localStyle).font(17) + */ + +public var Styles: StylesMaker { + return StylesMaker() +} + +public func Styles(_ name: String) -> StylesMaker { + let makers = StylesMaker() + StylesMaker.globalStyles[name] = makers + return makers +} + + +public extension StylesMaker { + + //View + @discardableResult public func bg(_ any: Any) -> Self { + return addStyle(key: #function, value: any) + } + + @discardableResult public func tint(_ any: Any) -> Self { + return addStyle(key: #function, value: any) + } + + @discardableResult public func radius(_ cornerRadius: CGFloat) -> Self { + return addStyle(key: #function, value: cornerRadius) + } + + @discardableResult public func border(_ borderWidth: CGFloat, _ borderColor: Any? = nil) -> Self { + var dict: Dictionary = ["borderWidth": borderWidth] + if let color = borderColor { + dict["borderColor"] = color + } + return addStyle(key: #function, value: dict) + } + + @discardableResult public func shadow(_ shadowOpacity: CGFloat, + _ shadowRadius: CGFloat = 3, + _ shadowOffsetX: CGFloat = 0, + _ shadowOffsetY: CGFloat = 3) -> Self { + + let dict: Dictionary = ["opacity": shadowOpacity, + "radius": shadowRadius, + "offsetX": shadowOffsetX, + "offsetY": shadowOffsetY] + + return addStyle(key: #function, value: dict) + } + + @discardableResult public func pin(_ options: CPKViewPinOptions...) -> Self { + return addStyle(key: #function, value: options) + } + + + //Label + @discardableResult public func str(_ any: Any) -> Self { + return addStyle(key: #function, value: any) + } + + @discardableResult public func font(_ any: Any) -> Self { + return addStyle(key: #function, value: any) + } + + @discardableResult public func color(_ any: Any) -> Self { + return addStyle(key: #function, value: any) + } + + @discardableResult public func lines(_ numberOfLines: CGFloat = 0) -> Self { + return addStyle(key: #function, value: numberOfLines) + } + + @discardableResult public func lineGap(_ lineSpacing: CGFloat) -> Self { + return addStyle(key: #function, value: lineSpacing) + } + + @discardableResult public func align(_ textAlignment: NSTextAlignment) -> Self { + return addStyle(key: #function, value: textAlignment) + } + + + //ImageView + @discardableResult public func img(_ any: Any) -> Self { + return addStyle(key: #function, value: any) + } + + @discardableResult public func mode(_ contentMode: UIViewContentMode) -> Self { + return addStyle(key: #function, value: contentMode) + } + + + //Button + @discardableResult public func highColor(_ any: Any) -> Self { + return addStyle(key: #function, value: any) + } + + @discardableResult public func highBg(_ any: Any) -> Self { + return addStyle(key: #function, value: any) + } + + @discardableResult public func padding(_ contentEdgeInsets: CGFloat...) -> Self { + return addStyle(key: #function, value: contentEdgeInsets) + } + + @discardableResult public func gap(_ spacing: CGFloat) -> Self { + return addStyle(key: #function, value: spacing) + } + + @discardableResult public func reversed(_ reversed: Bool = true) -> Self { + return addStyle(key: #function, value: reversed) + } + + + //TextField + @discardableResult public func maxLength(_ length: CGFloat) -> Self { + return addStyle(key: #function, value: length) + } + + @discardableResult public func secure(_ secureTextEntry: Bool = true) -> Self { + return addStyle(key: #function, value: secureTextEntry) + } + + @discardableResult public func keyboard(_ keyboardType: UIKeyboardType) -> Self { + return addStyle(key: #function, value: keyboardType) + } + + @discardableResult public func returnKey(_ returnKeyType: UIReturnKeyType) -> Self { + return addStyle(key: #function, value: returnKeyType) + } + + @discardableResult public func clearMode(_ clearButtonMode: UITextFieldViewMode) -> Self { + return addStyle(key: #function, value: clearButtonMode) + } +} + + + + diff --git a/Cupcake/TextField.swift b/Cupcake/TextField.swift new file mode 100644 index 0000000..a73e85d --- /dev/null +++ b/Cupcake/TextField.swift @@ -0,0 +1,198 @@ +// +// TextField.swift +// Cupcake +// +// Created by nerdycat on 2017/3/24. +// Copyright © 2017 nerdycat. All rights reserved. +// + +import UIKit + +var TextField: UITextField { + let textField = UITextField() + textField.enablesReturnKeyAutomatically = true + textField.returnKeyType = .done + return textField +} + +extension UITextField { + + /** + * Setting text or attributedText + * str can take any kind of value, even primitive type like Int. + * Usages: + .str(1024) + .str("hello world") + .str( AttStr("hello world").strikethrough() ) + ... + */ + @discardableResult public func str(_ any: Any) -> Self { + if let attStr = any as? NSAttributedString { + self.attributedText = attStr + } else { + self.text = String(describing: any) + } + return self + } + + /** + * Setting placeholder or attributedPlaceholder + * hint can take any kind of value, even primitive type like Int. + * Usages: + .hint(1024) + .hint("Enter your name") + .hint( AttStr("Enter your name").font(13) ) + */ + @discardableResult public func hint(_ any: Any) -> Self { + if let attStr = any as? NSAttributedString { + self.attributedPlaceholder = attStr + } else { + self.placeholder = String(describing: any) + } + return self + } + + /** + * Setting font + * font use Font() internally, so it can take any kind of values that Font() supported. + * See Font.siwft for more information. + * Usages: + .font(15) + .font("20") + .font("body") + .font(someLabel.font) + ... + **/ + @discardableResult public func font(_ any: Any) -> Self { + self.font = Font(any) + return self + } + + /** + * Setting textColor + * color use Color() internally, so it can take any kind of values that Color() supported. + * See Color.swift for more information. + * Usages: + .color(@"red") + .color(@"#F00") + .color(@"255,0,0") + .color(someLabel.textColor) + ... + */ + @discardableResult public func color(_ any: Any) -> Self { + self.textColor = Color(any) + return self + } + + /** + * Max input length + * Usages: + .maxLength(10) + */ + @discardableResult public func maxLength(_ length: CGFloat) -> Self { + self.cpkMaxLength = Int(length) + return self + } + + /** + * contentEdgeInsets for UITextField + * Usages: + .padding(10) //top: 10, left: 10, bottom: 10, right: 10 + .padding(10, 20) //top: 10, left: 20, bottom: 10, right: 20 + .padding(10, 20, 30) //top: 10, left: 20, bottom: 0 , right: 30 + .padding(10, 20, 30, 40) //top: 10, left: 20, bottom: 30, right: 40 + */ + @discardableResult public func padding(_ contentEdgeInsets: CGFloat...) -> Self { + cpk_updatePadding(contentEdgeInsets, forView: self) + return self + } + + /** + * secureTextEntry + * Usages: + .secure() //secureTextEntry = true + .secure(false) //secureTextEntry = false + */ + @discardableResult public func secure(_ secureTextEntry: Bool = true) -> Self { + self.isSecureTextEntry = secureTextEntry + return self + } + + /** + * Setting textAlignment + * Usages: + .align(.center) + .align(.justified) + ... + */ + @discardableResult public func align(_ textAlignment: NSTextAlignment) -> Self { + self.textAlignment = textAlignment + return self + } + + /** + * Setting keyboardType + * Usages: + .keyboard(.numberPad) + .keyboard(.emailAddress) + ... + */ + @discardableResult public func keyboard(_ keyboardType: UIKeyboardType) -> Self { + self.keyboardType = keyboardType + return self + } + + /** + * Setting returnKeyType + * Usages: + .returnKey(.send) + .returnKey(.google) + ... + */ + @discardableResult public func returnKey(_ returnKeyType: UIReturnKeyType) -> Self { + self.returnKeyType = returnKeyType + return self + } + + /** + * Setting clearButtonMode + * Usages: + .clearMode(.whileEditing) + .clearMode(.always) + ... + */ + @discardableResult public func clearMode(_ clearButtonMode: UITextFieldViewMode) -> Self { + self.clearButtonMode = clearButtonMode + return self + } + + /** + * Setup text changed handler. + * Be aware of retain cycle when using this method. + * Usages: + .onChange({ textField in /* ... */ }) + .onChange({ _ in /* ... */ }) + .onChange({ [weak self] textField in /* ... */ }) //capture self as weak reference when needed + */ + @discardableResult func onChange(_ closure: @escaping (UITextField)->()) -> Self { + self.cpkTextChangedClosure = cpk_generateCallbackClosure(closure, nil) + return self + } + + /** + * Setup enter finished handler. + * The handler will be called when user click the return button. + * Be aware of retain cycle when using this method. + * Usages: + .onFinish({ textField in /* ... */ }) + .onFinish({ _ in /* ... */ }) + .onFinish({ [weak self] textField in /* ... */ }) //capture self as weak reference when needed + */ + @discardableResult func onFinish(_ closure: @escaping (UITextField)->()) -> Self { + self.cpkDidEndOnExistClosure = cpk_generateCallbackClosure(closure, nil) + return self + } +} + + + diff --git a/Cupcake/TextView.swift b/Cupcake/TextView.swift new file mode 100644 index 0000000..a9075ae --- /dev/null +++ b/Cupcake/TextView.swift @@ -0,0 +1,130 @@ +// +// TextView.swift +// Cupcake +// +// Created by nerdycat on 2017/3/25. +// Copyright © 2017 nerdycat. All rights reserved. +// + +import UIKit + +var TextView: UITextView { + return UITextView().font(17) +} + +extension UITextView { + + /** + * Setting text or attributedText + * str can take any kind of value, even primitive type like Int. + * Usages: + .str(1024) + .str("hello world") + .str( AttStr("hello world").strikethrough() ) + ... + */ + @discardableResult public func str(_ any: Any) -> Self { + if let attStr = any as? NSAttributedString { + self.attributedText = attStr + } else { + self.text = String(describing: any) + } + return self + } + + /** + * Setting placeholder or attributedPlaceholder + * hint can take any kind of value, even primitive type like Int. + * Usages: + .hint(1024) + .hint("Enter here") + .hint( AttStr("Enter here").font(13) ) + */ + @discardableResult public func hint(_ any: Any) -> Self { + cpk_setPlaceholder(any) + return self + } + + /** + * Setting font + * font use Font() internally, so it can take any kind of values that Font() supported. + * See Font.siwft for more information. + * Usages: + .font(15) + .font("20") + .font("body") + .font(someLabel.font) + ... + **/ + @discardableResult public func font(_ any: Any) -> Self { + self.font = Font(any) + return self + } + + /** + * Setting textColor + * color use Color() internally, so it can take any kind of values that Color() supported. + * See Color.swift for more information. + * Usages: + .color(@"red") + .color(@"#F00") + .color(@"255,0,0") + .color(someLabel.textColor) + ... + */ + @discardableResult public func color(_ any: Any) -> Self { + self.textColor = Color(any) + return self + } + + /** + * Max input length + * Usages: + .maxLength(10) + */ + @discardableResult public func maxLength(_ length: CGFloat) -> Self { + self.cpkMaxLength = Int(length) + return self + } + + /** + * contentEdgeInsets for UITextView + * Usages: + .padding(10) //top: 10, left: 10, bottom: 10, right: 10 + .padding(10, 20) //top: 10, left: 20, bottom: 10, right: 20 + .padding(10, 20, 30) //top: 10, left: 20, bottom: 0 , right: 30 + .padding(10, 20, 30, 40) //top: 10, left: 20, bottom: 30, right: 40 + */ + @discardableResult public func padding(_ contentEdgeInsets: CGFloat...) -> Self { + cpk_updatePadding(contentEdgeInsets, forView: self) + return self + } + + /** + * Setting textAlignment + * Usages: + .align(.center) + .align(.justified) + ... + */ + @discardableResult public func align(_ textAlignment: NSTextAlignment) -> Self { + self.textAlignment = textAlignment + return self + } + + /** + * Setup text changed handler. + * Be aware of retain cycle when using this method. + * Usages: + .onChange({ textView in /* ... */ }) + .onChange({ _ in /* ... */ }) + .onChange({ [weak self] textView in /* ... */ }) //capture self as weak reference when needed + */ + @discardableResult func onChange(_ closure: @escaping (UITextView)->()) -> Self { + self.cpkTextChangedClosure = cpk_generateCallbackClosure(closure, nil) + return self + } +} + + + diff --git a/Cupcake/View.swift b/Cupcake/View.swift new file mode 100644 index 0000000..f3260f0 --- /dev/null +++ b/Cupcake/View.swift @@ -0,0 +1,362 @@ +// +// View.swift +// Cupcake +// +// Created by nerdycat on 2017/3/22. +// Copyright © 2017 nerdycat. All rights reserved. +// + +import UIKit + +public var View: UIView { + let view = UIView() + return view +} + +extension UIView { + + /** + * Setting background with Color or Image. + * bg use Color() internally, so it can take any kind of values that Color() supported. + * See Color.swift for more information. + * Usages: + .bg(@"red") + .bg(@"#F00") + .bg(@"255,0,0") + .bg(someView.backgroundColor) + .bg("cat") //using image + ... + */ + @discardableResult public func bg(_ any: Any) -> Self { + self.backgroundColor = Color(any) ?? Color(Img(any)) + return self + } + + /** + * Setting tintColor + * tint use Color() internally, so it can take any kind of values that Color() supported. + * See Color.swift for more information. + * Usages: + .tint("red") + .tint("#00F") + */ + @discardableResult public func tint(_ any: Any) -> Self { + self.tintColor = Color(any) + return self + } + + /** + * Setting cornerRadius + * radius support auto rounding, which is a very useful trick when working with AutoLayout. + * Auto rounding will alway set cornerRadius to half of the height not matter what size it is. + * Usages: + .radius(10) + .radius(-1) //passing negative number means using auto rounding + */ + @discardableResult public func radius(_ cornerRadius: CGFloat) -> Self { + if cornerRadius >= 0 { + self.layer.cornerRadius = cornerRadius + self.cpkAutoRoundingRadius = false + } else { + self.layer.cornerRadius = self.bounds.height / 2 + self.cpkAutoRoundingRadius = true + } + + cpk_masksToBoundsIfNeed() + return self + } + + /** + * Setting border with borderWidth and borderColor (optional). + * border's second argument use Color() internally, so it can take any kind of values that Color() supported. + * See Color.swift for more information. + * Usages: + .border(1) + .border(1, "red") + */ + @discardableResult public func border(_ borderWidth: CGFloat, _ borderColor: Any? = nil) -> Self { + self.layer.borderWidth = borderWidth + self.layer.borderColor = Color(borderColor)?.cgColor + return self + } + + /** + * Drop shadow with opacity, radius (optional) and offset (optional). + * Usages: + .shadow(1) + .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 { + + self.layer.shadowOpacity = Float(shadowOpacity) + self.layer.shadowRadius = shadowRadius + self.layer.shadowOffset = CGSize(width: shadowOffsetX, height: shadowOffsetY) + return self + } + + + /** + * Apply at most 4 styles to view. + * See Styles.swift for more information. + Usages: + .styles(myStyle) + .styles(myStyle1, myStyle2, "globalStyle1") + */ + @discardableResult public func styles(_ s1: Any, _ s2: Any? = nil, _ s3: Any? = nil, _ s4: Any? = nil) -> Self { + var array = Array() + array.append(s1) + + if s2 != nil { array.append(s2!) } + if s3 != nil { array.append(s3!) } + if s4 != nil { array.append(s4!) } + + for styles in array { + if let style = styles as? StylesMaker { + style.applyTo(view: self) + + } else if let name = styles as? String { + if let style = StylesMaker.globalStyles[name] { + style.applyTo(view: self) + } + } + } + return self + } + + /** + * Setting touch insets. + * Very useful for extending touch area. + * It can take variety of forms. + * Usages: + .touchInsets(10) //top: 10, left: 10, bottom: 10, right: 10 + .touchInsets(10, 20) //top: 10, left: 20, bottom: 10, right: 20 + .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 { + self.cpkTouchInsets = cpk_edgeInsetsFromParameters(p1, p2, p3, p4) + return self + } + + /** + * Setup click handler. + * This will automatically set isUserInteractionEnabled to true as well. + * Be aware of retain cycle when using this method. + * Usages: + .onClick({ view in /* ... */ }) //the view being clicked is pass as parameter + .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 { + cpk_onClick(closure, nil) + return self + } + + /** + * Add current view to superview. + * Usages: + .addTo(superView) + */ + @discardableResult public func addTo(_ superview: UIView) -> Self { + superview.addSubview(self) + return self + } + + /** + * Add multiply subviews at the same time. + * Usages: + .addSubview(view1, view2, view3) + */ + @discardableResult public func addSubviews(_ children: Any...) -> Self { + func addChildren(_ children: Array) { + for child in children { + if let view = child as? UIView { + self.addSubview(view) + } else if let array = child as? Array { + addChildren(array) + } + } + } + + addChildren(children) + return self + } +} + + + +public extension UIView { + + /** + * Setting layout margins. + * Very useful when embed in StackView. + * It can take variety of forms. + * Usages: + .margin(10) //top: 10, left: 10, bottom: 10, right: 10 + .margin(10, 20) //top: 10, left: 20, bottom: 10, right: 20 + .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 { + self.layoutMargins = cpk_edgeInsetsFromParameters(p1, p2, p3, p4) + return self + } + + /** + * An easy way to setup constraints relative to superview. + * You can pass multiply options at the same time. + + * Usages: + .pin(.x(20)) //add left constraint + .pin(.y(20)) //add top constraint + .pin(.xy(20, 20)) //and left and top constraints + + .pin(.w(100)) //add width constraint + .pin(.h(100)) //add height constraint + .pin(.wh(100, 100)) //add width and height constraints + + .pin(.xywh(20, 20, 100, 100)) //add left, top, width and height constraints + + .pin(.maxX(-20)) //add right constraint + .pin(.maxY(-20)) //add bottom constraint + .pin(.maxXY(-20, -20)) //add right and bottom constraints + + .pin(.centerX(0)) //add centerX constriant + .pin(.centerY(0)) //add centerY constraint + .pin(.centerXY(0, 0)) //add centerX and centerY constraints + .pin(.center) //add centerX and centerY constraints with offset of 0 + + .pin(.whRatio(2)) //width = height * 2 constraint + .pin(.ratio) //width = height * currentSizeRatio constraint, very useful for ImageView + + .pin(.lowHugging) //Low content hugging priority, very useful when embed in StackView. + //The lowest hugging view will take as much space as possible. + + .pin(.lowRegistance) //Low content compression resistance priority, very useful when embed in StackView. + //The lowest resistance view will be compressed when there are no more space available. + + .pin(100) //shorthand for .pin(.h(100)) + .pin(100, 100) //shorthand for .pin(.wh(100, 100)) + .pin(20, 20, 100, 100) //shorthand for .pin(.xywh(20, 20, 100, 100)) + + //pass multiply options at the same time + .pin(.xy(20, 20), .maxX(-20), 100) + .pin(100, 100, .center) + ... + */ + @discardableResult public func pin(_ options: CPKViewPinOptions...) -> Self { + cpk_pinOptions(options, forView: self) + return self + } + + /** + * Making constraints just like SnapKit. + * makeCons will only create new constraints when needed. + * Usages: + .makeCons({ + _.left.top.equal(someView).offset(20, 20) + _.size.equal(100, 100) + }) + */ + @discardableResult public func makeCons(_ closure: (ConsMaker)->()) -> Self { + let maker = ConsMaker(firstItem: self) + closure(maker) + maker.updateConstraints() + return self + } + + /** + * Remake constarints just like SnapKit. + * remakeCons will remove all previous installed constarints first. + * Usages: + .makeCons({ + _.center.equal(someView) + _.size.equal(anotherView) + }) + */ + @discardableResult public func remakeCons(_ closure: (ConsMaker)->()) -> Self { + let maker = ConsMaker(firstItem: self) + closure(maker) + maker.remakeConstraints() + return self + } + + /** + * Embed self into superview with optional edge constraints. + * Passing nil means no constraint. + * Usages: + .embedIn(superview) //top: 0, left: 0, bottom: 0, right: 0 + .embedIn(superview, 10) //top: 10, left: 10, bottom: 10, right: 10 + .embedIn(superview, 10, 20) //top: 10, left: 20, bottom: 10, right: 20 + .embedIn(superview, 10, 20, 30) //top: 10, left: 20, right: 30 + .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 { + + superview.addSubview(self) + let edge = cpk_edgeInsetsTupleFromParameters(p1, p2, p3, p4) + + makeCons({ + if let top = edge.0 { + $0.top.offset(top) + } + if let left = edge.1 { + $0.left.offset(left) + } + if let bottom = edge.2 { + $0.bottom.offset(-bottom) + } + if let right = edge.3 { + $0.right.offset(-right) + } + }) + + return self + } +} + + +public enum CPKViewPinOptions { + case x(CGFloat) //left constraint + case y(CGFloat) //top constraint + case xy(CGFloat, CGFloat) //left and top constraints + + case w(CGFloat) //width constraint + case h(CGFloat) //height constraint + case wh(CGFloat, CGFloat) //width and height constraints + + case xywh(CGFloat, CGFloat, //left, top, width and height constraints + CGFloat, CGFloat) + + case maxX(CGFloat) //right constraint + case maxY(CGFloat) //bottom constraint + case maxXY(CGFloat, CGFloat) //right and bottom constraint + + case centerX(CGFloat) //centerX constraint + case centerY(CGFloat) //centerY constraint + case centerXY(CGFloat, CGFloat) //centerX and centerY constraints + case center //centerX and centerY constraints with offset of 0 + + case whRatio(CGFloat) //width = height * ratio constraint + case ratio //width = height * currentSizeRatio constraint + + case hhp(UILayoutPriority) //horizontal content hugging priority + case vhp(UILayoutPriority) //vertical content hugging priority + case hrp(UILayoutPriority) //horizontal content compression resistance priority + case vrp(UILayoutPriority) //vertical content compression resistance priority + + case lowHugging //low content hugging priority + case lowResistance //low content compression resistance priority + + case ___value(CGFloat) //private usage +} + + diff --git a/Cupcake/__Privates__Implementation__.swift b/Cupcake/__Privates__Implementation__.swift new file mode 100644 index 0000000..4feaad3 --- /dev/null +++ b/Cupcake/__Privates__Implementation__.swift @@ -0,0 +1,3312 @@ +// +// __Privates__.swift +// Cupcake +// +// Created by nerdycat on 2017/6/8. +// Copyright © 2017 nerdycat. All rights reserved. +// + + +import UIKit +import UIKit.UIGestureRecognizerSubclass + + + +/** + * Note: + * This file contains most of the implementation codes. + * You don't have to know the details while using Cupcake. + */ + + + + + + +//MARK: Utils + +func Sel(_ any: Any) -> Selector? { + if let sel = any as? Selector { + return sel + + } else if let selString = any as? String { + return NSSelectorFromString(selString) + + } else { + return nil + } +} + +func CPKFloat(_ any: Any?) -> CGFloat { + if any == nil { return 0 } + + if let result = CPKFloatOptional(any) { + return result + } else { + assert(false, "invalid float") + } +} + +func CPKFloatOptional(_ any: Any?) -> CGFloat? { + + if any == nil { + return nil + + } else { + if let value = any as? CGFloat { return value } + if let value = any as? String { let f = Float(value); return f != nil ? CGFloat(f!) : nil } + + if let value = any as? Int { return CGFloat(value) } + if let value = any as? UInt { return CGFloat(value) } + + if let value = any as? Double { return CGFloat(value) } + if let value = any as? Float { return CGFloat(value) } + + if let value = any as? Int8 { return CGFloat(value) } + if let value = any as? UInt8 { return CGFloat(value) } + if let value = any as? Int16 { return CGFloat(value) } + if let value = any as? UInt16 { return CGFloat(value) } + if let value = any as? Int32 { return CGFloat(value) } + if let value = any as? UInt32 { return CGFloat(value) } + if let value = any as? Int64 { return CGFloat(value) } + if let value = any as? UInt64 { return CGFloat(value) } + + return nil + } +} + +func cpk_onePointImageWithColor(_ color: UIColor) -> UIImage { + let rect = CGRect(x: 0, y: 0, width: 1, height: 1) + let hasAlpha = cpk_colorHasAlphaChannel(color) + UIGraphicsBeginImageContextWithOptions(rect.size, !hasAlpha, UIScreen.main.scale) + + let context = UIGraphicsGetCurrentContext()! + context.setFillColor(color.cgColor) + context.fill(rect) + + let image = UIGraphicsGetImageFromCurrentImageContext() + UIGraphicsEndImageContext() + + return image! +} + +fileprivate func cpk_colorHasAlphaChannel(_ color: UIColor) -> Bool { + return color.cgColor.alpha < 1; +} + +func cpk_imageHasAlphaChannel(_ image: UIImage) -> Bool { + if let alphaInfo = image.cgImage?.alphaInfo { + return alphaInfo == .first || + alphaInfo == .last || + alphaInfo == .premultipliedFirst || + alphaInfo == .premultipliedLast + } else { + return false + } +} + +func cpk_edgeInsetsFromArray(_ insetArray: [CGFloat]) -> UIEdgeInsets { + if insetArray.count == 0 { + return UIEdgeInsetsMake(0, 0, 0, 0) + + } else if insetArray.count == 1 { + let m1 = insetArray[0] + return UIEdgeInsetsMake(m1, m1, m1, m1) + + } else if insetArray.count == 2 { + let m1 = insetArray[0] + let m2 = insetArray[1] + return UIEdgeInsetsMake(m1, m2, m1, m2) + + } else if insetArray.count == 3 { + let m1 = insetArray[0] + let m2 = insetArray[1] + let m3 = insetArray[2] + return UIEdgeInsetsMake(m1, m2, 0, m3) + + } else { + let m1 = insetArray[0] + let m2 = insetArray[1] + let m3 = insetArray[2] + let m4 = insetArray[3] + return UIEdgeInsetsMake(m1, m2, m3, m4) + } +} + +func cpk_edgeInsetsFromParameters(_ p1: Any, _ p2: Any? = nil, _ p3: Any? = nil, _ p4: Any? = nil) -> UIEdgeInsets { + var array = [CGFloat]() + array.append(CPKFloat(p1)) + + if p2 != nil { array.append(CPKFloat(p2!)) } + if p3 != nil { array.append(CPKFloat(p3!)) } + if p4 != nil { array.append(CPKFloat(p4!)) } + + return cpk_edgeInsetsFromArray(array) +} + +func cpk_edgeInsetsTupleFromParameters(_ p1: Any? = "", + _ p2: Any? = "", + _ p3: Any? = "", + _ p4: Any? = "") + + -> (CGFloat?, CGFloat?, CGFloat?, CGFloat?) { + + var leftOffset: CGFloat? + var rightOffset: CGFloat? + var topOffset: CGFloat? + var bottomOffset: CGFloat? + + let isValidP1 = !(p1 is String) + let isValidP2 = !(p2 is String) + let isValidP3 = !(p3 is String) + let isValidP4 = !(p4 is String) + + if isValidP1 && isValidP2 && isValidP3 && isValidP4 { + topOffset = CPKFloatOptional(p1) + leftOffset = CPKFloatOptional(p2) + bottomOffset = CPKFloatOptional(p3) + rightOffset = CPKFloatOptional(p4) + + } else if isValidP1 && isValidP2 && isValidP3 { + topOffset = CPKFloatOptional(p1) + leftOffset = CPKFloatOptional(p2) + rightOffset = CPKFloatOptional(p3) + + } else if isValidP1 && isValidP2 { + topOffset = CPKFloatOptional(p1) + leftOffset = CPKFloatOptional(p2) + bottomOffset = CPKFloatOptional(p1) + rightOffset = CPKFloatOptional(p2) + + } else if isValidP1 { + topOffset = CPKFloatOptional(p1) + leftOffset = CPKFloatOptional(p1) + bottomOffset = CPKFloatOptional(p1) + rightOffset = CPKFloatOptional(p1) + + } else { + topOffset = 0 + leftOffset = 0 + bottomOffset = 0 + rightOffset = 0 + } + + return (topOffset, leftOffset, bottomOffset, rightOffset) +} + +func cpk_reversedEdgeInsetsFromArray(_ insetArray: [CGFloat]) -> UIEdgeInsets { + var insets = cpk_edgeInsetsFromArray(insetArray) + insets.top = -insets.top + insets.left = -insets.left + insets.bottom = -insets.bottom + insets.right = -insets.right + return insets +} + +func cpk_higherHuggingAndResistance(forView view: UIView) { + view.setContentHuggingPriority(251, for: .horizontal) + view.setContentHuggingPriority(251, for: .vertical) + view.setContentCompressionResistancePriority(751, for: .horizontal) + view.setContentCompressionResistancePriority(751, for: .vertical) +} + +func cpk_limitTextInput(_ textInput: UITextInput, maxLength: Int) -> Bool { + + if textInput.markedTextRange?.start != nil { + return true + + } else { + if maxLength > 0, let view = textInput as? UIView { + if let text = view.value(forKey: "text") as? String { + + if text.characters.count > maxLength { + let newText = text.subTo(maxLength) + var needResetCursorPosition = false + + let selectedRange = textInput.selectedTextRange + + if selectedRange != nil && selectedRange!.isEmpty { + let cursorPosition = selectedRange!.start + + if let maxPosition = textInput.position(from: textInput.beginningOfDocument, + offset: maxLength) { + if textInput.compare(cursorPosition, to: maxPosition) == .orderedAscending { + needResetCursorPosition = true + } + } + } + + view.setValue(newText, forKey: "text") + + if needResetCursorPosition { + textInput.selectedTextRange = selectedRange + } + } + } + } + + return false + } +} + +func cpk_getTopViewController() -> UIViewController? { + func getTopViewController(root: UIViewController?) -> UIViewController? { + if let navVC = root as? UINavigationController { + return getTopViewController(root: navVC.viewControllers.last) + + } else if let tabVC = root as? UITabBarController { + return getTopViewController(root: tabVC.selectedViewController) + + } else if root != nil, let presentedVC = root!.presentedViewController { + return presentedVC + + } else { + return root + } + } + + let window = UIApplication.shared.delegate?.window + return getTopViewController(root: window??.rootViewController) +} + +func cpk_commonAncestorFor(item1: UIView?, item2: UIView?) -> UIView? { + if let view1 = item1 { + if let view2 = item2 { + + var view: UIView? = view1 + while view != nil && !view2.isDescendant(of: view!) { + view = view?.superview + } + + return view + + } else { + return item1 + } + + } else { + return item2 + } +} + +func cpk_updatePadding(_ padding: [CGFloat], forView view: UIView) { + if let button = view as? UIButton { + var insets = cpk_edgeInsetsFromArray(padding) + button.cpkInsets = insets + let halfGap = (button.cpkGap ?? 0) / 2 + + insets.left += halfGap + insets.right += halfGap + button.contentEdgeInsets = insets + + } else if let textField = view as? UITextField { + textField.cpkPadding = cpk_edgeInsetsFromArray(padding) + + } else if let textView = view as? UITextView { + textView.textContainer.lineFragmentPadding = 0 + textView.textContainerInset = cpk_edgeInsetsFromArray(padding) + } +} + +func cpk_pinOptions(_ options: [CPKViewPinOptions], forView view: UIView) { + view.makeCons({ + var values = [CGFloat]() + + for option in options { + switch option { + case let .x(offset): $0.left.equal(offset) + case let .y(offset): $0.top.equal(offset) + case let .w(value): $0.width.equal(value) + case let .h(value): $0.height.equal(value) + + case let .xy(v1, v2): $0.left.top.equal(v1, v2); view.frame.origin = CGPoint(x: v1, y: v2) + case let .wh(v1, v2): $0.width.height.equal(v1, v2); view.frame.size = CGSize(width: v1, height: v2) + case let .xywh(v1, v2, v3, v4): $0.left.top.width.height.equal(v1, v2, v3, v4) + + case let .maxX(offset): $0.right.equal(offset) + case let .maxY(offset): $0.bottom.equal(offset) + case let .maxXY(v1, v2): $0.right.bottom.equal(v1, v2) + + case let .centerX(offset): $0.centerX.equal(offset) + case let .centerY(offset): $0.centerY.equal(offset) + case let .centerXY(v1, v2): $0.center.equal(v1, v2) + + case let .whRatio(ratio): $0.width.equal(view).height.multiply(ratio) + + case .center: $0.center.equal(0) + case .ratio: $0.width.equal(view).height.multiply(view.frame.width / view.frame.height) + + case let .hhp(value): view.setContentHuggingPriority(value, for: .horizontal) + case let .vhp(value): view.setContentHuggingPriority(value, for: .vertical) + case let .hrp(value): view.setContentCompressionResistancePriority(value, for: .horizontal) + case let .vrp(value): view.setContentCompressionResistancePriority(value, for: .vertical) + + case .lowHugging: + view.setContentHuggingPriority(kLowPriority, for: .horizontal) + view.setContentHuggingPriority(kLowPriority, for: .vertical) + + case .lowResistance: + view.setContentCompressionResistancePriority(kLowPriority, for: .horizontal) + view.setContentCompressionResistancePriority(kLowPriority, for: .vertical) + + case let .___value(value): values.append(value) + } + } + + if values.count == 1 { + $0.height.equal(values[0]) + } else if values.count == 2 { + $0.size.equal(values[0], values[1]) + } else if values.count == 4 { + $0.origin.size.equal(values[0], values[1], values[2], values[3]) + } + }) +} + +func cpk_canActivateConstraint(_ constraint: NSLayoutConstraint) -> Bool { + return cpk_commonAncestorFor(item1: constraint.firstItem as? UIView, + item2: constraint.secondItem as? UIView) != nil +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +//MARK: Private extensions + +fileprivate var cpkObjectAssociatedObject: UInt8 = 0 + +let CPKLabelLinkAttributeName = "CPKLabelLink" +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 { + + @discardableResult + public static func cpk_swizzle(method1: Any, method2: Any) -> Bool { + var s1 = method1 as? Selector + var s2 = method2 as? Selector + + if s1 == nil, let name = method1 as? String { + s1 = NSSelectorFromString(name) + } + + if s2 == nil, let name = method2 as? String { + s2 = NSSelectorFromString(name) + } + + if s1 == nil || s2 == nil { + return false + } + + 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)) + + 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 func cpk_safePerform(selector: Selector) -> Any? { + if self.responds(to: selector) { + return self.perform(selector).takeRetainedValue() + } else { + return nil + } + } + + @discardableResult + public static func cpk_safePerform(selector: Selector) -> Any? { + if self.responds(to: selector) { + return self.perform(selector).takeRetainedValue() + } else { + return nil + } + } + + public func cpk_associatedObjectFor(key: String) -> Any? { + if let dict = objc_getAssociatedObject(self, &cpkObjectAssociatedObject) as? NSMutableDictionary { + return dict[key] + } else { + return nil + } + } + + public func cpk_setAssociated(object: Any?, forKey key: String) { + var dict = objc_getAssociatedObject(self, &cpkObjectAssociatedObject) as? NSMutableDictionary + + if dict == nil { + dict = NSMutableDictionary() + objc_setAssociatedObject(self, &cpkObjectAssociatedObject, dict, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + + dict![key] = object + } +} + + +extension NSMutableAttributedString { + + private var cpkSelectedRanges: NSMutableIndexSet { + get { + var indexSet = cpk_associatedObjectFor(key: #function) as? NSMutableIndexSet + if indexSet == nil { + indexSet = NSMutableIndexSet() + cpk_setAssociated(object: indexSet, forKey: #function) + } + return indexSet! + } + set { cpk_setAssociated(object: newValue, forKey: #function) } + } + + private var cpkIsJustSelectingRange: Bool { + get { return (cpk_associatedObjectFor(key: #function) as? Bool) ?? false } + set { cpk_setAssociated(object: newValue, forKey: #function) } + } + + var cpkPreventOverrideAttribute: Bool { + get { return (cpk_associatedObjectFor(key: #function) as? Bool) ?? false } + set { cpk_setAssociated(object: newValue, forKey: #function) } + } + + func cpk_select(range: NSRange?, setFlag: Bool = true) { + if !self.cpkIsJustSelectingRange { + self.cpkSelectedRanges.removeAllIndexes() + } + + if range != nil { + self.cpkSelectedRanges.add(in: range!) + } + + if setFlag { + self.cpkIsJustSelectingRange = true + } + } + + 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) + + } else { + if self.cpkPreventOverrideAttribute { + cpk_addAttributeIfNotExisted(name: name, value: value, range: range) + } else { + addAttribute(name, value: value, range: range) + } + } + }); + } + + 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 value != nil { + indexSets.remove(in: range) + } + } + + indexSets.enumerateRanges({ (range, stop) in + addAttribute(name, value: value, range: range) + }) + } + + func cpk_addParagraphAttribute(key: String, value: Any, range: NSRange? = nil) { + let targetRange = range ?? NSMakeRange(0, self.length) + var mutableStyle: NSMutableParagraphStyle + + if let paraStyle = attribute(NSParagraphStyleAttributeName, + at: targetRange.location, + longestEffectiveRange: nil, + in: targetRange) as? NSParagraphStyle { + + mutableStyle = paraStyle.mutableCopy() as! NSMutableParagraphStyle + + } else { + mutableStyle = NSMutableParagraphStyle() + mutableStyle.lineBreakMode = .byTruncatingTail + } + + mutableStyle.setValue(value, forKey: key) + addAttribute(NSParagraphStyleAttributeName, value: mutableStyle, range: targetRange) + + if key == "lineSpacing" { + addAttribute(CPKFixLineSpacingIssueAttributeName, value: CPKFixLineSpacingIssueAttributeValue, range: targetRange) + } + } +} + + +extension UIView { + + var cpkAutoRoundingRadius: Bool { + get { return cpk_associatedObjectFor(key: #function) as? Bool ?? false } + set { cpk_setAssociated(object: newValue, forKey: #function) } + } + + var cpkTouchInsets: UIEdgeInsets? { + get { return cpk_associatedObjectFor(key: #function) as? UIEdgeInsets } + set { cpk_setAssociated(object: newValue, forKey: #function) } + } + + override open class func initialize() { + if self == UIView.self { + cpk_swizzle(method1: "setBounds:", method2: #selector(UIView.cpk_setBounds)) + cpk_swizzle(method1: #selector(UIView.point(inside:with:)), method2: #selector(UIView.cpk_point(inside:with:))) + } + } + + func cpk_setBounds(_ frame: CGRect) { + cpk_setBounds(frame) + + if self.cpkAutoRoundingRadius { + self.layer.cornerRadius = self.bounds.height / 2 + cpk_masksToBoundsIfNeed() + } + } + + 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) + } else { + return self.cpk_point(inside: point, with: event) + } + } + + func cpk_masksToBoundsIfNeed() { + self.layer.masksToBounds = false + } + + func cpk_onClick(_ closureOrTarget: Any, _ action: Any? = nil) { + func cpk_onClickInner(target: Any, action: Any ) { + var sel = action as? Selector + if sel == nil, let methodName = action as? String { + sel = NSSelectorFromString(methodName) + } + + if let button = (self as Any) as? UIButton { + button.addTarget(target, action: sel!, for: .touchUpInside) + } else { + let tap = UITapGestureRecognizer.init(target: target, action: sel!) + self.addGestureRecognizer(tap) + } + } + + isUserInteractionEnabled = true + + if let action = action { + cpk_onClickInner(target: closureOrTarget, action: action) + } else { + cpk_onClickInner(target: self, action: #selector(UIView.cpk_onClickHandler)) + cpk_setAssociated(object: closureOrTarget, forKey: "cpk_OnClick") + } + } + + func cpk_onClickHandler() { + let callback = cpk_associatedObjectFor(key: "cpk_OnClick") + + if let closure = callback as? ()->() { + closure() + } else if let closure = callback as? ()->(Any) { + let _ = closure() + } else if let closure = callback as? (UIView)->() { + closure(self) + } else if let closure = callback as? ((UILabel)->()), let view = (self as Any) as? UILabel { + closure(view) + } else if let closure = callback as? ((UIImageView)->()), let view = (self as Any) as? UIImageView { + closure(view) + } else if let closure = callback as? ((UIButton)->()), let view = (self as Any) as? UIButton { + closure(view) + } else if let closure = callback as? ((UITextField)->()), let view = (self as Any) as? UITextField { + closure(view) + } else if let closure = callback as? ((UITextView)->()), let view = (self as Any) as? UITextView { + closure(view) + } else if let closure = callback as? ((CPKStackView)->()), let view = (self as Any) as? CPKStackView { + closure(view) + } else if let closure = callback as? ((Any)->()) { + closure(self) + } + } + + func cpk_generateCallbackClosure(_ closureOrTarget: Any, _ action: Any? = nil) -> Any? { + if action == nil { + return closureOrTarget + + } else { + if let target = closureOrTarget as? NSObject { + weak var weakTarget = target + weak var weakSelf = self + let sel = Sel(action!) + + return { + let _ = weakTarget?.perform(sel, with: weakSelf) + return + } + + } else { + return nil + } + } + } +} + + +extension UILabel { + override func cpk_masksToBoundsIfNeed() { + self.layer.masksToBounds = self.layer.cornerRadius > 0 + } +} + + +extension UIImageView { + override func cpk_masksToBoundsIfNeed() { + self.layer.masksToBounds = self.layer.cornerRadius > 0 && self.image != nil + } +} + + +extension UIButton { + var cpkGap: CGFloat? { + get { return cpk_associatedObjectFor(key: #function) as? CGFloat } + set { cpk_setAssociated(object: newValue, forKey: #function) } + } + + var cpkInsets: UIEdgeInsets? { + get { return cpk_associatedObjectFor(key: #function) as? UIEdgeInsets } + set { cpk_setAssociated(object: newValue, forKey: #function) } + } + + override func cpk_masksToBoundsIfNeed() { + let img = image(for: .normal) + let highImg = image(for: .highlighted) + let bgImg = backgroundImage(for: .normal) + let highBgImg = backgroundImage(for: .highlighted) + + let hasImage = (img != nil || highImg != nil || bgImg != nil || highBgImg != nil) + self.layer.masksToBounds = (self.layer.cornerRadius > 0 && hasImage) + } +} + + +extension UITextField { + var cpkMaxLength: Int { + get { return cpk_associatedObjectFor(key: #function) as? Int ?? 0 } + set { cpk_setAssociated(object: newValue, forKey: #function); cpk_watchTextChange() } + } + + var cpkPadding: UIEdgeInsets { + get { return cpk_associatedObjectFor(key: #function) as? UIEdgeInsets ?? UIEdgeInsetsMake(0, 0, 0, 0) } + set { cpk_setAssociated(object: newValue, forKey: #function) } + } + + var cpkTextChangedClosure: Any? { + get { return cpk_associatedObjectFor(key: #function) } + set { cpk_setAssociated(object: newValue, forKey: #function); cpk_watchTextChange() } + } + + var cpkDidEndOnExistClosure: Any? { + get { return cpk_associatedObjectFor(key: #function) } + set { cpk_setAssociated(object: newValue, forKey: #function); cpk_watchOnEndEvent() } + } + + override open class func initialize() { + if self == UITextField.self { + cpk_swizzle(method1: #selector(UITextField.textRect(forBounds:)), + method2: #selector(UITextField.cpk_textRect(forBounds:))) + + cpk_swizzle(method1: #selector(UITextField.editingRect(forBounds:)), + method2: #selector(UITextField.cpk_editingRect(forBounds:))) + } + } + + 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 { + let rect = cpk_editingRect(forBounds: bounds) + return UIEdgeInsetsInsetRect(rect, self.cpkPadding) + } + + private func cpk_watchTextChange() { + let sel = #selector(cpk_textDidChange) + removeTarget(self, action: sel, for: .editingChanged) + addTarget(self, action: sel, for: .editingChanged) + } + + private func cpk_watchOnEndEvent() { + let sel = #selector(cpk_didEndOnExit) + removeTarget(self, action: sel, for: .editingDidEndOnExit) + addTarget(self, action: sel, for: .editingDidEndOnExit) + } + + func cpk_textDidChange() { + let hasMarked = cpk_limitTextInput(self, maxLength: self.cpkMaxLength) + if !hasMarked { + if let closure = self.cpkTextChangedClosure as? (UITextField)->() { + closure(self) + } + } + } + + func cpk_didEndOnExit() { + if let closure = self.cpkDidEndOnExistClosure as? (UITextField)->() { + closure(self) + } + } +} + + +extension AttStrSelectionOptions : ExpressibleByStringLiteral { + public init(unicodeScalarLiteral value: String) { + self = .match(value) + } + + public init(extendedGraphemeClusterLiteral value: String) { + self = .match(value) + } + + public init(stringLiteral value: String) { + self = .match(value) + } +} + + +extension CPKViewPinOptions : ExpressibleByIntegerLiteral, ExpressibleByFloatLiteral { + public init(integerLiteral value: Int) { + self = .___value(CGFloat(value)) + } + + public init(floatLiteral value: Float) { + self = .___value(CGFloat(value)) + } +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +//MARK: AlertMaker + +public class AlertMaker { + var cpkTitle: Any? + var cpkMessage: Any? + var cpkTint: Any? + var cpkStyle: UIAlertControllerStyle + + private var actions = [UIAlertAction]() + + init(style: UIAlertControllerStyle) { + self.cpkStyle = style + } + + func cpk_addAction(style: UIAlertActionStyle, title: Any, handler: (()->())? ) { + var titleString: String? + var titleColor: UIColor? + + if let attTitle = title as? NSAttributedString { + titleString = attTitle.string + titleColor = attTitle.attribute(NSForegroundColorAttributeName, at: 0, effectiveRange: nil) as? UIColor + } else { + titleString = String(describing: title) + } + + let action = UIAlertAction(title: titleString, style: style) { (action) in + if let callback = handler { + callback() + } + } + + if titleColor != nil { + action.setValue(titleColor!, forKey: "titleTextColor") + } + + actions.append(action) + } + + func cpk_present(_ inside: UIViewController?) { + let alert = UIAlertController(title: nil, message: nil, preferredStyle: self.cpkStyle) + alert.view.tintColor = Color(self.cpkTint) + + if let attTitle = self.cpkTitle as? NSAttributedString { + alert.setValue(attTitle, forKey: "attributedTitle") + } else if let title = self.cpkTitle { + alert.title = String(describing: title) + } + + if let attMessage = self.cpkMessage as? NSAttributedString { + alert.setValue(attMessage, forKey: "attributedMessage") + } else if let message = self.cpkMessage { + alert.message = String(describing: message) + } + + for action in self.actions { + alert.addAction(action) + } + + if let vc = (inside ?? cpk_getTopViewController()) { + vc.present(alert, animated: true, completion: nil) + } + } +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +//MARK: ConsMaker + +public class ConsAtts: NSObject { + @discardableResult + func addAttributes(_ attributes: NSLayoutAttribute...) -> Cons { + //only for override + return Cons(firstItem: UIView()) + } +} + +public class Cons: ConsAtts { + private let firstItem: UIView + private var secondItem: UIView? + + var relation = NSLayoutRelation.equal + + var firstItemAttributes = [NSLayoutAttribute]() + var secondItemAttributes = [NSLayoutAttribute]() + + var multiplierValues = [CGFloat]() + var constantValues = [CGFloat]() + var priorityValues = [UILayoutPriority]() + + var storePointers = [UnsafeMutablePointer]() + + + init(firstItem: UIView) { + self.firstItem = firstItem + self.firstItem.translatesAutoresizingMaskIntoConstraints = false + } + + @discardableResult + override func addAttributes(_ attributes: NSLayoutAttribute...) -> Cons { + for att in attributes { + if secondItem == nil { + firstItemAttributes.append(att) + } else { + secondItemAttributes.append(att) + } + } + return self + } + + func updateSecondItem(_ item2OrValues: [Any]) { + if let item2 = item2OrValues.first as? UIView { + self.secondItem = item2 + + } else if let item2 = item2OrValues.first as? String { + if item2 == "self" { + self.secondItem = self.firstItem + } else { + assert(false, "invalid second item") + } + + } else { + self.secondItem = nil + for any in item2OrValues { + + if let point = any as? CGPoint { + self.constantValues.append(point.x) + self.constantValues.append(point.y) + + } else if let size = any as? CGSize { + self.constantValues.append(size.width) + self.constantValues.append(size.height) + + } else if let rect = any as? CGRect { + self.constantValues.append(rect.origin.x) + self.constantValues.append(rect.origin.y) + self.constantValues.append(rect.size.width) + self.constantValues.append(rect.size.height) + + } else if let insets = any as? UIEdgeInsets { + self.constantValues.append(insets.top) + self.constantValues.append(insets.left) + self.constantValues.append(insets.bottom) + self.constantValues.append(insets.right) + + } else { + self.constantValues.append(CPKFloat(any)) + } + } + } + } + + private func multiplierValue(atIndex index: Int) -> CGFloat { + var multiplier: CGFloat = 1 + + if index < multiplierValues.count { + multiplier = multiplierValues[index] + } else if let last = multiplierValues.last { + multiplier = last + } + + return multiplier != 0 ? multiplier : 1 + } + + private func constantValue(atIndex index: Int) -> CGFloat { + var constant: CGFloat = 0 + + if index < constantValues.count { + constant = constantValues[index] + } else if let last = constantValues.last { + constant = last + } + + return constant + } + + private func priorityValue(atIndex index: Int) -> UILayoutPriority { + var priority: UILayoutPriority = UILayoutPriorityRequired + + if index < priorityValues.count { + priority = priorityValues[index] + } else if let last = priorityValues.last { + priority = last + } + + return priority + } + + private func secondItemValue(att1: NSLayoutAttribute) -> UIView? { + var secondItem = self.secondItem + if (secondItem == nil && att1 != .width && att1 != .height) { + secondItem = self.firstItem.superview + } + return secondItem + } + + fileprivate func makeConstraints() -> [NSLayoutConstraint] { + var layoutConstraints = [NSLayoutConstraint]() + + for i in 0.. Bool { + + for att in self.firstItemAttributes { + if !((att == .width || att == .height) && self.secondItem == nil) { + if self.firstItem.superview == nil { + return true + } + } + } + + return false + } +} + + +public class ConsMaker: ConsAtts { + private let firstItem: UIView + private var cons = [Cons]() + + init(firstItem: UIView) { + self.firstItem = firstItem + } + + @discardableResult + override func addAttributes(_ attributes: NSLayoutAttribute...) -> Cons { + let c = Cons(firstItem: firstItem) + cons.append(c) + + for att in attributes { + c.addAttributes(att) + } + return c + } + + private func activiteConstraints(_ constraints: [NSLayoutConstraint]) { + NSLayoutConstraint.activate(constraints) + self.firstItem.cpk_addInstalledConstraints(constraints) + } + + private func shouldDelayMakingConstraints() -> Bool { + for c in cons { + if c.shouldDelayMakingConstraints() { + return true + } + } + return false + } + + func remakeConstraints() { + self.firstItem.cpk_removeAllInstalledConstraints() + + func makeConstraintsPrivate() { + var layoutConstraints = [NSLayoutConstraint]() + for c in cons { + let constraints = c.makeConstraints() + layoutConstraints.append(contentsOf: constraints) + + for (index, constraint) in constraints.enumerated() { + if index < c.storePointers.count { + let pointer = c.storePointers[index] + pointer.pointee = constraint + } + } + } + activiteConstraints(layoutConstraints) + } + + if shouldDelayMakingConstraints() { + DelayedConstraints.addOperation(makeConstraintsPrivate) + } else { + makeConstraintsPrivate() + } + } + + func updateConstraints() { + + func updateConstraintsPrivate() { + var newConstraints = [NSLayoutConstraint]() + + for c in cons { + let layoutConstraints = c.makeConstraints() + + for (index, constraint) in layoutConstraints.enumerated() { + var target = constraint + + if let old = self.firstItem.cpk_similarInstalledConstraint(constraint) { + old.constant = constraint.constant + target = old + + } else { + newConstraints.append(constraint) + } + + if index < c.storePointers.count { + let pointer = c.storePointers[index] + pointer.pointee = target + } + } + } + + activiteConstraints(newConstraints) + } + + if shouldDelayMakingConstraints() { + DelayedConstraints.addOperation(updateConstraintsPrivate) + } else { + updateConstraintsPrivate() + } + } +} + + +fileprivate extension UIView { + var cpkInstalledConstraints: NSHashTable { + var hash = cpk_associatedObjectFor(key: "cpkInstalledConstraints") as? NSHashTable + if (hash == nil) { + hash = NSHashTable.weakObjects() + cpk_setAssociated(object: hash, forKey: "cpkInstalledConstraints") + } + return hash! + } + + func cpk_similarInstalledConstraint(_ constraint: NSLayoutConstraint) -> NSLayoutConstraint? { + for target in self.cpkInstalledConstraints.allObjects { + if target.cpk_isSimilarTo(constraint: constraint) { + return target + } + } + return nil; + } + + func cpk_addInstalledConstraints(_ constraints: [NSLayoutConstraint]) { + let hash = self.cpkInstalledConstraints + for constraint in constraints { + hash.add(constraint) + } + } + + func cpk_removeAllInstalledConstraints() { + NSLayoutConstraint.deactivate(self.cpkInstalledConstraints.allObjects) + self.cpkInstalledConstraints.removeAllObjects() + } +} + +fileprivate extension NSLayoutConstraint { + func cpk_isSimilarTo(constraint: NSLayoutConstraint) -> Bool { + return self.firstItem === constraint.firstItem && + self.secondItem === constraint.secondItem && + self.firstAttribute == constraint.firstAttribute && + self.secondAttribute == constraint.secondAttribute && + self.relation == constraint.relation && + self.priority == constraint.priority && + self.multiplier == constraint.multiplier + } +} + +fileprivate class DelayedConstraints { + private static var delayedOperations = [()->()]() + private static var isWaiting = false + + class func addOperation(_ operation: @escaping ()->()) { + + delayedOperations.append(operation) + + if !isWaiting { + isWaiting = true + + CFRunLoopPerformBlock(CFRunLoopGetMain(), CFRunLoopMode.commonModes.rawValue, { + for o in delayedOperations { o() } + delayedOperations.removeAll() + isWaiting = false + }) + } + } +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +/** + * StylesMaker + */ +let CPKStylesBorderWidth = "CPKBorderWidth" +let CPKStyleBOrderColor = "CPKBorderColor" + +public class StylesMaker: NSObject { + static var globalStyles = Dictionary() + + private var styles = Dictionary() + + @discardableResult func addStyle(key: String, value: Any) -> Self { + styles[key] = value + return self + } + + func applyTo(view: UIView) { + for (key, value) in styles { + + if key == "border" { + if let dict = value as? Dictionary { + view.border(CPKFloat(dict["borderWidth"]), dict["borderColor"]) + } + + } else if key == "shadow" { + if let dict = value as? Dictionary { + view.shadow(dict["opacity"]!, dict["radius"]!, dict["offsetX"]!, dict["offsetY"]!) + } + + } else if key == "pin" { + cpk_pinOptions(value as! [CPKViewPinOptions], forView: view) + + } else if key == "align" { + if let stack = view as? CPKStackView { + stack.align(value as! CPKStackAlignment) + } else if let label = view as? UILabel { + label.align(value as! NSTextAlignment) + } else if let textField = view as? UITextField { + textField.align(value as! NSTextAlignment) + } else if let textView = view as? UITextView { + textView.align(value as! NSTextAlignment) + } + + } else if key == "mode" { + if let imageView = view as? UIImageView { + imageView.mode(value as! UIViewContentMode) + } + + } else if key == "reversed" { + if let button = view as? UIButton { + button.reversed(value as! Bool) + } + + } else if key == "padding" { + cpk_updatePadding(value as! [CGFloat], forView: view) + } + + else if key == "secure" { + if let textField = view as? UITextField { + textField.secure(value as! Bool) + } + } + + else if key == "keyboard" { + if let textField = view as? UITextField { + textField.keyboard(value as! UIKeyboardType) + } + } + + else if key == "returnKey" { + if let textField = view as? UITextField { + textField.returnKey(value as! UIReturnKeyType) + } + } + + else if key == "clearMode" { + if let textField = view as? UITextField { + textField.clearMode(value as! UITextFieldViewMode) + } + } + + else { + let sel = NSSelectorFromString(key + ":") + if view.responds(to: sel) { + view.perform(sel, with: value) + } + } + } + } +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +//MARK: StaticTableView + +public enum CPKTableViewCellAccessoryType { + case none + case disclosureIndicator + case detailDisclosureButton + case checkmark + case detailButton + case view(UIView) //AccessoryView +} + +public class StaticTableView: UITableView, UITableViewDelegate, UITableViewDataSource { + public var checkedIndexPaths: [IndexPath] { + var indexPaths = [IndexPath]() + + for section in sections { + for row in section.rows { + if row.accessoryType != nil && row.accessoryType! == .checkmark { + indexPaths.append(row.indexPath) + } + } + } + + return indexPaths + } + + public func update(detail: String, at indexPath : IndexPath) { + let row = rowAt(indexPath: indexPath) + row.detail(detail) + } + + + fileprivate var sections = [StaticSection]() + + var autoEnableScroll = true + + var cellHeight: CGFloat? + var separatorIndent: CGFloat? + + var accessoryType: CPKTableViewCellAccessoryType? + var customHandler: ((StaticRow)->())? + + var onClickHandler: ((StaticRow)->())? + + var textFont: Any? + var textColor: Any? + var detailFont: Any? + var detailColor: Any? + + public init(sectionsOrRows: [Any], style: UITableViewStyle) { + super.init(frame: CGRect.zero, style: style) + self.estimatedRowHeight = 44 + self.delegate = self + self.dataSource = self + updateSections(sectionsOrRows: sectionsOrRows) + + addObserver(self, forKeyPath: "contentSize", options: .new, context: nil) + addObserver(self, forKeyPath: "frame", options: .new, context: nil) + } + + public override func observeValue(forKeyPath keyPath: String?, + of object: Any?, + change: [NSKeyValueChangeKey : Any]?, + context: UnsafeMutableRawPointer?) { + + if keyPath == "contentSize" { + invalidateIntrinsicContentSize() + + } + + if self.autoEnableScroll { + self.isScrollEnabled = !(abs(self.frame.size.height - visibleHeight()) < 0.1) + } + } + + public required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + deinit { + removeObserver(self, forKeyPath: "contentSize") + removeObserver(self, forKeyPath: "frame") + } + + private func sectionsFrom(sectionsOrRows: [Any]) -> [StaticSection] { + var sections = [StaticSection]() + var rows: [StaticRow]? = nil + + for any in sectionsOrRows { + + if let array = any as? Array { + let result = sectionsFrom(sectionsOrRows: array) + sections.append(contentsOf: result) + + } else if let section = any as? StaticSection { + if rows != nil { + sections.append(StaticSection(rowsOrStrings: rows!)) + rows = nil + } + sections.append(section) + + } else if let row = any as? StaticRow { + if rows == nil { rows = [StaticRow]() } + rows?.append(row) + + } else if let text = any as? String { + if rows == nil { rows = [StaticRow]() } + rows?.append(Row.str(text)) + } + } + + if rows != nil { + sections.append(StaticSection(rowsOrStrings: rows!)) + } + + return sections + } + + private func updateSections(sectionsOrRows: [Any]) { + self.sections = sectionsFrom(sectionsOrRows: sectionsOrRows) + + for s in self.sections { + s.table = self + } + + // if self.style == .grouped && sections.count == 1 { + // let section = sections.first + // if section?.headerValue == nil && section?.footerValue == nil { + // section?.header(0).footer(0) + // } + // } + } + + private func visibleHeight() -> CGFloat { + return contentSize.height + contentInset.top + contentInset.bottom + } + + private func rowAt(indexPath: IndexPath) -> StaticRow { + return sections[indexPath.section].rows[indexPath.row] + } + + public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + let row = rowAt(indexPath: indexPath) + return row.rowHeight() + } + + public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let row = rowAt(indexPath: indexPath) + let cell = row.getCell(indexPath: indexPath) + + if let callback = row.customHandler { + callback(row) + } + + if let callback = row.section.table.customHandler { + callback(row) + } + + return cell + } + + public func numberOfSections(in tableView: UITableView) -> Int { + return sections.count + } + + public func tableView(_ tableView: UITableView, numberOfRowsInSection sectionIndex: Int) -> Int { + return sections[sectionIndex].rows.count + } + + public func tableView(_ tableView: UITableView, heightForHeaderInSection sectionIndex: Int) -> CGFloat { + let section = sections[sectionIndex] + + if let view = section.headerValue as? UIView { + return view.bounds.height + + } else if let height = CPKFloatOptional(section.headerValue) { + return height == 0 ? 0.001 : height + } + + return UITableViewAutomaticDimension + } + + public func tableView(_ tableView: UITableView, heightForFooterInSection sectionIndex: Int) -> CGFloat { + let section = sections[sectionIndex] + + if let view = section.footerValue as? UIView { + return view.bounds.height + + } else if let height = CPKFloatOptional(section.footerValue) { + return height == 0 ? 0.001 : height + } + + return UITableViewAutomaticDimension + } + + public func tableView(_ tableView: UITableView, titleForHeaderInSection sectionIndex: Int) -> String? { + let section = sections[sectionIndex] + + if let title = section.headerValue as? String { + return title + } else { + return nil + } + } + + public func tableView(_ tableView: UITableView, titleForFooterInSection sectionIndex: Int) -> String? { + let section = sections[sectionIndex] + + if let footer = section.footerValue as? String { + return footer + } else { + return nil + } + } + + public func tableView(_ tableView: UITableView, viewForHeaderInSection sectionIndex: Int) -> UIView? { + let section = sections[sectionIndex] + + if let view = section.headerValue as? UIView { + return view + } else { + return nil + } + } + + public func tableView(_ tableView: UITableView, viewForFooterInSection sectionIndex: Int) -> UIView? { + let section = sections[sectionIndex] + + if let view = section.footerValue as? UIView { + return view + } else { + return nil + } + } + + public func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? { + let row = rowAt(indexPath: indexPath) + return row.allowSelection() ? indexPath : nil + } + + public func tableView(_ tableView: UITableView, shouldHighlightRowAt indexPath: IndexPath) -> Bool { + let row = rowAt(indexPath: indexPath) + return row.allowSelection() + } + + public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + tableView.deselectRow(at: indexPath, animated: true) + + let section = sections[indexPath.section] + let row = rowAt(indexPath: indexPath) + + if section.enableSingleCheck != nil { + for r in section.rows { r.check(false) } + row.check(true) + + } else if section.enableMultiCheck != nil { + if row.accessoryType != nil && row.accessoryType! == .checkmark { + row.check(false) + } else { + row.check(true) + } + } + + if let callback = row.onClickHandler { + callback(row) + } + + if let callback = section.table.onClickHandler { + callback(row) + } + } + + public func tableView(_ tableView: UITableView, accessoryButtonTappedForRowWith indexPath: IndexPath) { + let row = rowAt(indexPath: indexPath) + if let callback = row.onButtonHandler { + callback(row) + } + } + + public override var intrinsicContentSize: CGSize { + return CGSize(width: -1, height: visibleHeight()) + } +} + +public class StaticSection: NSObject { + fileprivate var rows = [StaticRow]() + fileprivate weak var table: StaticTableView! + + var enableSingleCheck: Bool? + var enableMultiCheck: Bool? + + var checkedImage: UIImage? + var uncheckedImage: UIImage? + + var headerValue: Any? + var footerValue: Any? + + + fileprivate func allowChecking() -> Bool { + return enableSingleCheck != nil || enableMultiCheck != nil + } + + private func rowsFrom(rowsOrStrings: [Any]) -> [StaticRow] { + var rows = [StaticRow]() + + for any in rowsOrStrings { + if let row = any as? StaticRow { + rows.append(row) + } + + if let text = any as? String { + rows.append(Row.str(text)) + } + + if let array = any as? Array { + let result = rowsFrom(rowsOrStrings: array) + rows.append(contentsOf: result) + } + } + + return rows + } + + + init(rowsOrStrings: [Any]) { + super.init() + self.rows = rowsFrom(rowsOrStrings: rowsOrStrings) + for row in self.rows { + row.section = self + } + } +} + + +public class StaticRow: UIView { + public fileprivate(set) var cell: UITableViewCell! + public fileprivate(set) var indexPath: IndexPath! + public internal(set) var switchView: UISwitch! { + didSet { + switchView?.addTarget(self, action: #selector(switchDidChange), for: .valueChanged) + } + } + + fileprivate weak var section: StaticSection! + + var cellHeight: CGFloat? + var separatorIndent: CGFloat? + + var cellStyle: UITableViewCellStyle = .default + + var onClickHandler: ((StaticRow)->())? + var onButtonHandler: ((StaticRow)->())? + var onChangeHandler: ((StaticRow)->())? + var customHandler: ((StaticRow)->())? + + var accessoryType: CPKTableViewCellAccessoryType? { + didSet { + updateCell() + } + } + + var text: Any? { + didSet { updateCell() } + } + + var detailText: Any? { + didSet { updateCell() } + } + + var image: UIImage? { + didSet { updateCell() } + } + + public override class var layerClass: Swift.AnyClass { + return CATransformLayer.self + } + + func switchDidChange() { + if let callback = onChangeHandler { + callback(self) + } + } + + private func updateCell() { + + if cell == nil { + return + } + + if let image = self.image { + cell.imageView?.image = image + } + + if let text = self.text { + cell.textLabel?.str(text) + + if !(text is NSAttributedString) { + if let font = self.section.table.textFont { + cell.textLabel?.font(font) + } + + if let color = self.section.table.textColor { + cell.textLabel?.color(color) + } + } + } + + if let detail = self.detailText { + cell.detailTextLabel?.str(detail) + + if !(detail is NSAttributedString) { + if let font = self.section.table.detailFont { + cell.detailTextLabel?.font(font) + } + if let color = self.section.table.detailColor { + cell.detailTextLabel?.color(color) + } + } + } + + if let accType = self.accessoryType ?? self.section.table.accessoryType { + let accs = accType.accessoryType() + cell.accessoryType = accs.0 + + if let view = accs.1 { + cell.accessoryView = view + } + } + + if let section = self.section { + if section.allowChecking() { + let accType = self.accessoryType + + if accType != nil && accType! == .checkmark { + if let onImage = section.checkedImage { + self.cell.accessoryView = ImageView.img(onImage) + } else { + self.cell.accessoryType = .checkmark + self.cell.accessoryView = nil + } + + } else { + if let offImage = section.uncheckedImage { + self.cell.accessoryView = ImageView.img(offImage) + } else { + self.cell.accessoryType = .none + self.cell.accessoryView = nil + } + } + } + } + + if let indent = lineIndent() { + cell.preservesSuperviewLayoutMargins = false + cell.layoutMargins = UIEdgeInsetsMake(0, 0, 0, 0) + cell.separatorInset = UIEdgeInsetsMake(0, indent, 0, 0) + } + } + + fileprivate func rowHeight() -> CGFloat { + var rowHeight: CGFloat = 44 + + if let height = self.cellHeight { + rowHeight = height + } else if let height = self.section.table.cellHeight { + rowHeight = height + } + + return rowHeight >= 0 ? rowHeight : UITableViewAutomaticDimension + } + + fileprivate func lineIndent() -> CGFloat? { + if self.separatorIndent != nil { + return self.separatorIndent + } else { + return self.section.table.separatorIndent + } + } + + fileprivate func allowSelection() -> Bool { + if section.allowChecking() { + return true + } + + if self.onClickHandler != nil { + return true + } + + if section.table.onClickHandler != nil { + return true + } + + return false + } + + fileprivate func getCell(indexPath: IndexPath) -> UITableViewCell { + if cell == nil { + var style = self.cellStyle + if style == .default && self.detailText != nil { + style = .value1 + } + + cell = UITableViewCell(style: style, reuseIdentifier: "cell") + } + + self.indexPath = indexPath + updateCell() + + return cell + } +} + + +extension CPKTableViewCellAccessoryType { + public func accessoryType() -> (UITableViewCellAccessoryType, UIView?) { + switch self { + case .none: return (.none, nil) + case .disclosureIndicator: return (.disclosureIndicator, nil) + case .detailDisclosureButton: return (.detailDisclosureButton, nil) + case .checkmark: return (.checkmark, nil) + case .detailButton: return (.detailButton, nil) + case let .view(view): return (.none, view) + } + } +} + +func == (lhs: CPKTableViewCellAccessoryType, rhs: CPKTableViewCellAccessoryType) -> Bool { + switch (lhs, rhs) { + case (.none, .none): return true + case (.disclosureIndicator, .disclosureIndicator): return true + case (.detailDisclosureButton, .detailDisclosureButton): return true + case (.checkmark, .checkmark): return true + case (.detailButton, .detailButton): return true + case (.view(let l), .view(let r)): return l == r + default: return false + } +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +//MARK: UITextView+Placeholder + +fileprivate var cpkTextViewObservingKeys = ["bounds", + "frame", + "font", + "textAlignment", + "textContainerInset", + "textContainer.lineFragmentpadding"] + + +fileprivate class UITextViewPlaceholder: UILabel { + weak var textView: UITextView? + static private var defaultColor: UIColor? + + func defaultPlaceholderColor() -> UIColor { + if let color = UITextViewPlaceholder.defaultColor { + return color + } else { + let textField = UITextField() + textField.placeholder = " " + + var color = textField.value(forKeyPath: "_placeholderLabel.textColor") as? UIColor + if color == nil { + color = UIColor(red: 199/255, green: 199/255, blue: 205/255, alpha: 1) + } + + UITextViewPlaceholder.defaultColor = color + return color! + } + } + + init(textView: UITextView) { + self.textView = textView + super.init(frame: textView.bounds) + + self.numberOfLines = 0 + self.tag = 31415 + self.textColor = defaultPlaceholderColor() + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + fileprivate func update() { + if let textView = self.textView { + self.isHidden = !(textView.text.isEmpty && textView.attributedText.string.isEmpty) + + if !self.isHidden { + var font = textView.font + + if font == nil && textView.text.isEmpty { + textView.text = " " + font = textView.font + textView.text = "" + } + + self.font = font + self.textAlignment = textView.textAlignment + + var rect = UIEdgeInsetsInsetRect(textView.bounds, textView.textContainerInset) + rect = rect.insetBy(dx: textView.textContainer.lineFragmentPadding, dy: 0) + rect.size.height = min(rect.height, self.sizeThatFits(CGSize(width: rect.width, height: 0)).height) + self.frame = rect + } + } + } + + fileprivate override func observeValue(forKeyPath keyPath: String?, + of object: Any?, + change: [NSKeyValueChangeKey : Any]?, + context: UnsafeMutableRawPointer?) { + update() + } +} + + +extension UITextView { + var cpkMaxLength: Int { + get { return cpk_associatedObjectFor(key: #function) as? Int ?? 0 } + set { cpk_setAssociated(object: newValue, forKey: #function); cpk_watchTextChange() } + } + + var cpkTextChangedClosure: Any? { + get { return cpk_associatedObjectFor(key: #function) } + set { cpk_setAssociated(object: newValue, forKey: #function); cpk_watchTextChange() } + } + + private var cpkPlaceholderLabel: UITextViewPlaceholder? { + return self.viewWithTag(31415) as? UITextViewPlaceholder + } + + override open class func initialize() { + if self == UITextView.self { + cpk_swizzle(method1: "dealloc", method2: #selector(UITextView.cpk_deinit)) + } + } + + public func cpk_deinit() { + if let label = self.cpkPlaceholderLabel { + for keyPath in cpkTextViewObservingKeys { + self.removeObserver(label, forKeyPath: keyPath) + } + } + + NotificationCenter.default.removeObserver(self) + self.cpk_deinit() + } + + private func cpk_watchTextChange() { + NotificationCenter.default.removeObserver(self, + name: NSNotification.Name.UITextViewTextDidChange, + object: self) + + NotificationCenter.default.addObserver(self, + selector: #selector(cpk_textDidChange), + name: NSNotification.Name.UITextViewTextDidChange, + object: self) + } + + func cpk_textDidChange() { + let hasMarked = cpk_limitTextInput(self, maxLength: self.cpkMaxLength) + if !hasMarked { + if let closure = self.cpkTextChangedClosure as? (UITextView)->() { + closure(self) + } + } + + self.cpkPlaceholderLabel?.update() + } + + func cpk_setPlaceholder(_ any: Any) { + var placeholderLabel = self.cpkPlaceholderLabel + + if placeholderLabel == nil { + let label = UITextViewPlaceholder(textView: self) + self.insertSubview(label, at: 0) + + for keyPath in cpkTextViewObservingKeys { + self.addObserver(label, forKeyPath: keyPath, options: .new, context: nil) + } + + placeholderLabel = label + cpk_watchTextChange() + } + + if let att = any as? NSAttributedString { + placeholderLabel?.attributedText = att + } else { + placeholderLabel?.text = String(describing: any) + } + + placeholderLabel?.update() + } +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +//MARK: UILabel + Link + +class LinkInfo: NSObject { + var text: String + var range: NSRange + var boundingRects: [CGRect] + + init(text: String, range: NSRange, boundingRects: [CGRect]) { + self.text = text + self.range = range + self.boundingRects = boundingRects + } + + func contains(point: CGPoint) -> Bool { + for rect in boundingRects { + if rect.contains(point) { + return true + } + } + return false + } + + func shouldCancelTouchAt(point: CGPoint) -> Bool { + for rect in boundingRects { + let touchRect = rect.insetBy(dx: -50, dy: -50) + if touchRect.contains(point) { + return false + } + } + return true + } +} + +class LinkGestureRecognizer: UIGestureRecognizer { + override func touchesBegan(_ touches: Set, with event: UIEvent) { + self.state = .began + } + + override func touchesMoved(_ touches: Set, with event: UIEvent) { + self.state = .changed + } + + override func touchesEnded(_ touches: Set, with event: UIEvent) { + self.state = .ended + } + + override func touchesCancelled(_ touches: Set, with event: UIEvent) { + self.state = .cancelled + } + + override func canPrevent(_ preventedGestureRecognizer: UIGestureRecognizer) -> Bool { + return false + } + + override func canBePrevented(by preventingGestureRecognizer: UIGestureRecognizer) -> Bool { + return false + } +} + + +public extension UILabel { + + public var cpkLayoutManager: NSLayoutManager { + var layoutManager: NSLayoutManager! = cpk_associatedObjectFor(key: #function) as? NSLayoutManager + + if layoutManager == nil { + layoutManager = NSLayoutManager() + + let textStorage = NSTextStorage() + textStorage.addLayoutManager(layoutManager) + layoutManager?.textStorage = textStorage + + let textContainer = NSTextContainer(size: CGSize(width: 0, height: 0)) + textContainer.lineFragmentPadding = 0 + textContainer.layoutManager = layoutManager + layoutManager.addTextContainer(textContainer) + + cpk_setAssociated(object: layoutManager, forKey: #function) + cpk_setAssociated(object: textStorage, forKey: "cpkTextStorage") + } + + if let attStr = self.attributedText { + let att = NSMutableAttributedString(attributedString: attStr) + att.select(.all).preventOverride().font(self.font).align(self.textAlignment) + + if self.numberOfLines != 1 && self.lineBreakMode != .byCharWrapping && self.lineBreakMode != .byWordWrapping { + let value = NSNumber(value: NSLineBreakMode.byWordWrapping.rawValue) + att.cpk_addParagraphAttribute(key: "lineBreakMode", value: value) + } + + layoutManager.textStorage?.setAttributedString(att) + + if let textContainer = layoutManager.textContainers.first { + textContainer.maximumNumberOfLines = self.numberOfLines + textContainer.lineBreakMode = self.lineBreakMode + textContainer.size = self.bounds.size + } + + } else { + layoutManager.textStorage?.setAttributedString(NSAttributedString()) + } + + return layoutManager + } + + public var cpkLinkSelectionColor: UIColor? { + get { return cpk_associatedObjectFor(key: #function) as? UIColor } + set { cpk_setAssociated(object: newValue, forKey: #function) } + } + + public var cpkLinkSelectionRadius: CGFloat? { + get { return cpk_associatedObjectFor(key: #function) as? CGFloat } + set { cpk_setAssociated(object: newValue, forKey: #function) } + } +} + + +extension UILabel { + + var cpkLineGap: CGFloat? { + get { return cpk_associatedObjectFor(key: #function) as? CGFloat } + set { cpk_setAssociated(object: newValue, forKey: #function); cpk_updateAttributedString() } + } + + var cpkLinkHandler: Any? { + get { return cpk_associatedObjectFor(key: #function) } + set { + cpk_setAssociated(object: newValue, forKey: #function) + + guard let hasGesture = self.gestureRecognizers?.contains(where: { + return $0 is LinkGestureRecognizer + }), hasGesture == true else { + let gesture = LinkGestureRecognizer(target: self, action: #selector(cpk_handleLinkGesture(_:))) + addGestureRecognizer(gesture) + return + } + } + } + + fileprivate var cpkSelectedLinkInfo: LinkInfo? { + get { return cpk_associatedObjectFor(key: #function) as? LinkInfo } + set { cpk_setAssociated(object: newValue, forKey: #function) } + } + + fileprivate var cpkSelectionLayers: [CALayer] { + get { return (cpk_associatedObjectFor(key: #function) as? [CALayer]) ?? [CALayer]() } + set { cpk_setAssociated(object: newValue, forKey: #function) } + } + + override open static func initialize() { + if self === UILabel.self { + cpk_swizzle(method1: #selector(setter: UILabel.text), method2: #selector(UILabel.ner_setText(_:))) + } + } + + public func ner_setText(_ text: String) { + self.ner_setText(text) + cpk_updateAttributedString() + } + + private func cpk_updateAttributedString() { + if let lineGap = self.cpkLineGap, let attStr = self.attributedText { + if let mutableAtt = attStr.mutableCopy() as? NSMutableAttributedString { + self.attributedText = mutableAtt.lineGap(lineGap) + } + } + } +} + + +extension UILabel { + + func cpk_handleLinkGesture(_ gesture: LinkGestureRecognizer) { + + func cpk_calculateTextYOffset() -> CGFloat { + let layoutManager = self.cpkLayoutManager + + if let textContainer = layoutManager.textContainers.first { + let textRange = layoutManager.glyphRange(for: textContainer) + let textRect = layoutManager.boundingRect(forGlyphRange: textRange, in: textContainer) + + if self.bounds.height > textRect.height { + return (self.bounds.height - textRect.height) / 2 + } + } + + return 0 + } + + func cpk_calculateBoundingRects(range: NSRange, yOffset: CGFloat) -> [CGRect] { + let layoutManager = self.cpkLayoutManager + var boundingRects = [CGRect]() + + if let textContainer = layoutManager.textContainers.first { + let textRect = layoutManager.usedRect(for: textContainer) + let glyphRange = layoutManager.glyphRange(forCharacterRange: range, actualCharacterRange: nil) + + let handler: (CGRect, UnsafeMutablePointer)->() = { (rect, stop) in + var boundingRect = rect + let subGlyphRange = layoutManager.glyphRange(forBoundingRect: rect, in: textContainer) + let subRect = layoutManager.boundingRect(forGlyphRange: subGlyphRange, in: textContainer) + + let lineRect = layoutManager.lineFragmentUsedRect(forGlyphAt: subGlyphRange.location, effectiveRange: nil) + + if subRect.origin.x > boundingRect.origin.x { + let emptyWidth = subRect.origin.x - boundingRect.origin.x + + boundingRect.origin.x = subRect.origin.x + if boundingRect.size.width > emptyWidth { + boundingRect.size.width -= emptyWidth + } + } + + if let ps = layoutManager.textStorage?.attribute(NSParagraphStyleAttributeName, + at: range.location, + longestEffectiveRange: nil, + in: range) as? NSParagraphStyle { + + if ps.lineSpacing > 0 && ceilf(Float(boundingRect.maxY)) != ceilf(Float(textRect.maxY)) { + let height = boundingRect.height - ps.lineSpacing + boundingRect.size.height = CGFloat(ceilf(Float(height))) + } + } + + if boundingRect.maxX > lineRect.maxX { + boundingRect.size.width = lineRect.maxX - boundingRect.minX + } + + boundingRect.origin.y += yOffset + boundingRects.append(boundingRect) + } + + layoutManager.enumerateEnclosingRects(forGlyphRange: glyphRange, + withinSelectedGlyphRange: NSMakeRange(NSNotFound, 0), + in: textContainer, + using:handler) + } + + return boundingRects + } + + func cpk_handleTouchBegin() { + + if let attStr = self.attributedText { + var linkInfos = [LinkInfo]() + let touchPoint = gesture.location(in: self) + let fullRange = NSMakeRange(0, attStr.length) + let yOffset = cpk_calculateTextYOffset() + + let handler: (Any?, NSRange, UnsafeMutablePointer)->() = { (value, range, stop) in + if value != nil { + let text = attStr.string.subAt(range) + let boundingRects = cpk_calculateBoundingRects(range: range, yOffset: yOffset) + let linkInfo = LinkInfo(text: text, range: range, boundingRects: boundingRects) + linkInfos.append(linkInfo) + } + } + + attStr.enumerateAttribute(CPKLabelLinkAttributeName, + in: fullRange, + options: NSAttributedString.EnumerationOptions.init(rawValue: 0), + using: handler) + + for linkInfo in linkInfos { + if linkInfo.contains(point: touchPoint) { + self.cpkSelectedLinkInfo = linkInfo + self.perform(#selector(cpk_addHighlightedLayers(for:)), with: linkInfo, afterDelay: 0.06) + break + } + } + } + } + + if gesture.state == .began { + cpk_handleTouchBegin() + + } else if gesture.state == .changed { + if let linkInfo = self.cpkSelectedLinkInfo { + let point = gesture.location(in: self) + if linkInfo.shouldCancelTouchAt(point: point) { + cpk_removeHighlightedLayers() + } + } + + } else if gesture.state == .ended || gesture.state == .cancelled { + if let linkInfo = self.cpkSelectedLinkInfo { + let callback = self.cpkLinkHandler + cpk_removeHighlightedLayers() + + if let closure = callback as? (String)->() { + closure(linkInfo.text) + } else if let closure = callback as? (String, NSRange)->() { + closure(linkInfo.text, linkInfo.range) + } else if let closure = callback as? (Any)->() { + closure(linkInfo.text) + } + } + } + } + + 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 + let radius = self.cpkLinkSelectionRadius ?? 4 + + if color.cgColor.alpha == 1 { + color = color.withAlphaComponent(0.4) + } + + let layer = CALayer() + layer.frame = rect + layer.cornerRadius = radius + layer.backgroundColor = color.cgColor + + self.layer.addSublayer(layer) + self.cpkSelectionLayers.append(layer) + } + } + } + + func cpk_removeHighlightedLayers() { + NSObject.cancelPreviousPerformRequests(withTarget: self, + selector: #selector(cpk_addHighlightedLayers(for:)), + object: self.cpkSelectedLinkInfo) + + for layer in self.cpkSelectionLayers { + layer.removeFromSuperlayer() + } + + self.cpkSelectionLayers.removeAll() + self.cpkSelectedLinkInfo = nil + } +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +//MARK: Override + +extension UILabel { + + @discardableResult + override public func bg(_ any: Any) -> Self { + super.bg(any) + return self + } + + @discardableResult + override public func tint(_ any: Any) -> Self { + super.tint(any) + return self + } + + @discardableResult + override public func radius(_ cornerRadius: CGFloat) -> Self { + super.radius(cornerRadius) + return self + } + + @discardableResult + override public func border(_ borderWidth: CGFloat, _ borderColor: Any? = nil) -> Self { + super.border(borderWidth, borderColor) + return self + } + + @discardableResult + override public func shadow(_ shadowOpacity: CGFloat, + _ shadowRadius: CGFloat = 3, + _ shadowOffsetX: CGFloat = 0, + _ shadowOffsetY: CGFloat = 3) -> Self { + + super.shadow(shadowOpacity, shadowRadius, shadowOffsetX, shadowOffsetY) + return self + } + + @discardableResult + override func onClick(_ closure: @escaping (UILabel)->()) -> Self { + cpk_onClick(closure, nil) + return self + } + + @discardableResult + override public func addTo(_ superView: UIView) -> Self { + super.addTo(superView) + return self + } + + @discardableResult + override public func styles(_ s1: Any, _ s2: Any? = nil, _ s3: Any? = nil, _ s4: Any? = nil) -> Self { + super.styles(s1, s2, s3, s4) + return self + } + + @discardableResult + override public func touchInsets(_ p1: Any, _ p2: Any? = nil, _ p3: Any? = nil, _ p4: Any? = nil) -> Self { + super.touchInsets(p1, p2, p3, p4) + return self + } + + @discardableResult + override public func margin(_ p1: Any, _ p2: Any? = nil, _ p3: Any? = nil, _ p4: Any? = nil) -> Self { + super.margin(p1, p2, p3, p4) + return self + } + + @discardableResult + override public func embedIn(_ superview: UIView, + _ p1: Any? = "", _ p2: Any? = "", + _ p3: Any? = "", _ p4: Any? = "") -> Self { + super.embedIn(superview, p1, p2, p3, p4) + return self + } + + @discardableResult + override public func makeCons(_ closure: (ConsMaker)->()) -> Self { + super.makeCons(closure) + return self + } + + @discardableResult + override public func remakeCons(_ closure: (ConsMaker)->()) -> Self { + super.remakeCons(closure) + return self + } +} + + + +extension UIImageView { + + @discardableResult + override public func bg(_ any: Any) -> Self { + super.bg(any) + return self + } + + @discardableResult + override public func tint(_ any: Any) -> Self { + super.tint(any) + return self + } + + @discardableResult + override public func radius(_ cornerRadius: CGFloat) -> Self { + super.radius(cornerRadius) + return self + } + + @discardableResult + override public func border(_ borderWidth: CGFloat, _ borderColor: Any? = nil) -> Self { + super.border(borderWidth, borderColor) + return self + } + + @discardableResult + override public func shadow(_ shadowOpacity: CGFloat, + _ shadowRadius: CGFloat = 3, + _ shadowOffsetX: CGFloat = 0, + _ shadowOffsetY: CGFloat = 3) -> Self { + + super.shadow(shadowOpacity, shadowRadius, shadowOffsetX, shadowOffsetY) + return self + } + + @discardableResult + override func onClick(_ closure: @escaping (UIImageView)->()) -> Self { + cpk_onClick(closure, nil) + return self + } + + @discardableResult + override public func addTo(_ superView: UIView) -> Self { + super.addTo(superView) + return self + } + + @discardableResult + override public func styles(_ s1: Any, _ s2: Any? = nil, _ s3: Any? = nil, _ s4: Any? = nil) -> Self { + super.styles(s1, s2, s3, s4) + return self + } + + @discardableResult + override public func touchInsets(_ p1: Any, _ p2: Any? = nil, _ p3: Any? = nil, _ p4: Any? = nil) -> Self { + super.touchInsets(p1, p2, p3, p4) + return self + } + + @discardableResult + override public func margin(_ p1: Any, _ p2: Any? = nil, _ p3: Any? = nil, _ p4: Any? = nil) -> Self { + super.margin(p1, p2, p3, p4) + return self + } + + @discardableResult + override public func embedIn(_ superview: UIView, + _ p1: Any? = "", _ p2: Any? = "", + _ p3: Any? = "", _ p4: Any? = "") -> Self { + super.embedIn(superview, p1, p2, p3, p4) + return self + } + + @discardableResult + override public func makeCons(_ closure: (ConsMaker)->()) -> Self { + super.makeCons(closure) + return self + } + + @discardableResult + override public func remakeCons(_ closure: (ConsMaker)->()) -> Self { + super.remakeCons(closure) + return self + } +} + + + +extension UIButton { + + @discardableResult + override public func radius(_ cornerRadius: CGFloat) -> Self { + super.radius(cornerRadius) + return self + } + + @discardableResult + override public func tint(_ any: Any) -> Self { + super.tint(any) + return self + } + + @discardableResult + override public func border(_ borderWidth: CGFloat, _ borderColor: Any? = nil) -> Self { + super.border(borderWidth, borderColor) + return self + } + + @discardableResult + override public func shadow(_ shadowOpacity: CGFloat, + _ shadowRadius: CGFloat = 3, + _ shadowOffsetX: CGFloat = 0, + _ shadowOffsetY: CGFloat = 3) -> Self { + + super.shadow(shadowOpacity, shadowRadius, shadowOffsetX, shadowOffsetY) + return self + } + + @discardableResult + override func onClick(_ closure: @escaping (UIButton)->()) -> Self { + cpk_onClick(closure, nil) + return self + } + + @discardableResult + override public func addTo(_ superView: UIView) -> Self { + super.addTo(superView) + return self + } + + @discardableResult + override public func styles(_ s1: Any, _ s2: Any? = nil, _ s3: Any? = nil, _ s4: Any? = nil) -> Self { + super.styles(s1, s2, s3, s4) + return self + } + + @discardableResult + override public func touchInsets(_ p1: Any, _ p2: Any? = nil, _ p3: Any? = nil, _ p4: Any? = nil) -> Self { + super.touchInsets(p1, p2, p3, p4) + return self + } + + @discardableResult + override public func margin(_ p1: Any, _ p2: Any? = nil, _ p3: Any? = nil, _ p4: Any? = nil) -> Self { + super.margin(p1, p2, p3, p4) + return self + } + + @discardableResult + override public func embedIn(_ superview: UIView, + _ p1: Any? = "", _ p2: Any? = "", + _ p3: Any? = "", _ p4: Any? = "") -> Self { + super.embedIn(superview, p1, p2, p3, p4) + return self + } + + @discardableResult + override public func makeCons(_ closure: (ConsMaker)->()) -> Self { + super.makeCons(closure) + return self + } + + @discardableResult + override public func remakeCons(_ closure: (ConsMaker)->()) -> Self { + super.remakeCons(closure) + return self + } +} + + + +extension UITextField { + + @discardableResult + override public func bg(_ any: Any) -> Self { + super.bg(any) + return self + } + + @discardableResult + override public func tint(_ any: Any) -> Self { + super.tint(any) + return self + } + + @discardableResult + override public func radius(_ cornerRadius: CGFloat) -> Self { + super.radius(cornerRadius) + return self + } + + @discardableResult + override public func border(_ borderWidth: CGFloat, _ borderColor: Any? = nil) -> Self { + super.border(borderWidth, borderColor) + return self + } + + @discardableResult + override public func shadow(_ shadowOpacity: CGFloat, + _ shadowRadius: CGFloat = 3, + _ shadowOffsetX: CGFloat = 0, + _ shadowOffsetY: CGFloat = 3) -> Self { + + super.shadow(shadowOpacity, shadowRadius, shadowOffsetX, shadowOffsetY) + return self + } + + @discardableResult + override func onClick(_ closure: @escaping (UITextField)->()) -> Self { + cpk_onClick(closure, nil) + return self + } + + @discardableResult + override public func addTo(_ superView: UIView) -> Self { + super.addTo(superView) + return self + } + + @discardableResult + override public func styles(_ s1: Any, _ s2: Any? = nil, _ s3: Any? = nil, _ s4: Any? = nil) -> Self { + super.styles(s1, s2, s3, s4) + return self + } + + @discardableResult + override public func touchInsets(_ p1: Any, _ p2: Any? = nil, _ p3: Any? = nil, _ p4: Any? = nil) -> Self { + super.touchInsets(p1, p2, p3, p4) + return self + } + + @discardableResult + override public func margin(_ p1: Any, _ p2: Any? = nil, _ p3: Any? = nil, _ p4: Any? = nil) -> Self { + super.margin(p1, p2, p3, p4) + return self + } + + @discardableResult + override public func embedIn(_ superview: UIView, + _ p1: Any? = "", _ p2: Any? = "", + _ p3: Any? = "", _ p4: Any? = "") -> Self { + super.embedIn(superview, p1, p2, p3, p4) + return self + } + + @discardableResult + override public func makeCons(_ closure: (ConsMaker)->()) -> Self { + super.makeCons(closure) + return self + } + + @discardableResult + override public func remakeCons(_ closure: (ConsMaker)->()) -> Self { + super.remakeCons(closure) + return self + } +} + + + +extension UITextView { + + @discardableResult + override public func bg(_ any: Any) -> Self { + super.bg(any) + return self + } + + @discardableResult + override public func tint(_ any: Any) -> Self { + super.tint(any) + return self + } + + @discardableResult + override public func radius(_ cornerRadius: CGFloat) -> Self { + super.radius(cornerRadius) + return self + } + + @discardableResult + override public func border(_ borderWidth: CGFloat, _ borderColor: Any? = nil) -> Self { + super.border(borderWidth, borderColor) + return self + } + + @discardableResult + override public func shadow(_ shadowOpacity: CGFloat, + _ shadowRadius: CGFloat = 3, + _ shadowOffsetX: CGFloat = 0, + _ shadowOffsetY: CGFloat = 3) -> Self { + + super.shadow(shadowOpacity, shadowRadius, shadowOffsetX, shadowOffsetY) + return self + } + + @discardableResult + override func onClick(_ closure: @escaping (UITextView)->()) -> Self { + cpk_onClick(closure, nil) + return self + } + + @discardableResult + override public func addTo(_ superView: UIView) -> Self { + super.addTo(superView) + return self + } + + @discardableResult + override public func styles(_ s1: Any, _ s2: Any? = nil, _ s3: Any? = nil, _ s4: Any? = nil) -> Self { + super.styles(s1, s2, s3, s4) + return self + } + + @discardableResult + override public func touchInsets(_ p1: Any, _ p2: Any? = nil, _ p3: Any? = nil, _ p4: Any? = nil) -> Self { + super.touchInsets(p1, p2, p3, p4) + return self + } + + @discardableResult + override public func margin(_ p1: Any, _ p2: Any? = nil, _ p3: Any? = nil, _ p4: Any? = nil) -> Self { + super.margin(p1, p2, p3, p4) + return self + } + + @discardableResult + override public func embedIn(_ superview: UIView, + _ p1: Any? = "", _ p2: Any? = "", + _ p3: Any? = "", _ p4: Any? = "") -> Self { + super.embedIn(superview, p1, p2, p3, p4) + return self + } + + @discardableResult + override public func makeCons(_ closure: (ConsMaker)->()) -> Self { + super.makeCons(closure) + return self + } + + @discardableResult + override public func remakeCons(_ closure: (ConsMaker)->()) -> Self { + super.remakeCons(closure) + return self + } +} + + + +extension CPKStackView { + + @discardableResult + override public func bg(_ any: Any) -> Self { + super.bg(any) + return self + } + + @discardableResult + override public func tint(_ any: Any) -> Self { + super.tint(any) + return self + } + + @discardableResult + override public func radius(_ cornerRadius: CGFloat) -> Self { + super.radius(cornerRadius) + return self + } + + @discardableResult + override public func border(_ borderWidth: CGFloat, _ borderColor: Any? = nil) -> Self { + super.border(borderWidth, borderColor) + return self + } + + @discardableResult + override public func shadow(_ shadowOpacity: CGFloat, + _ shadowRadius: CGFloat = 3, + _ shadowOffsetX: CGFloat = 0, + _ shadowOffsetY: CGFloat = 3) -> Self { + + super.shadow(shadowOpacity, shadowRadius, shadowOffsetX, shadowOffsetY) + return self + } + + @discardableResult + override func onClick(_ closure: @escaping (CPKStackView)->()) -> Self { + cpk_onClick(closure, nil) + return self + } + + @discardableResult + override public func addTo(_ superView: UIView) -> Self { + super.addTo(superView) + return self + } + + @discardableResult + override public func styles(_ s1: Any, _ s2: Any? = nil, _ s3: Any? = nil, _ s4: Any? = nil) -> Self { + super.styles(s1, s2, s3, s4) + return self + } + + @discardableResult + override public func touchInsets(_ p1: Any, _ p2: Any? = nil, _ p3: Any? = nil, _ p4: Any? = nil) -> Self { + super.touchInsets(p1, p2, p3, p4) + return self + } + + @discardableResult + override public func margin(_ p1: Any, _ p2: Any? = nil, _ p3: Any? = nil, _ p4: Any? = nil) -> Self { + super.margin(p1, p2, p3, p4) + return self + } + + @discardableResult + override public func embedIn(_ superview: UIView, + _ p1: Any? = "", _ p2: Any? = "", + _ p3: Any? = "", _ p4: Any? = "") -> Self { + super.embedIn(superview, p1, p2, p3, p4) + return self + } + + @discardableResult + override public func makeCons(_ closure: (ConsMaker)->()) -> Self { + super.makeCons(closure) + return self + } + + @discardableResult + override public func remakeCons(_ closure: (ConsMaker)->()) -> Self { + super.remakeCons(closure) + return self + } +} + + +extension StaticTableView { + @discardableResult + override public func bg(_ any: Any) -> Self { + super.bg(any) + return self + } + + @discardableResult + override public func tint(_ any: Any) -> Self { + super.tint(any) + return self + } + + @discardableResult + override public func radius(_ cornerRadius: CGFloat) -> Self { + super.radius(cornerRadius) + return self + } + + @discardableResult + override public func border(_ borderWidth: CGFloat, _ borderColor: Any? = nil) -> Self { + super.border(borderWidth, borderColor) + return self + } + + @discardableResult + override public func shadow(_ shadowOpacity: CGFloat, + _ shadowRadius: CGFloat = 3, + _ shadowOffsetX: CGFloat = 0, + _ shadowOffsetY: CGFloat = 3) -> Self { + + super.shadow(shadowOpacity, shadowRadius, shadowOffsetX, shadowOffsetY) + return self + } + + @discardableResult + override public func addTo(_ superView: UIView) -> Self { + super.addTo(superView) + return self + } + + @discardableResult + override public func margin(_ p1: Any, _ p2: Any? = nil, _ p3: Any? = nil, _ p4: Any? = nil) -> Self { + super.margin(p1, p2, p3, p4) + return self + } + + @discardableResult + override public func embedIn(_ superview: UIView, + _ p1: Any? = "", _ p2: Any? = "", + _ p3: Any? = "", _ p4: Any? = "") -> Self { + super.embedIn(superview, p1, p2, p3, p4) + return self + } + + @discardableResult + override public func makeCons(_ closure: (ConsMaker)->()) -> Self { + super.makeCons(closure) + return self + } + + @discardableResult + override public func remakeCons(_ closure: (ConsMaker)->()) -> Self { + super.remakeCons(closure) + return self + } +} + + + + + + + + + + + + + diff --git a/res/appstore.png b/res/appstore.png new file mode 100644 index 0000000000000000000000000000000000000000..32df3f955a1c76b855bc7be444c16dfa8886a24d GIT binary patch literal 55359 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

Vy%5ysD_4-o+Yq!JlcU3bLuP;$ND4 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 z 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 Ce%&(w literal 0 HcmV?d00001 diff --git a/res/cupcake.png b/res/cupcake.png new file mode 100644 index 0000000000000000000000000000000000000000..32961221ffced121894c31005fff797bcf17568b GIT binary patch literal 53350 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