An easy way to create and layout UI components for iOS (Swift version).

Overview

cupcake

Swift4 Swift5 Platform Version License

Introduction

Cupcake is a framework that allow you to easily create and layout UI components for iOS 8.0+. It use chaining syntax and provides some frequent used functionalities that are missing in UIKit.


Easy way to create UIFont, UIImage and UIColor objects

You can create UIFont object with Font() function.

Font(15)                    //UIFont.systemFontOfSize(15)
Font("15")                  //UIFont.boldSystemFontOfSize(15)
Font("body")                //UIFontTextStyle.body
Font("Helvetica,15")        //helvetica with size of 15

You can create UIImage object with Img() function.

Img("imageName")            //image with name
Img("#imageName")           //prefixed with # will return a stretchable image
Img("$imageName")           //prefixed with $ will return a template image
Img("red")                  //1x1 size image with red color

You can create UIColor object with Color() function.

Color("red")                //UIColor.red
Color("0,0,255")            //RGB color
Color("#0000FF")            //Hex color
Color("random")             //random color

Color("red,0.5")            //even with alpha
Color("0,0,255,0.8")
Color("#0000FF,0.5")
Color("random,0.2")

Color(Img("pattern"))       //or image

Easy way to create NSAttributedString objects and String manipulations

You can create NSAttributedString object with AttStr() function.

AttStr("hello").color("red")                        //red color string
AttStr("hello, 101").select("[0-9]+").underline     //101 with underline
AttStr("A smile ", Img("smile"), " !!")             //insert image attachment

String manipulations:

Str(1024)                                           //convert anything to string
Str("1 + 1 = %d", 2)                                //formatted string

"hello world".subFrom(2).subTo("ld")                //"llo wor"
"hello world".subAt(1..<4)                          //"ell"
"hello 12345".subMatch("\\d+")                      //"12345"

4 basic UI components

You can create UIView, UILabel, UIImageView and UIButton objects simply by using View, Label, ImageView and Button variables.

View.bg("red").border(1).radius(4).shadow(0.7, 2)

Label.str("hello\ncupcake").font(30).color("#FB3A9F").lines(2).align(.center)

ImageView.img("cat").mode(.scaleAspectFit)

Button.str("kitty").font("20").color("#CFC8AC").highColor("darkGray").onClick({ _ in
    print("click")
}).img("cat").padding(10).border(1, "#CFC8AC")

As you can see, .font(), .img() and .color() can take the same parameters as Font(), Img() and Color(). Also you can pass String, NSAttributedString or any other values to .str().

Enhancements

You can add click handler and adjust click area to any view.
To round a view with half height no matter what size it is, simply use .radius(-1).

ImageView.img("mario").radius(-1).touchInsets(-40).onClick({ _ in
    print("extending touch area")
})

You can add line spacing and link handling to UILabel.

let str = "Lorem ipsum 20 dolor sit er elit lamet, consectetaur cillium #adipisicing pecu, sed do #eiusmod tempor incididunt ut labore et 3.14 dolore magna aliqua."
let attStr = AttStr(str).select("elit", .number, .hashTag, .range(-7, 6)).link()

Label.str(attStr).lineGap(10).lines().onLink({ text in
    print(text)
})

.bg() allow you to set background for any view with color or image.
.highBg() allow you to set highlighted background for UIButton (which is very useful).
Also you can add spacing to title and image within button or even exchange their position.

Button.str("More").img("arrow").color("black").bg("lightGray,0.3").highBg("lightGray").gap(5).reversed()

You can add placeholder and limit text input to UITextField and UITextView.

TextField.hint("placeholder").maxLength(10).padding(0, 10).keyboard(.numberPad)

TextView.hint("placeholder").maxLength(140).padding(10).onChange({ textView in
    print(textView.text)
})

Easy way to Setup Constraints

You use .pin() to setup simple constraints relative to self or superview.

.pin(200)                       //height constriant
.pin(100, 200)                  //width and height constraints			
.pin(.xy(50, 50))               //left and top constraints relative to superview
.pin(.maxXY(50, 50))            //right and bottom constraints relative to superview
.pin(.center)                   //center equals to superview
 ...
.pin(.lowHugging)               //low content hugging priority, useful when embed in StackView
.pin(.lowRegistance)            //low content compression resistance priority, useful when embed in StackView

You use .makeCons() and .remakeCons() to setup any constraints just like SnapKit.

.makeCons({
    $0.left.top.equal(50, 50)
    $0.size.equal(view2).multiply(0.5, 0.7)
})

.remakeCons({ make in
    make.origin.equal(view2).offset(10, 20)
    make.width.equal(100)
    make.height.equal(view2).multiply(2)
})

You use .embedIn() to embed inside superview with edge constriants.

.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

Easy way to Layout

Setup constraints for every views manually could be tedious. Luckily, you can build most of the layouts by simply using HStack() and VStack() (which are similar to UIStackView) and hopefully without creating any explicit constirants.

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)

appStore

Lightweight Style

Some of the chainable properties can be set as style.

//local style
let style1 = Styles.color("darkGray").font(15)
Label.styles(style1).str("hello world")

//global style
Styles("style2").bg("red").padding(10).border(3, "#FC6560").radius(-1)
Button.styles(style1, "style2").str("hello world")

//copy style from view
let style3 = Styles(someButton)
Button.styles(someButton).str("hello world")

Others

You can create static tableView with PlainTable() or GroupTable() functions.

let titles = ["Basic", "Enhancement", "Stack", "StaticTable", "Examples"]
PlainTable(titles).onClick({ row in
    print(row.indexPath)
})

