如何在Swift中自定义Firebase身份验证UI

如何在Swift中自定义Firebase身份验证UI,swift,firebase-authentication,firebaseui,Swift,Firebase Authentication,Firebaseui,我正在使用Firebase预构建的UI构建一个身份验证系统,我希望自定义UI以适合该程序。假设我想将背景颜色设置为黑色,并更改按钮的角半径,有什么方法可以做到这一点吗?我尝试过对authPickerViewController进行子分类,但不知何故,它没有起作用。我做了一些搜索,但也找不到任何教程或最近与此相关的问题 以下是我的MainViewController中的内容 类LoginViewController:UIViewController,FUIAuthDelegate{ 重写func

我正在使用Firebase预构建的UI构建一个身份验证系统,我希望自定义UI以适合该程序。假设我想将背景颜色设置为黑色,并更改按钮的角半径,有什么方法可以做到这一点吗?我尝试过对authPickerViewController进行子分类,但不知何故,它没有起作用。我做了一些搜索,但也找不到任何教程或最近与此相关的问题

以下是我的MainViewController中的内容

类LoginViewController:UIViewController,FUIAuthDelegate{
重写func viewDidLoad(){
super.viewDidLoad()
让authUI=FUIAuth.defaultAuthUI()
authUI?.delegate=self
let提供程序:[FUIAuthProvider]=[
FUIEmailAuth(),
FUIGoogleAuth(),
FUIPhoneAuth(authUI:FUIAuth.defaultAuthUI()!)]
authUI?.providers=提供程序
让authViewController=authUI?.authViewController()
authViewController!.modalPresentationStyle=.fullScreen
authViewController!.setNavigationBarHidden(真,动画:假)
self.present(authViewController!,动画:false,完成:nil)
}
func应用程序(uApp:ui应用程序,打开url:url,
选项:[UIApplicationOpenUrlOptions:Any])->Bool{
让sourceApplication=options[UIApplicationOpenURLOptionsKey.sourceApplication]
如果FUIAuth.defaultAuthUI()?.handleOpen(url,sourceApplication:sourceApplication as?String)?false{
返回真值
}
返回错误
}
}
下面是我创建的子类:

类FUICustomAuthPickerViewController:FUIAuthPickerViewController,FUIAuthDelegate{
重写func viewDidLoad(){
super.viewDidLoad()
self.view.backgroundColor=.black
}
func authPickerViewController(用于authUI authUI:FUIAuth)->FUIAUTHICKERVIEWCONTROLLER{
返回FUICustomAuthPickerViewController(nibName:“FUICustomAuthPickerViewController”,
bundle:bundle.main,
authUI:authUI)
}
}
另一方面,他们说:

通过将FirebaseUI的视图控制器子类化并在FUIAuth的委托方法中指定它们,可以自定义登录屏幕

我是初学者,我怎么能做到呢

编辑:

因此,按照上的说明,我通过创建
FUIAuthDelegate
的扩展,成功地将内容添加到预构建的UI中

扩展登录查看控制器:FUIAuthDelegate{
func应用程序(uApp:ui应用程序,打开url:url,
选项:[UIApplicationOpenUrlOptions:Any])->Bool{
让sourceApplication=options[UIApplicationOpenURLOptionsKey.sourceApplication]
如果FUIAuth.defaultAuthUI()?.handleOpen(url,sourceApplication:sourceApplication as?String)?false{
返回真值
}
返回错误
}
func authPickerViewController(用于authUI authUI:FUIAuth)->FUIAUTHICKERVIEWCONTROLLER{
设vc=FUIAuthPickerViewController(authUI:authUI)
let view=ui视图(帧:.0)
view.backgroundColor=.black
view.translatesAutoresizingMaskIntoConstraints=false
vc.view.addSubview(视图)
NSLayoutConstraint.activate([
view.heightAnchor.constraint(等式:vc.view.heightAnchor,乘数:1),
view.widthAnchor.constraint(等式:vc.view.widthAnchor,乘数:1)])
返回vc
}
}

事实证明,子类不一定是必需的。然而,我似乎无法将我创建的这个视图作为背景,它要么覆盖所有内容,要么什么都不覆盖。我尝试直接更改视图的背景颜色,但没有成功。有人知道怎么做吗?

使用本文提供的方法和注释之一解决了问题。事实证明,除了子类化之外,您还必须向子类添加以下两种方法才能使其正常工作

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?, authUI: FUIAuth?) {
        super.init(nibName: nil, bundle: Bundle.main, authUI: authUI!)
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
但是,我使用的方法(不确定其他方法是否会引发相同的问题)也导致了另一个问题-电子邮件登录按钮停止响应-这通过向视图控制器显示
navigationViewController
来解决,因为电子邮件登录按钮与导航栏一起工作,使用
navigationViewController
呈现视图后,可以将其删除

现在,完整的子类如下所示:

import UIKit
import FirebaseUI

class FUICustomAuthPickerViewController: FUIAuthPickerViewController {

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?, authUI: FUIAuth?) {
        super.init(nibName: nil, bundle: Bundle.main, authUI: authUI!)
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        let width = UIScreen.main.bounds.size.width
        let height = UIScreen.main.bounds.size.height

        let imageViewBackground = UIImageView(frame: CGRect(x: 0, y: 0, width: width, height: height))
        imageViewBackground.backgroundColor = .eatstrOrange

        view.insertSubview(imageViewBackground, at: 0)
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        navigationController?.setNavigationBarHidden(true, animated: animated)
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        navigationController?.setNavigationBarHidden(false, animated: animated)
    }
}
这是主视图控制器:

import UIKit
import FirebaseUI

class LoginViewController: UIViewController{

    override func viewDidLoad() {
        super.viewDidLoad()

        let authUI = FUIAuth.defaultAuthUI()
        let delegate = authUI?.delegate
        authUI?.delegate = delegate
        let providers: [FUIAuthProvider] = [
          FUIGoogleAuth(),
          FUIEmailAuth(),
          FUIPhoneAuth(authUI:FUIAuth.defaultAuthUI()!)]
        authUI?.providers = providers

        let authViewController = FUICustomAuthPickerViewController(authUI: authUI!)
        authViewController.modalPresentationStyle = .fullScreen
        navigationController?.pushViewController(authViewController, animated: false)
    }
}

请阅读-总结是,这不是一种向志愿者讲话的理想方式,可能会对获得答案产生反作用。请不要将此添加到您的问题中。@halfer是的,先生!非常感谢。@TimmyMi-查看FirebaseUI iOS repo以获得显示如何自定义不同视图控制器的完整示例:。另外,我想知道你是否真的想使用
黑色
作为背景色,或者更确切地说是支持亮模式/暗模式-你能评论一下吗?@PeterFriese我在这里用黑色作为例子,所以不用担心。不管怎样,谢谢你的回购协议,我会查一查再给你回复。@PeterFriese你介意再详细解释一下吗?我如何在我的项目中实现这一点?谢谢!