/ SWIFTUI

SwiftUI 화면 만들기 - Old Age Home App

SwiftUI 화면 만들기 - Old Age Home App

https://dribbble.com/shots/7074019-Old-Age-Home-App

원본


인트로 화면 구현

  • 화면 전체를 덮는 이미지, 상 하단 세이프 에어리어 무시
  • 상단 앱 제목과 설명 노출
  • 하단 시작 버튼

배경 전체를 덮는 이미지는 대충 고화질 이미지를 받아서 전체를 덮도록 적용 하단 Get Start 상자를 클릭시 메인 화면으로 진입하도록 버튼 적용


인트로 구현 코드

struct GetStartView: View {
  var body: some View {

    ZStack(alignment: .top) {

      Image("oldPeople")
        .resizable()
        .edgesIgnoringSafeArea(.top)
        .edgesIgnoringSafeArea(.bottom)
        .edgesIgnoringSafeArea(.leading)
        .edgesIgnoringSafeArea(.trailing)
        .scaledToFill()

      VStack {
        VStack {
          Text("Care app")
            .font(Font.system(size: 60, design: .default))
            .foregroundColor(Color(red: 255/255, green: 247/255, blue: 225/255))
            .padding(.top, 50)

          Text("we take care of parents, Those don't care")
            .foregroundColor(Color(red: 255/255, green: 247/255, blue: 225/255))
        }

          Spacer()

          VStack(alignment: .trailing) {

          ZStack(alignment: .center) {
            RoundedRectangle(cornerRadius: 15)
            .frame(width: 150, height: 50, alignment: .center)
            .foregroundColor(Color.yellow)

            Text("Get Start")
            .bold()
          }
        .padding(.trailing, 20)
        }
      .frame(width: UIScreen.main.bounds.width, alignment: .trailing)
      }
    }

  }
} ![](https://paper-attachments.dropbox.com/s_0C5B5B0D688EBF9B5C8128D090AEE98920DCD8C81B9D089DF1E9F05DFF470BDD_1567392051507_image.png)

트러블 슈팅

상단 스테이터스바의 스타일을 변경하는 방법을 몰라서 검색해 봤는데, View 자체에서는 불가능하고 UIHostingController를 추가적으로 커스텀해서 스타일을 변경해야 하는 것으로 확인했다. (https://stackoverflow.com/questions/57063142/swiftui-status-bar-color)

그런데, 화면마다 테마를 변경해야 하는 경우에는 어떻게 해야하는지 모르겠다.

 class DarkHostingController<Content>:
  UIHostingController<Content> where Content : View {
  @objc override dynamic open var preferredStatusBarStyle: UIStatusBarStyle {
      .lightContent
  }
}

메인 화면 구현

  • 상단에 배경화면과 그 배경화면을 절반정도 거쳐서 검색 바
  • 하단으로 리스트 뷰
  • 리스트 뷰 안에 카드 뷰

ScrollView{
  VStack {
  // 상단 배경 이미지
  Rectangle()
  .foregroundColor(Color.yellow)
  .frame(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.width * 0.5)

  // 중단 검색 바
  ZStack(alignment: .center) {
  RoundedRectangle(cornerRadius: 30)
    .foregroundColor(Color.white)
    .frame(minWidth: 0,
    idealWidth: UIScreen.main.bounds.width,
    minHeight: 50,
    maxHeight: 50)
    .shadow(radius: 1)

    HStack {
      TextField($text, placeholder: Text("find more...")
        .foregroundColor(Color.gray))
      Image(systemName: "magnifyingglass")
    }
    .padding(.horizontal)
  }
  .padding(.top, -20)
  .padding(.horizontal)

  // 하단 리스트
  ForEach(0...20) {_ in
    HStack {
      MainCardView()
      Rectangle()
        .foregroundColor(Color.clear)
        .frame(width: 20)
      MainCardView()
    }
    .padding(.horizontal)
    Rectangle()
      .foregroundColor(Color.clear)
      .frame(width: 20)
    }
  }
}
.edgesIgnoringSafeArea(.top)

하단 카드뷰

struct MainCardView: View {
  var body: some View {
    ZStack(alignment: .center) {
      RoundedRectangle(cornerRadius: 30)
        .foregroundColor(Color.white)
        .shadow(color: Color.black.opacity(0.5), radius: 1, x: -0.2, y: 1)

      VStack {
        Rectangle()
          .foregroundColor(.yellow)
          .padding()

        VStack(alignment: .leading) {
          Text("Adopt")
            .font(.headline)
          Text("Adopt & Adopt & Adopt")
            .font(.caption)
        }
        .padding()
      }
    }
    .frame(width: (UIScreen.main.bounds.width / 2) - 50,
    height: ((UIScreen.main.bounds.width / 2) - 50) * 1.5,
    alignment: .center)
  }
}