You can present Alert And ActionSheet using the chaining syntax as well.

Alert.title("Alert").message("message go here").action("OK").show()

ActionSheet.title("ActionSheet").message("message go here").action("Action1", {
    print("Action1")
}).action("Action2", {
    print("Action2")
}).cancel("Cancel").show()

Installation

Cocoapods

Cupcake can be added to your project using CocoaPods by adding the following line to your Podfile:

pod "Cupcake"

Carthage

If you're using Carthage you can add a dependency on Cupcake by adding it to your Cartfile:

github "nerdycat/Cupcake"
You might also like...
Auto Layout In Swift Made Easy

Swiftstraints Swiftstraints can turn verbose auto-layout code: let constraint = NSLayoutConstraint(item: blueView, attr

Auto Layout made easy
Auto Layout made easy

EasyPeasy is a Swift framework that lets you create Auto Layout constraints programmatically without headaches and never ending boilerplate code. Besi

An flexbox layout aimed at easy to use, which depend on Yoga.
An flexbox layout aimed at easy to use, which depend on Yoga.

DDFlexbox A flexbox framework for easy using. Install pod 'DDFlexbox' Template install Recommend using templates to create flexbox views. cd Script/

Easy Auto Layout

RKAutoLayout Easy AutoLayout TL;DR let view1: UIView = UIView() let view2: UIView = UIView() view1.addSubview(view2) /// Add all view1.rk_alAdd(

Fancy Swift implementation of the Visual Format Language (experimental and doesn't work with the recent version of Swift)
Fancy Swift implementation of the Visual Format Language (experimental and doesn't work with the recent version of Swift)

VFLToolbox Autolayout is awesome! VFL a.k.a Visual Format Language is even more awesome because it allows you to shorten constraints setting code. The

Easy to create & custom segmented view
Easy to create & custom segmented view

TCSegmentedView Easy to create & custom segmented view Usage Examples An Objective-C example project demonstrating customization options is included i

Library that makes it easy to create multiple environments within a single app. You can switch environments without deleting the application.

AppContainer Library that makes it easy to create multiple environments within a single app. You can switch environments without deleting the applicat

Semi-automatic installation of mods for the iOS version of KOTOR 1

KOTOR 1 Mod Manager Welcome to KOTOR 1 Mod Manager (K1MM for short), a tool designed to allow easy and simple installation of mods for the iOS version

Harness the power of AutoLayout NSLayoutConstraints with a simplified, chainable and expressive syntax. Supports iOS and OSX Auto Layout

Masonry Masonry is still actively maintained, we are committed to fixing bugs and merging good quality PRs from the wider community. However if you're

Owner
nerdycat
nerdycat
Auto Layout made easy with the Custom Layout.

Auto Layout made easy with the Custom Layout. Getting started CocoaPods CocoaPods is a dependency manager for Cocoa projects. You can install it with

Malith Nadeeshan 1 Jan 16, 2022
UIView category which makes it easy to create layout constraints in code

FLKAutoLayout FLKAutoLayout is a collection of categories on UIView which makes it easy to setup layout constraints in code. FLKAutoLayout creates sim

Florian Kugler 1.5k Nov 24, 2022
Written in pure Swift, QuickLayout offers a simple and easy way to manage Auto Layout in code.

QuickLayout QuickLayout offers an additional way, to easily manage the Auto Layout using only code. You can harness the power of QuickLayout to align

Daniel Huri 243 Oct 28, 2022
Auto Layout (and manual layout) in one line.

Auto Layout (and manual layout) in one line. Quick Look view.bb.centerX().below(view2).size(100) It’s equivalent to iOS 9 API: view.centerXAnchor.cons

Javier Zhang 74 Oct 19, 2022
AppStoreClone - Understanding the complex layout of app store using UICompositional layout in swift

AppStoreClone Understanding the complex layout of app store using UICompositiona

Dheeraj Kumar Sharma 8 Dec 28, 2022
A custom layout built on top of SwiftUI's Layout API that lays elements out in multiple lines. Similar to flex-wrap in CSS, CollectionViewFlowLayout.

WrapLayout A custom layout built on top of SwiftUI's Layout API that lays elements out in multiple lines. Similar to flex-wrap in CSS, CollectionViewF

Hiroshi Kimura 6 Sep 27, 2022
Paging Video UI, and some control components is available.

VideoPager [![CI Status](http://img.shields.io/travis/Takuya Okamoto/VideoPager.svg?style=flat)](https://travis-ci.org/Takuya Okamoto/VideoPager) Demo

Takuya Okamoto 55 Dec 23, 2022
Decathlon Design System UI components for iOS & iPadOS applications

Vitamin iOS Decathlon Design System libraries for iOS & iPadOS applications Website Introduction Decathlon Design System is the framework that helps o

Decathlon 24 Dec 15, 2022
MyLayout is a simple and easy objective-c framework for iOS view layout

MyLayout is a powerful iOS UI framework implemented by Objective-C. It integrates the functions with Android Layout,iOS AutoLayout,SizeClass, HTML CSS float and flexbox and bootstrap. So you can use LinearLayout,RelativeLayout,FrameLayout,TableLayout,FlowLayout,FloatLayout,PathLayout,GridLayout,LayoutSizeClass to build your App 自动布局 UIView UITableView UICollectionView RTL

欧阳大哥2013 4.2k Dec 30, 2022
FlightLayout is a light weight, and easy to learn layout framework as an extension of the UIView.

FlightLayout Introduction FlightLayout is a light weight, and easy to learn layout framework as an extension of the UIView. Functionally, it lives som

Anton 23 Apr 21, 2022