본문 바로가기

프로젝트/Twitter Clone App (w∕Firebase)

07. 기본 UI 구성하기 #7

기본 UI 구성하기 #7
LoginView


계정 로그인에 사용할 UI를 구성한다.

LoginView
| Header

Login 화면의 상단에 해당하는 부분이다.
푸른색의 배경과 두 줄의 TextView로 이루어져 있다.

더보기

Source

VStack(alignment: .leading) {
    HStack {
        Spacer()
    }

    Group {
        Text("Hello.")

        Text("Welcom Back")
    }
    .font(.largeTitle)
    .fontWeight(.semibold)
}
.frame(height: 260)
.padding(.leading)
.background(Color(.systemBlue))
.foregroundColor(.white)
.clipShape(RoundedShape(corners: .bottomRight))

LoginView
| RoundedShape

Header를 구성하는 VStack의 오른쪽 하단 모서리가 둥근 것을 확인할 수 있다.

.clipShape(RoundedShape(corners: .bottomRight))

VStack에 적용한 위의 Modifier가 그 역할을 하는데,
기본적으로 clipShape나 roundedCorner는 전체 모서리에 일괄 적용된다는 특징이 있다.
따라서 지금 clipShape에 전달한 RoundedShape는 새로 Custom 한 모듈이 된다.

더보기

Source

struct RoundedShape: Shape {
    var corners: UIRectCorner

    func path(in rect: CGRect) -> Path {
        let path = UIBezierPath(roundedRect: rect, byRoundingCorners: corners, cornerRadii: CGSize(width: 80, height: 80))

        return Path(path.cgPath)
    }
}

Shape protocol을 채용한 구조체를 하나 만들고, path 함수를 정의한다.
적용할 모서리를 byRoundingCorners로 전달받아 cornerRadii에 지정된 값으로 둥글게 표시한다.
만약 곡률을 변경하고 싶다면 해당하는 변수를 하나 더 선언해 파라미터로 받으면 된다.

LoginView
| idField, pwField

header의 아래로는 id에 해당하는 email과 비밀번호를 입력받을 TextField가 자리한다.

더보기

Source

VStack(spacing: 40) {
    TextField("Email", text: $email)

    SecureField("Password", text: $password)
}
.padding(.horizontal, 32)
.padding(.top, 44)

email은 일반 TextField를 사용하고, 비밀번호는 자동으로 가려질 수 있도록 SecureField를 사용한다.
우선은 별도의 디자인을 하지 않고 기본 Api를 사용해 자리를 채워 뒀다.

LoginView
| forgot password, sign in

입력창 아래로는 버튼이 두 개 존재한다.
각각 비밀번호 찾기, 로그인 기능을 할 예정이다.

더보기

Source

HStack {
    Spacer()

    NavigationLink {
        Text("Reset password view...")
    } label: {
        Text("Forgot Password?")
            .font(.caption)
            .fontWeight(.semibold)
            .foregroundColor(Color(.systemBlue))
            .padding(.top)
            .padding(.trailing, 24)
    }
}

Button {
    print("login function")
} label: {
    Text("Sign In")
        .font(.headline)
        .foregroundColor(.white)
        .frame(width: 340, height: 50)
        .background(Color(.systemBlue))
        .clipShape(Capsule())
        .padding()
}
.shadow(color: .gray.opacity(0.5), radius: 10)

로그인 버튼에는 그림자 효과를 적용해 집중도와 입체감을 높였다.

LoginView
| registration 이동

더보기

Source

Spacer()

NavigationLink {
    RegistrationView()
        .toolbar(.hidden)
} label: {
    HStack {
        Text("Don't have an account?")

        Text("Sign Up")
            .fontWeight(.semibold)
    }
    .foregroundColor(Color(.systemBlue))
    .font(.footnote)
}
.padding(.bottom, 32)

화면 가장 아래에 위치하는 버튼은 RegistrationView로 이동하는 역할을 한다.
NavigatiopnLink를 사용해 해당 View를 호출할 수 있고,
디자인은 HStack을 활용한 TextView의 나열로 표현했다.
하단의 padding은 iPhone의 home indicator의 간섭을 피하기 위한 조치다.

 

'프로젝트 > Twitter Clone App (w∕Firebase)' 카테고리의 다른 글

09. 기능 구현하기 #1  (0) 2022.12.13
08. 기본 UI 구현하기 #8  (0) 2022.12.02
06. 기본 UI 구성하기 #6  (0) 2022.12.01
05. 기본 UI 구성하기 #5  (0) 2022.11.30
04. 기본 UI 구성하기 #4  (0) 2022.11.24