Ios-desde-cero - Code, documents and resources used in the Stream iOS from scratch

Overview

iOS desde cero

¿Qué es esto?

iOS desde Cero es un Streaming en 🇪🇸 sobre desarrollo iOS, que puedes seguir en directo en Twitch. O en diferido en mi canal de Youtube.

Es un stream, así que no esperes un curso, o un video perfectamente elaborado. Cometeré errores, me verás teclear el código, depurar programas y mirar la documentación. StackOverflow hará más de una aparición estelar. Es real como la vida misma.

Te espero en:

¿Cuándo lo perpetras?

Los episodios se emiten Martes y Jueves en horario:

Martes y Jueves
12:00 🇲🇽 Ciudad de México
12:00 🇺🇸 Dallas
12:00 🇺🇸 Nueva York
12:00 🇨🇷 San José
13:00 🇨🇴 Bogotá
13:00 🇵🇦 Ciudad de Panamá
13:00 🇨🇺 La Habana
13:00 🇵🇪 Lima
13:00 🇪🇨 Quito
14:00 🇻🇪 Caracas
14:00 🇧🇴 La Paz
15:00 🇵🇾 Asunción
15:00 🇦🇷 Buenos Aires
15:00 🇺🇾 Montevideo
15:00 🇨🇱 Santiago de Chile
19:00 🇪🇸 Madrid

Si echas de menos la capital de tu país, abre un issue

Si cancelo algún episodio lo anunciaré por Twitter y puedes consultar la planificación en Twitch

Requisitos para seguir el Streaming

  • un ordenador y conexión a Internet 😜
  • para escribir Apps iOS se necesita un ordenador que corra macOS. Big Sur o Monterrey son necesarios.
  • Xcode 13.2
  • Conocimientos básicos de programación. No es imprescindible conocer Swift, aunque ayuda.
  • Ganas de programar y pasar un buen rato. Esto no es el trabajo o los estudios. Es para pasarlo bien y compartir.

Pero, de qué vas a hablar

Aunque tengo una idea muy general de lo que voy a ir viendo en los distintos episodios, se verá lo que la comunidad quiera.

Es decir, que si algo no se entiende, se volverá a ver. Si hay interés en ver algo concreto, igual. Siempre recordando que esto es un canal para gente empezando con iOS y no es consultoría gratis. Esa la cobro aparte. Y caro. 💸

¿Y si me pierdo el Streaming?

Al día siguiente publicaré en esta lista de reproducción de Youtube el episodio correspondiente:

iOS Desde Cero

Recursos

