Я использую Firebase Auth и у меня две кнопки. Один для Google и один для Facebook. Я пытаюсь установить высоту и ширину с помощью .frame()
, но они не отвечают должным образом. Кроме того, кнопка входа в Google будет отображаться не в центре, а в правой части экрана.
Я пытался поместить их в VStack
, но все равно то же самое.
VStack(alignment: .center) {
FacebookLoginButtonView()
.frame(width: 100, height: 28) // duhet 28 fiks
.border(Color.red)
GoogleLoginButtonView()
.frame(width: 100, height: 28)
.border(Color.red)
}
Есть идеи, как расположить их в центре, а также, возможно, придать им одинаковую высоту? Установка .frame(width: 100, height: 28)
для FB любой высоты, кроме 28, вызовет ошибку.
FacebookLoginButtonView
struct FacebookLoginButtonView: UIViewRepresentable {
@EnvironmentObject var userViewModel: UserViewModel
func makeCoordinator() -> Coordinator {
return Coordinator(userViewModel: userViewModel)
}
func makeUIView(context: UIViewRepresentableContext<FacebookLoginButtonView>) -> FBLoginButton {
let button = FBLoginButton()
button.permissions = ["public_profile", "email"]
button.delegate = context.coordinator
return button
}
func updateUIView(_ uiView: FBLoginButton, context: UIViewRepresentableContext<FacebookLoginButtonView>) {
//
}
class Coordinator: NSObject, LoginButtonDelegate {
var userViewModel: UserViewModel
init(userViewModel: UserViewModel) {
self.userViewModel = userViewModel
}
func loginButton(_ loginButton: FBLoginButton, didCompleteWith result: LoginManagerLoginResult?, error: Error?) {
if error != nil {
// print(error?.localizedDescription)
return
}
if let currentAccessToken = AccessToken.current {
let credential = FacebookAuthProvider.credential(withAccessToken: currentAccessToken.tokenString)
Auth.auth().signIn(with: credential, completion: AuthService(userViewModel: userViewModel).registerHandler)
}
}
func loginButtonDidLogOut(_ loginButton: FBLoginButton) {
try? Auth.auth().signOut()
}
}
}
GoogleLoginButtonView
struct GoogleLoginButtonView: UIViewRepresentable {
@EnvironmentObject var userViewModel: UserViewModel
func makeCoordinator() -> Coordinator {
return Coordinator(userViewModel: userViewModel)
}
func makeUIView(context: UIViewRepresentableContext<GoogleLoginButtonView>) -> GIDSignInButton {
let button = GIDSignInButton()
button.style = .wide
GIDSignIn.sharedInstance().clientID = FirebaseApp.app()?.options.clientID
GIDSignIn.sharedInstance().delegate = context.coordinator
GIDSignIn.sharedInstance()?.presentingViewController = UIApplication.shared.windows.first?.rootViewController
return button
}
func updateUIView(_ uiView: GIDSignInButton, context: UIViewRepresentableContext<GoogleLoginButtonView>) {
}
class Coordinator: NSObject, GIDSignInDelegate {
var userViewModel: UserViewModel
init(userViewModel: UserViewModel) {
self.userViewModel = userViewModel
}
func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error?) {
// ...
if let error = error {
print(error.localizedDescription)
return
}
guard let authentication = user.authentication else { return }
let credential = GoogleAuthProvider.credential(withIDToken: authentication.idToken, accessToken: authentication.accessToken)
Auth.auth().signIn(with: credential, completion: AuthService(userViewModel: userViewModel).registerHandler)
}
func sign(_ signIn: GIDSignIn!, didDisconnectWith user: GIDGoogleUser!, withError error: Error!) {
// Perform any operations when the user disconnects from app here.
// ...
}
}
}