🟨 구현 화면
🟨 구현 순서
- Firebase 홈페이지에 접속하여 denpendency 받을 것
- OnboardingViewController 생성
- RegisterViewController 생성
🟨 Firebase 적용
- 아래의 홈페이지에 들어가 firebase에 앱을 등록한다.
https://console.firebase.google.com/u/0/project/twitterclone-e53b7/overview
🟨 HomeViewController.swift 코드 구현
- 테스트 목적으로, onBoarding View가 나오게 한다.
override func viewWillAppear(_ animated: Bool) {
...
// firebase 로그인 여부에 따른 온보딩화면 표시
if Auth.auth().currentUser == nil {
let onboardingVC = UINavigationController(rootViewController: OnboardingViewController())
onboardingVC.modalPresentationStyle = .fullScreen
present(onboardingVC, animated: true)
}
}
- 위의 코드를 실행하고 나면 아래와 같이 에러가 발생한다. (일단은, 테스트 목적이므로 패스)
🟨 OnboardingViewController.swift 코드 구현
import UIKit
class OnboardingViewController: UIViewController {
private let welcomeLabel: UILabel = {
let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
label.text = "See what`s happening in the world right now."
label.font = .systemFont(ofSize: 32, weight: .heavy)
label.textAlignment = .center
label.numberOfLines = 0
label.textColor = .label
return label
}()
private let createAccountButton: UIButton = {
let button = UIButton(type: .system)
button.translatesAutoresizingMaskIntoConstraints = false
button.setTitle("Create Account", for: .normal)
button.titleLabel?.font = .systemFont(ofSize: 24, weight: .bold)
button.backgroundColor = .systemCyan
button.layer.masksToBounds = true
button.tintColor = .label
button.layer.cornerRadius = 30
return button
}()
private let promptLabel: UILabel = {
let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
label.tintColor = .label
label.text = "Have an account already?"
label.font = .systemFont(ofSize: 14, weight: .regular)
return label
}()
private let loginButton: UIButton = {
let button = UIButton(type: .system)
button.translatesAutoresizingMaskIntoConstraints = false
button.setTitle("Login", for: .normal)
button.titleLabel?.font = .systemFont(ofSize: 14)
button.tintColor = .systemGray
return button
}()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .systemBackground
view.addSubview(welcomeLabel)
view.addSubview(createAccountButton)
view.addSubview(promptLabel)
view.addSubview(loginButton)
configureConstraints()
createAccountButton.addTarget(self, action: #selector(didTapCreateAccount), for: .touchUpInside)
}
@objc func didTapCreateAccount() {
let registerVC = RegisterViewController()
navigationController?.pushViewController(registerVC, animated: true)
}
private func configureConstraints() {
let welcomeLabelConstraints = [
welcomeLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20),
welcomeLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20),
welcomeLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor)
]
let createAccountButtonConstraints = [
createAccountButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
createAccountButton.topAnchor.constraint(equalTo: welcomeLabel.bottomAnchor, constant: 20),
createAccountButton.widthAnchor.constraint(equalTo: welcomeLabel.widthAnchor, constant: -20),
createAccountButton.heightAnchor.constraint(equalToConstant: 60)
]
let promptLabelConstraints = [
promptLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20),
promptLabel.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -60)
]
let loginButtonConstraints = [
loginButton.centerYAnchor.constraint(equalTo: promptLabel.centerYAnchor),
loginButton.leadingAnchor.constraint(equalTo: promptLabel.trailingAnchor, constant: 10)
]
NSLayoutConstraint.activate(welcomeLabelConstraints)
NSLayoutConstraint.activate(createAccountButtonConstraints)
NSLayoutConstraint.activate(promptLabelConstraints)
NSLayoutConstraint.activate(loginButtonConstraints)
}
}
🟨 RegisterViewController.swift 코드 구현
import UIKit
class RegisterViewController: UIViewController {
private let registerTitleLabel: UILabel = {
let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
label.text = "Create your account"
label.font = .systemFont(ofSize: 32, weight: .bold)
return label
}()
private let emailTextField: UITextField = {
let textField = UITextField()
textField.translatesAutoresizingMaskIntoConstraints = false
textField.autocapitalizationType = .none
textField.keyboardType = .emailAddress
textField.attributedPlaceholder = NSAttributedString(
string: "Email",
attributes: [NSAttributedString.Key.foregroundColor : UIColor.gray]
)
return textField
}()
private let passwordTextField: UITextField = {
let textField = UITextField()
textField.translatesAutoresizingMaskIntoConstraints = false
textField.attributedPlaceholder = NSAttributedString(
string: "Password",
attributes: [NSAttributedString.Key.foregroundColor : UIColor.gray]
)
textField.isSecureTextEntry = true
// iCloud Keychain is disabled 해결
textField.textContentType = .oneTimeCode
return textField
}()
private let registerButton: UIButton = {
let button = UIButton(type: .system)
button.translatesAutoresizingMaskIntoConstraints = false
button.setTitle("Register", for: .normal)
button.tintColor = .label
button.titleLabel?.font = .systemFont(ofSize: 16, weight: .bold)
button.backgroundColor = .systemCyan
button.layer.masksToBounds = true
button.layer.cornerRadius = 25
return button
}()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .systemBackground
view.addSubview(registerTitleLabel)
view.addSubview(emailTextField)
view.addSubview(passwordTextField)
view.addSubview(registerButton)
configureConstraints()
}
private func configureConstraints() {
let registerTitleLabelConstraints = [
registerTitleLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor),
registerTitleLabel.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 20)
]
let emailTextFieldConstraints = [
emailTextField.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20),
emailTextField.topAnchor.constraint(equalTo: registerTitleLabel.bottomAnchor, constant: 20),
emailTextField.widthAnchor.constraint(equalToConstant: view.frame.width - 40),
emailTextField.centerXAnchor.constraint(equalTo: view.centerXAnchor),
emailTextField.heightAnchor.constraint(equalToConstant: 60)
]
let passwordTextFieldConstraints = [
passwordTextField.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20),
passwordTextField.topAnchor.constraint(equalTo: emailTextField.bottomAnchor, constant: 20),
passwordTextField.widthAnchor.constraint(equalToConstant: view.frame.width - 40),
passwordTextField.centerXAnchor.constraint(equalTo: view.centerXAnchor),
passwordTextField.heightAnchor.constraint(equalToConstant: 60)
]
let registerButtonConstraints = [
registerButton.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20),
registerButton.topAnchor.constraint(equalTo: passwordTextField.bottomAnchor, constant: 20),
registerButton.widthAnchor.constraint(equalToConstant: 180),
registerButton.heightAnchor.constraint(equalToConstant: 50)
]
NSLayoutConstraint.activate(registerTitleLabelConstraints)
NSLayoutConstraint.activate(emailTextFieldConstraints)
NSLayoutConstraint.activate(passwordTextFieldConstraints)
NSLayoutConstraint.activate(registerButtonConstraints)
}
}
🟨 TIL
- 애플의 보안정책에 따라 "Key - Chain" 관련 기능을 설정해줘야 한다.
- 테스트 목적으로 간이로 해결하고자 "textContentType =.aoneTimeCode"로 입력한다.
private let passwordTextField: UITextField = {
let textField = UITextField()
textField.translatesAutoresizingMaskIntoConstraints = false
textField.attributedPlaceholder = NSAttributedString(
string: "Password",
attributes: [NSAttributedString.Key.foregroundColor : UIColor.gray]
)
textField.isSecureTextEntry = true
// iCloud Keychain is disabled 해결
textField.textContentType = .oneTimeCode
return textField
}()
'Clone App > Twitter' 카테고리의 다른 글
[Twitter Clone] Add ViewModel and bind view (0) | 2024.06.05 |
---|---|
[Twitter Clone] Add Firebase to App (setup onboarding view controllers) (0) | 2024.06.04 |
[Twitter Clone] Add Indicator button in profile view (0) | 2024.05.27 |
[Twitter Clone] Continue implementing the profile view (0) | 2024.05.27 |
[Twitter Clone] Add logo, Design ProfileView (0) | 2024.05.26 |