Fix login form card layout to hug content and align with Android.

Use content-driven card height with safe area insets so the form no longer stretches to the screen bottom.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-06 15:41:02 +08:00
parent 699f1ba7c4
commit 02a80764ea

View File

@ -61,6 +61,7 @@ final class LoginViewController: BaseViewController {
topFormStack.axis = .vertical topFormStack.axis = .vertical
topFormStack.spacing = 0 topFormStack.spacing = 0
topFormStack.alignment = .fill topFormStack.alignment = .fill
topFormStack.distribution = .fill
loginButton.addTarget(self, action: #selector(loginButtonTapped), for: .touchUpInside) loginButton.addTarget(self, action: #selector(loginButtonTapped), for: .touchUpInside)
loginByCodeButton.addTarget(self, action: #selector(loginByCodeButtonTapped), for: .touchUpInside) loginByCodeButton.addTarget(self, action: #selector(loginByCodeButtonTapped), for: .touchUpInside)
@ -115,28 +116,24 @@ final class LoginViewController: BaseViewController {
welcomeLabel.snp.makeConstraints { make in welcomeLabel.snp.makeConstraints { make in
make.top.equalTo(view.safeAreaLayoutGuide).offset(48) make.top.equalTo(view.safeAreaLayoutGuide).offset(48)
make.leading.trailing.equalToSuperview().inset(24) make.leading.trailing.equalTo(view.safeAreaLayoutGuide).inset(24)
} }
formCardShadowView.snp.makeConstraints { make in formCardShadowView.snp.makeConstraints { make in
make.top.equalTo(welcomeLabel.snp.bottom).offset(48) make.top.equalTo(welcomeLabel.snp.bottom).offset(48)
make.leading.trailing.equalToSuperview().inset(24) make.leading.trailing.equalTo(view.safeAreaLayoutGuide).inset(24)
make.bottom.equalTo(view.safeAreaLayoutGuide).offset(-24) make.bottom.lessThanOrEqualTo(view.safeAreaLayoutGuide).offset(-24)
} }
formCardView.snp.makeConstraints { make in formCardView.snp.makeConstraints { make in
make.edges.equalToSuperview() make.edges.equalToSuperview()
} }
topFormStack.snp.makeConstraints { make in
make.top.leading.trailing.equalToSuperview().inset(16)
make.bottom.equalToSuperview().inset(16)
}
registerContainer.snp.makeConstraints { make in registerContainer.snp.makeConstraints { make in
make.centerX.equalToSuperview() make.centerX.equalToSuperview()
make.bottom.equalToSuperview().inset(16)
} }
applyCardLayoutConstraints(showRegisterSection: false)
} }
override func viewDidLayoutSubviews() { override func viewDidLayoutSubviews() {
@ -230,15 +227,7 @@ final class LoginViewController: BaseViewController {
let showRegisterSection = viewModel.enableRegister let showRegisterSection = viewModel.enableRegister
loginByCodeButton.isHidden = !showRegisterSection loginByCodeButton.isHidden = !showRegisterSection
registerContainer.isHidden = !showRegisterSection registerContainer.isHidden = !showRegisterSection
applyCardLayoutConstraints(showRegisterSection: showRegisterSection)
topFormStack.snp.remakeConstraints { make in
make.top.leading.trailing.equalToSuperview().inset(16)
if showRegisterSection {
make.bottom.lessThanOrEqualTo(registerContainer.snp.top).offset(-16)
} else {
make.bottom.equalToSuperview().inset(16)
}
}
if let payload = viewModel.pendingAccountSelection { if let payload = viewModel.pendingAccountSelection {
if let controller = accountSelectionController { if let controller = accountSelectionController {
@ -252,6 +241,27 @@ final class LoginViewController: BaseViewController {
} }
} }
/// safeArea 24pt
private func applyCardLayoutConstraints(showRegisterSection: Bool) {
if showRegisterSection {
topFormStack.snp.remakeConstraints { make in
make.top.leading.trailing.equalToSuperview().inset(16)
}
registerContainer.snp.remakeConstraints { make in
make.top.equalTo(topFormStack.snp.bottom).offset(16)
make.centerX.equalToSuperview()
make.bottom.equalToSuperview().inset(16)
}
} else {
registerContainer.snp.remakeConstraints { make in
make.centerX.equalToSuperview()
}
topFormStack.snp.remakeConstraints { make in
make.edges.equalToSuperview().inset(16)
}
}
}
private func performLogin() { private func performLogin() {
viewModel.normalizeUsernameCountryCodeIfNeeded() viewModel.normalizeUsernameCountryCodeIfNeeded()
accountField.text = viewModel.normalizedUsername accountField.text = viewModel.normalizedUsername