20-22일차: SwiftUI의 100일 - 깃발 추측(프로젝트 2)

https://www.hackingwithswift.com/100/swiftui/20
https://www.hackingwithswift.com/100/swiftui/21
https://www.hackingwithswift.com/100/swiftui/22

플래그 프로젝트는 스택, 이미지, 색상 및 그라데이션, 경고를 포함하는 또 다른 SwiftUI 보기 세트를 도입합니다.

스택을 사용하여 보기 정렬



여러 보기를 렌더링하려는 경우 유용한 보기가 있습니다: VStack , HStack , ZStack .

VStack



이를 사용하여 두 개 이상의 뷰를 수직으로 쌓아 배치합니다.

var body: some View {
    VStack {
        Text("Hello, world!")
        Text("This is inside a stack")
    }
}


보기 사이에 간격을 추가하고 각각 spacingalignment 속성을 사용하여 정렬할 수 있습니다.

VStack(alignment: .leading, spacing: 20) {
    Text("Hello, world!")
    Text("This is inside a stack")
}


HStack



이것은 VStack 와 동일하며 뷰를 가로로 쌓기만 하면 됩니다.

HStack(spacing: 20) {
    Text("Hello, world!")
    Text("This is inside a stack")
}


ZStack



ZStack은 뷰가 서로 겹치도록 깊이별로 정렬하기 위한 것입니다.

ZStack {
    Text("Hello, world!")
    Text("This is inside a stack")
}


색상 및 프레임



색상은 뷰 그 자체입니다. 색상은 사용 가능한 모든 공간을 자동으로 차지합니다. frame() 수정자를 사용하여 특정 크기를 설정합니다.

ZStack {
    Color.red
        .frame(width: 200, height: 200)
    Text("Your content")
}


최소 및 최대 너비와 높이를 지정할 수도 있습니다.

Color.red
    .frame(minWidth: 200, maxWidth: .infinity, maxHeight: 200)


그라디언트


LinearGradient , RadialGradientAngularGradient 의 세 가지 종류의 그래디언트를 사용할 수 있습니다.

LinearGradient



선형 그래디언트는 한 방향으로 진행됩니다.

LinearGradient(gradient: Gradient(colors: [.white, .black]), startPoint: .top, endPoint: .bottom)


또한 색상과 색상이 사용되어야 하는 그라디언트를 따라 얼마나 멀리 지정할 수 있는 그라디언트 정지점을 제공할 수 있습니다.

LinearGradient(gradient: Gradient(stops: [
    Gradient.Stop(color: .white, location: 0.45),
    Gradient.Stop(color: .black, location: 0.55),
]), startPoint: .top, endPoint: .bottom)


방사형 그라데이션



방사형 그래디언트는 원 모양으로 바깥쪽으로 이동합니다.

RadialGradient(gradient: Gradient(colors: [.blue, .black]), center: .center, startRadius: 20, endRadius: 200)


앵귤러그라디언트



각도 그래디언트는 바깥쪽으로 방사되는 것이 아니라 원 주위로 색상을 순환하며 아름다운 효과를 만들 수 있습니다.

AngularGradient(gradient: Gradient(colors: [.red, .yellow, .green, .blue, .purple, .red]), center: .center)


버튼 및 이미지



버튼 모양을 사용자 정의할 수 있는 몇 가지 방법이 있습니다. 첫 번째는 role입니다.

Button("Delete selection", role: .destructive){}


둘째, .bordered.borderedProminent 버튼에 대한 내장 스타일 중 하나를 사용할 수 있을 뿐만 아니라 tint() 수정자를 사용하여 테두리가 있는 버튼에 사용되는 색상을 사용자 정의할 수 있습니다.

VStack {
    Button("Button 1") { }
        .buttonStyle(.bordered)
    Button("Button 2", role: .destructive) { }
        .buttonStyle(.bordered)
    Button("Button 3") { }
        .buttonStyle(.borderedProminent)
        .tint(.mint)
    Button("Button 4", role: .destructive) { }
        .buttonStyle(.borderedProminent)
}


레이블을 사용자 정의하거나 대신 Image를 사용하려는 경우 두 번째 후행 클로저를 사용할 수 있습니다.

VStack {
    Button {
        print("Button was tapped")
    } label: {
        Text("Tap me!")
            .padding()
            .foregroundColor(.white)
            .background(.red)
    }
    Button {
        print("Edit button was tapped")
    } label: {
        Image(systemName: "pencil")
    }
    Button {
        print("Edit button was tapped")
    } label: {
        Label("Edit", systemImage: "pencil")
    }
}


경고 메시지 표시



경고는 표시 여부를 알기 위해 특정 상태에 바인딩되는 보기의 또 다른 수정자로 존재합니다.

@State private var isShowingAlert = false

var body: some View {
    Button("Show Alert") {
        self.isShowingAlert = true
    }
    .alert("Important message", isPresented: $isShowingAlert) {
        Button("Cancel", role: .cancel) { }
        Button("Delete", role: .destructive) { }
    } message: {
        Text("Please read this.")
    }
}


앱 챌린지


  • @State 속성을 추가하여 사용자의 점수를 저장하고 답이 맞거나 틀렸을 때 수정한 다음 경고 및 점수 레이블에 표시합니다.
  • 누군가 잘못된 플래그를 선택하면 경고 메시지에서 실수를 알려줍니다. 예를 들어, 저것은 프랑스의 국기입니다.”
  • 게임에 8개의 질문만 표시되도록 합니다. 이때 점수를 판단하는 최종 경고가 표시되고 게임을 다시 시작할 수 있습니다.

  • 산출





    소스 코드



    Github

    좋은 웹페이지 즐겨찾기