Comments
  • El tema de los colores.

    El tema de los colores.

    Lo que comenté en el Episodio 020, entiendo que funcione así (porque patata), pero no entiendo por qué uno tiene "dos tonos" y el otro no...

    ContentView.swift

    import SwiftUI
    
    let colors1: [UIColor] = [.blue, .green, .orange, .red, .purple, .brown, .gray] // UIKit
    let colors2: [UIColor] = [.systemBlue, .systemGreen, .systemOrange, .systemRed, .systemPurple, .systemBrown, .systemGray] // UIKit System
    let colors3: [Color] = [.blue, .green, .orange, .red, .purple, .brown, .gray] // SwiftUI
    
    struct ContentView: View {
        var body: some View {
            HStack(spacing:0) {
                VStack(spacing: 0) {
                    ForEach(colors1, id: \.self) { color in
                        Text("UIKit")
                            .foregroundColor(.white)
                            .frame (maxWidth: .infinity, minHeight: 64)
                            .background(Color(color))
                    }
                }
                VStack(spacing: 0) {
                    ForEach(colors2, id: \.self) { color in
                        Text("UIKit System")
                            .foregroundColor(.white)
                            .frame (maxWidth: .infinity, minHeight: 64)
                            .background(Color(color))
                    }
                }
                VStack(spacing: 0) {
                    ForEach(colors3, id: \.self) { color in
                        Text("SwiftUI")
                            .foregroundColor(.white)
                            .frame (maxWidth: .infinity, minHeight: 64)
                            .background(color)
                    }
                }
            }
        }
    }
    
    struct ContentView_Previews: PreviewProvider {
        static var previews: some View {
            ContentView()
        }
    }
    
    opened by oliverjtowers 2
  • Marcación de ámbitos

    Marcación de ámbitos

    Buenos días,

    He comprobado que en tu Xcode al lado de los números te aparece una marcación en forma de barras grises que te indican los ámbitos (donde empiezan y acaban las llaves "{ }"). ¿Eso en qué parte del IDE se activa ?

    Ejem: https://clips.twitch.tv/OnerousPeacefulAdminOneHand-9Vj02eQJlGkfAK0u

    Salu2.

    opened by oliverjtowers 2
  • Twitimer (de Mouredev)

    Twitimer (de Mouredev)

    ¡Hola Diego, ¿Conoces #Twitimer?

    Es una App de MoureDev creada con la comunidad de developers para que los streamers puedan añadir sus horarios de emisión en Twitch y notificar a su audiencia cada vez que hagan.

    Se puede descargar para iOS y Android de forma gratuita y si te registrar como creador de contenido, los que te sigamos a traves de la App, recibiremos una notificación si cambias algún horario, etc...

    Si quieres ver toda la info... https://twitimer.com

    Espero volver a retomar la programación de Apps gracias a ti. Un saludo y muchas gracias.

    enhancement 
    opened by urangae 2
  • Evitando el solape de animaciones en PlaneView.swift

    Evitando el solape de animaciones en PlaneView.swift

    Esta aproximación no es del todo mía (he recibido ayudita jaja), pero creo que evita el problema que tiene el avión:

    import SwiftUI
    
    struct PlaneView: View {
        private let circleDiameter = 300.0
        private let planeSide: CGFloat = 40.0
        @State private var animate = false
        
        var body: some View {
            ZStack {
                Spacer()
                    .frame(maxWidth: .infinity, maxHeight: .infinity)
                
                Circle()
                    .stroke()
                    .scaledToFit()
                    .frame(width: circleDiameter)
                
                Image(systemName: "airplane")
                    .resizable()
                    .scaledToFit()
                    .frame(width: planeSide)
                    .rotationEffect(.degrees(90.0))
                    .frame(width: circleDiameter + planeSide, alignment: .trailing)
                
            }
            .rotationEffect(.degrees(animate ? 360.0 : 0.0))
            .onAppear {
                
                withAnimation(.linear(duration: 5).repeatForever(autoreverses: false)) {
                    animate = true
                }
                
            }.background(LinearGradient(colors: rainbowColors, startPoint: .top, endPoint: .bottom))
            
        }
        
    }
    
    struct PlaneView_Previews: PreviewProvider {
        static var previews: some View {
            PlaneView()
        }
    }
    
    opened by oliverjtowers 1
  • Activación single touch

    Activación single touch

    Tal vez te interese para los streams activar la visualización del single touch en el simulador para que los muestre como si fueran una pulsación de dedo. Queda muy bien esta configuración para vídeo tutoriales.

    defaults write com.apple.iphonesimulator ShowSingleTouches 1

    Salu2.

    enhancement 
    opened by oliverjtowers 1
  • Las áreas de xCode

    Las áreas de xCode

    Estaría bien que enseñases las distintas zonas y herramientas de xCode y para qué sirven: la toolbar de arriba, la consola de depuración, el explorador de proyectos, etc

    opened by TyflosAccessibleSoftware 1
  • PixelDrawingView: Posible solución para refrescar el borrado

    PixelDrawingView: Posible solución para refrescar el borrado

    No se si será la mejor solución, pero se podría hacer lo siguiente...

    En PixelDrawingView declaramos una variable binding para pasarle el array de pixelArts

    @Binding public var parentPixelArts: [PixelArt]
    

    Modificamos el init de PixelDrawingView añadiendo el nuevo parámetro parentPixelArts y lo asignamos a la variable Binding:

    /// Must be public to allow creating instances out of this package
        public init(pixelArt: Binding<PixelArt>, parentPixelArts: Binding<[PixelArt]>) {
            self._pixelArt = pixelArt
            self._draftPixelArt = State(initialValue: pixelArt.wrappedValue)
            self._parentPixelArts = parentPixelArts
        }
    

    Modificamos el body de PixelDrawingView con lo siguiente:

    public var body: some View {
            if !parentPixelArts.contains(where: {$0.id == self.pixelArt.id || $0.name == self.pixelArt.name}) {
                Text("PixelArt has been deleted!")
            }else{
    
    

    He puesto una doble condición porque el PixelArt.from cambia el "id"... habría que tener una clave id fija que no cambiara. Asumo que el nombre es clave.

    Por último solo faltaría pasar el array de pixelArts en PixelArtListView:

    struct PixelArtListView: View {
        
        @State var pixelArts: [PixelArt]
     
        var body: some View {
            NavigationView{
                List($pixelArts) { pixelArt in
                    NavigationLink(destination: PixelDrawingView(pixelArt: pixelArt, parentPixelArts: $pixelArts)){
    
    
    opened by cHuMaRi 0
  • PixelArtKit: Problema de inicialización en PixelDrawingView

    PixelArtKit: Problema de inicialización en PixelDrawingView

    Al parecer, como en otros lenguajes, se puede acceder al setter de la propiedad con el guión bajo... si no se queja Xcode al asignar el valor. Con State() se pueden inicializar las variables @State, y ya no es necesario poner el ! en la declaración de la variable pixelArt

    También se pueden inicializar con la siguiente sintaxis, pero me parece un poco feote:

    
    self._pixelArt = /*State<PixelArt>*/.init(initialValue: ....
    
    

    Así es como yo lo tengo:

    
    import SwiftUI
    
    public struct PixelDrawingView: View {
        
        static let numberOfColumns: Int = 10
        @State var pixelArt: PixelArt
        let columns: [GridItem] = generateColumns(numberOfColumns, columnWidht: 22)
        
        @State private var color: Color = .blue
        private let pixelSquareSize: CGFloat = 20
        
        public init(pixelArt: PixelArt? = nil) {
            
            self._pixelArt = State(initialValue: pixelArt ?? PixelArt(pixels: PixelArt.generatePixelArtPattern(size: PixelDrawingView.numberOfColumns),
                                                 name: "",
                                                 dateCreation: Date(),
                                                 dateLastModification: Date()))
             
        }
        
        public var body: some View {
            VStack{
                Text("Awesome Pixel Painter 🎨")
                    .padding()
                
                PixelArtView(pixelArt: pixelArt, colums: columns, pixelSquareSize: pixelSquareSize) { (pixel: Pixel) in
                    print("Touch on row: \(pixel.row) col: \(pixel.col)")
                    
                    pixelArt = PixelArt.from(pixelArt: pixelArt, row: pixel.row, col: pixel.col, color: color, numberOfColumns: PixelDrawingView.numberOfColumns)
                }
                
                PixelArtView(pixelArt: pixelArt,
                             colums: PixelDrawingView.generateColumns(PixelDrawingView.numberOfColumns, columnWidht: 7),
                             pixelSquareSize: 5.0)
                
                ColorPicker("Pick color", selection: $color)
                    .padding()
                
                HStack{
                    Button("Clear") {
                        pixelArt = PixelArt.from(pixelArt: pixelArt,
                                                 newPixels: PixelArt.generatePixelArtPattern(size: 10, color: .black))
                    }
                    
                    Button("Random") {
                        pixelArt = PixelArt.from(pixelArt: pixelArt,
                                                 newPixels: PixelArt.generatePixelArtPattern(size: 10))
                    }
                    
                    Button("Fill") {
                        pixelArt = PixelArt.from(pixelArt: pixelArt,
                                                 newPixels: PixelArt.generatePixelArtPattern(size: 10, color: color))
                    }
                }
    #if targetEnvironment(macCatalyst)
                .frame(maxHeight: 100)
    #else
                .frame(maxHeight: 50)
    #endif
                .padding()
            }
        }
    }
    
    extension PixelDrawingView {
        
        static func generateColumns(_ numCols: Int, columnWidht: CGFloat) -> [GridItem] {
            var columns: [GridItem] = []
            
            for _ in 0..<numCols {
                columns.append(GridItem(.fixed(columnWidht), spacing: 0, alignment: .center))
            }
            
            return columns
        }
    }
    
    struct ContentView_Previews: PreviewProvider {
        static var previews: some View {
            PixelDrawingView()
        }
    }
    
    
    
    opened by cHuMaRi 0
Owner
Diego Freniche
Writing bugs, one at a time. Unit testing them. These days mainly Swift for iOS and Kotlin for Android. Mobile Developer Advocate at Realm
Diego Freniche
Don't start from scratch, start from Here! This is a starter project for iOS projects. It contains all the basic configurations and common libraries for your project.

Starter-iOS Don't start from scratch, start from Here! This is a starter project for iOS projects. It contains all the basic configurations and common

Shaban Kamel 6 May 24, 2022
Create a weather app from scratch with this SwiftUI Crash Course

"Create a weather app from scratch with this SwiftUI Crash Course" https://youtu

Alexey Saechnikov 0 Dec 17, 2021
The Discord API implementation behind Swiftcord, implemented completely from scratch in Swift

DiscordKit The Discord API implementation that powers Swiftcord This implementation has fully functional REST and Gateway support, but is mainly geare

Swiftcord 71 Dec 20, 2022
MovieAppSwiftUI - The Application is using TMDB API and Server API to reduce user searching movies resources time with search engine

MovieAppSwiftUI The Application is using TMDB API and Server API to reduce user searching movies resources time with search engine.This Application is

JackSon_tm.m 5 Oct 29, 2022
Mobile app for University of Washington students to find resources and information about the school.

ExploreUW App Description Mobile app for University of Washington students to find resources and information about the school. Collaborators Christian

Christian Calloway 2 Jun 3, 2022
Advent Of Code (AoC) 2021Advent Of Code (AoC) 2021

AoC-2021 Advent Of Code (AoC) 2021 This are my solutions to the Advent Of Code 2021 event. This year I've been playing along with timsearle and SFrost

Mike Bignell 1 Dec 16, 2021
Jotify is an iOS app used for lightning fast note-taking and reminders, all written in swift.

Jotify About Jotify is an iOS app used for lightning fast note-taking and reminders, all written in swift. It uses several of Apple's newest framework

Harrison Leath 122 Jan 5, 2023
Food Order App for iOS. VIPER pattern, Alamofire and Firebase used.

Nibble Yemek Sipariş Uygulaması Techcareer.net Techmasters IOS Bootcamp bitirme ödevi için hazırladığım bir yemek sipariş uygulaması. API KEY SON GEÇE

null 2 Sep 20, 2022
Used: SwiftUI and Combine

NewsApp Used: New Apple frameworks SwiftUI and Combine Installation: 1. Get your News API key 2. Get your Weather API key 3. Insert your keys into Con

Alexey 359 Dec 29, 2022
An unofficial version of the Sandwiches app and pre-built materials similar to those used in the Introduction to SwiftUI session video from WWDC20

Unofficial Sandwiches The WWDC20 Session Introduction to SwiftUI provides a tutorial-like walk-through of building a list-detail SwiftUI app from scra

James Dempsey 94 Feb 11, 2022
LiberIOS - LiberIOS used Xcode and SwiftUI

LiberIOS For this test, i have used Xcode and SwiftUI. For the authentication i

null 0 Jan 12, 2022
Todo is an iOS App written in Swift. This app is used for an online video training course. This app demonstrates how to use UITableViewController.

Todo Todo is an iOS App written in Swift. This app is used for an online video training course. This app demonstrates how to use UITableViewController

Jake Lin 273 Dec 29, 2022
A SwiftUI wrapper around the `Add to Siri` button used to donate INIntents to the system.

AddToSiri A SwiftUI wrapper around the Add to Siri button used to donate INIntents to the system. Originally created by Reddit user u/dippnerd (Github

Florian Schweizer 5 Nov 23, 2022
App that is used by coffee drinkers to advise appropriate bedtime based on wake up preference

BetterRest App that is used by coffee drinkers to advise appropriate bedtime bas

Bogdan Alex Ciobanu 1 Feb 10, 2022
NewsApp - MVVM pattern have been used

NewsApp MVVM pattern have been used. All features are working properly as suppose to. Alamofire, Kingfisher, lottie-ios and IQKeyboardManagerSwift pod

Uğur Can GEDİK 0 Jun 6, 2022
Companion app and XCode extension for adding SwiftUI recipes to your code.

SwiftUI Recipes Companion Free Companion app and XCode extension for adding SwiftUI recipes to your code. Choose from a rich selection of SwiftUI reci

Gordan Glavaš 17 Nov 20, 2022
Glow Weather app source code

Glow-Weather Weather & air quality application created with a glow theme. This weather app uses APIs from weatherapi.com, and allows users to search t

Nate Lee 2 Nov 30, 2021
This repository contains code for building Universal Apps with SwiftUI.

MindLikeWater This Repo This repository contains code for building Universal Apps with SwiftUI. The same codebase can be compiled to produce binaries

Jorge D. Ortiz Fuentes 1 Nov 23, 2021
The demo project to show how to organize code to make SwiftUI apps easy to be test.

TestableApp I combined the idea to use functional programming instead of an loader instance in ModelView(I prefer to think of it as a service) and Res

VictorK 2 Jan 7, 2022