DEV Community

Sadman Samee
Sadman Samee

Posted on • Edited on

SwiftUI Cheat Sheet

SwiftUI Cheat Sheet

SwiftUI

This was originally published in here, in Github

Table of Contents

Tutorial

UIKIT equivalent in SwiftUI

UIKIT SwiftUI
UILabel Text
UIImageView Image
UITextField TextField
UITextView No equivalent (use Text)
UISwitch Toggle
UISlider Slider
UIButton Button
UITableView List
UICollectionView No equivalent (can be implemented by List)
UINavigationController NavigationView
UIAlertController with style .alert Alert
UIAlertController with style .actionSheet ActionSheet
UIStackView with horizontal axis HStack
UIStackView with vertical axis VStack
UISegmentedControl SegmentedControl
UIStepper Stepper
UIDatePicker DatePicker
NSAttributedString No equivalent (use Text)

View

Text

To show a text in UI simply write

 Text("Hello World") 
Enter fullscreen mode Exit fullscreen mode

To add style

 Text("Hello World") .font(.largeTitle) .foregroundColor(Color.green) .lineSpacing(50) .lineLimit(nil) .padding() 
Enter fullscreen mode Exit fullscreen mode

To format text inside text view

 static let dateFormatter: DateFormatter = { let formatter = DateFormatter() formatter.dateStyle = .long return formatter }() var now = Date() var body: some View { Text("Task due date: \(now, formatter: Self.formatter)") } 
Enter fullscreen mode Exit fullscreen mode

Image

To show image

 Image("hello_world") //image name is hello_world 
Enter fullscreen mode Exit fullscreen mode

To use system icon

 Image(systemName: "cloud.heavyrain.fill") 
Enter fullscreen mode Exit fullscreen mode

you can add style to system icon set

 Image(systemName: "cloud.heavyrain.fill") .foregroundColor(.red) .font(.largeTitle) 
Enter fullscreen mode Exit fullscreen mode

Add style to Image

 Image("hello_world") .resizable() //it will sized so that it fills all the available space .aspectRatio(contentMode: .fill) .padding(.bottom) 
Enter fullscreen mode Exit fullscreen mode

Shape

To create Rectangle

 Rectangle() .fill(Color.red) .frame(width: 200, height: 200) 
Enter fullscreen mode Exit fullscreen mode

To create circle

 Circle() .fill(Color.blue) .frame(width: 50, height: 50) 
Enter fullscreen mode Exit fullscreen mode

Layout

Background

To use image as a background

 Text("Hello World") .font(.largeTitle) .background( Image("hello_world") .resizable() .frame(width: 100, height: 100)) 
Enter fullscreen mode Exit fullscreen mode

Gradient background

 Text("Hello World") .background(LinearGradient(gradient: Gradient(colors: [.white, .red, .black]), startPoint: .leading, endPoint: .trailing), cornerRadius: 0) 
Enter fullscreen mode Exit fullscreen mode

VStack

Shows child view vertically

 VStack { Text("Hello") Text("World") } 
Enter fullscreen mode Exit fullscreen mode

Styling

 VStack (alignment: .leading, spacing: 20){ Text("Hello") Divider() Text("World") } 
Enter fullscreen mode Exit fullscreen mode

HStack

Shows child view horizontally

 HStack { Text("Hello") Text("World") } 
Enter fullscreen mode Exit fullscreen mode

ZStack

To create overlapping content use ZStack

 ZStack() { Image("hello_world") Text("Hello World") .font(.largeTitle) .background(Color.black) .foregroundColor(.white) } 
Enter fullscreen mode Exit fullscreen mode

Input

Toggle

Toggle lets users move between true and false states

 @State var isShowing = true //state Toggle(isOn: $isShowing) { Text("Hello World") }.padding() 
Enter fullscreen mode Exit fullscreen mode

Button

