ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

iOS & swift

[SwiftUI] Apple Tutorials

ggasoon2 2023. 4. 2. 15:08

์ƒ์„ฑํ•œ App ๊ตฌ์กฐ์ฒด

import SwiftUI

@main
struct LandMarksApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

 

  1. @Main → ๊ตฌ์กฐ์ฒด ์„ ์–ธ ์•ž์— @main ํŠน์„ฑ์„ ๋ถ™์—ฌ ์•ฑ์˜ ์ง„์ž…์ ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์•ฑ์€ ํ•˜๋‚˜์˜ ์ง„์ž…์ ๋งŒ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
  2. App protocol: ์•ฑ์˜ ๊ตฌ์กฐ์™€ ๋™์ž‘์„ ๋‚˜ํƒ€๋‚ด๋Š” ์œ ํ˜•์ž…๋‹ˆ๋‹ค.

→ ์•ฑ ์‹œ์ž‘์‹œ ContentView๋ฅผ ๋„์šฐ๊ฒ ๋‹ค๋Š” ์˜๋ฏธ

 

 

 

ContentView

import SwiftUI

struct ContentView: View {
    var body: some View {
        Text("Hello, world!")
            .padding()
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

 

 

MapView

import SwiftUI
import MapKit

struct MapView: View {
    @State private var region = MKCoordinateRegion(
        center: CLLocationCoordinate2D(latitude: 34.011, longitude: -116.166),
        span: MKCoordinateSpan(latitudeDelta: 0.2, longitudeDelta: 0.2)
    )

    var body: some View {
        Map(coordinateRegion: $region)
    }
}

struct MapView_Previews: PreviewProvider {
    static var previews: some View {
        MapView()
    }
}

 

1. @State - ๋ทฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜

2. ๋ณ€์ˆ˜์•ž์— $ ์ง€์ •ํ•˜๋ฉด,@State ๋ณ€์ˆ˜๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ ๋งˆ๋‹ค ๋ฐ”์ธ๋”ฉ

 

 

 

Image ๋„ฃ๊ณ  ContentMode ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

 

์ˆœ์„œ๊ฐ€ ์ค‘์š”

  1. resizeable() - ํ™”๋ฉด ํฌ๊ธฐ์— ๋งž์ถ”์–ด ์ฑ„์›Œ์คŒ
  2. aspectRatio(contentMode: .fit) - frame ์ด์ „์— contentMode์ ์šฉ
  3. ์ดํ›„ frame ํฌ๊ธฐ ๋งž์ถฐ์ฃผ๊ธฐ
  4. .frame(width: 200, height: 230)๊ทธ๋‹ค์Œ clip to bouns ์ ์šฉ .clipShape(Circle()) ๋˜๋Š” .clipShape(RoundedRectangle(cornerSize: .init(width: 40, height: 40)))

 

import SwiftUI

struct CircleImage: View {
    var body: some View {
        VStack {
            Image("test")
                .aspectRatio(contentMode: .fill)
                .frame(width: 200, height: 200)
                .clipShape(Circle())
                .overlay {
                    Circle().stroke(.white, lineWidth: 3)
                }
                .shadow(radius: 5)
        }
    }
}

struct CircleImage_Previews: PreviewProvider {
    static var previews: some View {
        CircleImage()
    }
}

 

 

List ๋งŒ๋“ค๊ธฐ

 

import SwiftUI

struct LandmarkList: View {
    var body: some View {
        List(landmarks, id: \.id) { landmark in
            LandmarkRow(landmark: landmark)
        }
    }
}

struct LandmarkList_Previews: PreviewProvider {
    static var previews: some View {
        LandmarkList()
    }
}

 

+ Data ๊ตฌ์กฐ์ฒด์— Hashable ํ”„๋กœํ† ์ฝœ ์ถ”๊ฐ€

 

import Foundation
import SwiftUI
import CoreLocation

struct Landmark: Hashable, Codable {
    var id: Int
    var name: String
    var park: String
    var state: String
    var description: String

    private var imageName: String
    var image: Image {
        Image(imageName)
    }

    private var coordinates: Coordinates
    var locationCoordinate: CLLocationCoordinate2D {
        CLLocationCoordinate2D(
            latitude: coordinates.latitude,
            longitude: coordinates.longitude)
    }

    struct Coordinates: Hashable, Codable {
        var latitude: Double
        var longitude: Double
    }
}

 

 

List ๋งŒ๋“ค๊ธฐ2 (๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ)

 

import Foundation
import SwiftUI
import CoreLocation

struct Landmark: Hashable, Codable, Identifiable {
    var id: Int
    var name: String
    var park: String
    var state: String
    var description: String
...
}

 

Identifiable ํ”„๋กœํ† ์ฝœ ์ถ”๊ฐ€ํ•˜๋ฉด

 

import SwiftUI

struct LandmarkList: View {
    var body: some View {
        List(landmarks) { landmark in
            LandmarkRow(landmark: landmark)
        }
    }
}

struct LandmarkList_Previews: PreviewProvider {
    static var previews: some View {
        LandmarkList()
    }
}

 

์ด๋Ÿฐ์‹์œผ๋กœ id: \.id ์—†์ด ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ

 
๋Œ“๊ธ€