To create button

 Button(action: { // do something }) { Text("Click Me") } 
Enter fullscreen mode Exit fullscreen mode

To create image Button

 Button(action: { // do something }) { Image("hello_world") } 
Enter fullscreen mode Exit fullscreen mode

TextField

It heavily relies in state, simply create a state and pass it as it will bind to it

 @State var fullName: String = "Joe" //create State TextField($fullName) // passing it to bind .textFieldStyle(.roundedBorder) //adds border 
Enter fullscreen mode Exit fullscreen mode

To create secure TextField

 @State var password: String = "" //create State SecureField($password) // passing it to bind .textFieldStyle(.roundedBorder) //adds border 
Enter fullscreen mode Exit fullscreen mode

Slider

 @State var value: Double = 0 //create State Slider(value: $value, from: -100, through: 100, by: 1) 
Enter fullscreen mode Exit fullscreen mode

Date Picker

 @State var selectedDate = Date() DatePicker( $selectedDate, maximumDate: Date(), displayedComponents: .date ) 
Enter fullscreen mode Exit fullscreen mode

Segmented Control

 @State var favoriteColor = 0 var colors = ["Red", "Green", "Blue"] SegmentedControl(selection: $favoriteColor) { ForEach(0..<colors.count) { index in Text(self.colors[index]).tag(index) } } 
Enter fullscreen mode Exit fullscreen mode

Tap

For single tap

 Text("Tap me!") .tapAction { print("Tapped!") } 
Enter fullscreen mode Exit fullscreen mode

For double tap

 Text("Tap me!") .tapAction (count: 2){ print("Tapped!") } 
Enter fullscreen mode Exit fullscreen mode

Gesture

Gesture like TapGesture, LongPressGesture, DragGesture

 Text("Tap") .gesture( TapGesture() .onEnded { _ in } ) Text("Long Press") .gesture( DragGesture(minimumDistance: 50) .onEnded { _ in } ) Text("Drag Me") .gesture( LongPressGesture(minimumDuration: 2) .onEnded { _ in } ) 
Enter fullscreen mode Exit fullscreen mode

List

To create static scrollable List

 List { Text("Hello world") Text("Hello world") Text("Hello world") } 
Enter fullscreen mode Exit fullscreen mode

To create dynamic List

 let names = ["Thanos", "Iron man", "Ant man"] List(names) { name in Text(name) } 
Enter fullscreen mode Exit fullscreen mode

To add section

 List { Section(header: Text("Good Hero")) { Text("Thanos") } Section(header: Text("Bad Heros")) { Text("Iron man") } } 
Enter fullscreen mode Exit fullscreen mode

To make it grouped add .listStyle(.grouped)

 List { Section(header: Text("Good Hero")) { Text("Thanos") } Section(header: Text("Bad Heros")) { Text("Iron man") } }.listStyle(.grouped) 
Enter fullscreen mode Exit fullscreen mode

Containers

NavigationView

NavigationView is more/less like UINavigationController, It handles navigation between views, shows title, places navigation bar on top.

 NavigationView { Text("Hello") .navigationBarTitle(Text("World"), displayMode: .inline) } 
Enter fullscreen mode Exit fullscreen mode

For large title use .large

Add bar items to NavigationView

 NavigationView { Text("Hello") .navigationBarTitle(Text("World"), displayMode: .inline) .navigationBarItems(trailing: Button(action: { print("Going to Setting") }) { Text("Setting") }) } 
Enter fullscreen mode Exit fullscreen mode

Group

Group creates several views to act as one, also to avoid Stack's 10 View maximum limit.

 VStack { Group { Text("Hello") Text("Hello") Text("Hello") } Group { Text("Hello") Text("Hello") } } 
Enter fullscreen mode Exit fullscreen mode

Alerts and Action Sheets

To Show an Alert

 Alert(title: Text("Title"), message: Text("message"), dismissButton: .default(Text("Ok!"))) 
Enter fullscreen mode Exit fullscreen mode

To Show Action Sheet

 ActionSheet(title: Text("Title"), message: Text("Message"), buttons: [.default(Text("Ok!"), onTrigger: { })]) 
Enter fullscreen mode Exit fullscreen mode

Navigation

Navigate via NavigationButton

 NavigationView { NavigationButton(destination: SecondView()) { Text("Show") }.navigationBarTitle(Text("First View")) } 
Enter fullscreen mode Exit fullscreen mode

Navigate via tap on List Item

 let names = ["Thanos", "Iron man", "Ant man"] List(names) { name in NavigationButton(destination: HeroView(name: name)) { Text(name) } } 
Enter fullscreen mode Exit fullscreen mode

Navigate via PresentationButton

 PresentationButton(Text("Tap"), destination: HeroView()) 
Enter fullscreen mode Exit fullscreen mode

Work with UIKIT

Navigate to ViewController

It's possible to work with UIKIT component from SwiftUI or call SwiftUI view as View Controller from UIKIT.

Let's say you have a View Controller named as SuperVillainViewController and want to call from SwiftUI view, to do that ViewController need to implement UIViewControllerRepresentable

 struct SuperVillainViewController: UIViewControllerRepresentable { var controllers: [UIViewController] func makeUIViewcontroller(context: Context) SuperVillainViewController { // you could have a custom constructor here, I'm just keeping it simple let vc = SuperVillainViewController() retrun vc } } 
Enter fullscreen mode Exit fullscreen mode

Now you can use it like

 NavigationButton(destination: SuperVillainViewController()) { Text("Click") } 
Enter fullscreen mode Exit fullscreen mode

Use UIKit and SwiftUI Views Together

To use UIView subclasses from within SwiftUI, you wrap the other view in a SwiftUI view that conforms to the UIViewRepresentable protocol. (Reference)

as example

 import SwiftUI import MapKit struct MapView: UIViewRepresentable { func makeUIView(context: Context) -> MKMapView { MKMapView(frame: .zero) } func updateUIView(_ view: MKMapView, context: Context) { let coordinate = CLLocationCoordinate2D( latitude: 34.011286, longitude: -116.166868) let span = MKCoordinateSpan(latitudeDelta: 2.0, longitudeDelta: 2.0) let region = MKCoordinateRegion(center: coordinate, span: span) view.setRegion(region, animated: true) } } struct MapView_Preview: PreviewProvider { static var previews: some View { MapView() } } 
Enter fullscreen mode Exit fullscreen mode

Top comments (1)

Collapse
 
yourdevguy profile image
Mike Haslam

Thanks for sharing whats not to like about a good cheat sheet. Super Cool Of you