在 SwiftUI 中设置 Apple SSO 按钮尺寸

时间:2021-04-28 14:15:57

标签: ios swift swiftui

我不知道如何让这个苹果登录按钮变得更宽更高。无论我在哪里尝试添加 .frame(width: .... 它似乎只是在屏幕上移动按钮。但是,不会改变按钮本身的尺寸。

这是在 ContentView.swift 中:

struct ContentView : View {
      @State var credentials: CredentialsOrError?
      var body: some View {
        VStack {
          if $credentials.wrappedValue == nil {
            SignInWithAppleButton(credentials: $credentials)
          }
          else if $credentials.wrappedValue!.isSuccess
          {
            Text("User: \($credentials.wrappedValue!.values!.user)")
            Text("Given name: \($credentials.wrappedValue!.values?.givenName ?? "")")
            Text("Family name: \($credentials.wrappedValue!.values?.familyName ?? "")")
            Text("Email: \($credentials.wrappedValue!.values?.email  ?? "")")
          }
          else {
            Text($credentials.wrappedValue!.error!.localizedDescription).foregroundColor(.red)
          }
        }.fullScreenCover(isPresented: .constant($credentials.wrappedValue != nil && $credentials.wrappedValue!.isSuccess) , content: {
            HomeView()
        })
      }
}

来自SignInWithAppleButton.swift

struct SignInWithAppleButton: View {
  
  @Binding var credentials: CredentialsOrError?
    
  var body: some View {
    
    let button = ButtonController(credentials: $credentials)
                                    
    return button
        .frame(width: button.button.frame.width, height: button.button.frame.height, alignment: .center)
  }
  
  struct ButtonController: UIViewControllerRepresentable {
    let button: ASAuthorizationAppleIDButton = ASAuthorizationAppleIDButton()
    let vc: UIViewController = UIViewController()
    
    @Binding var credentials: CredentialsOrError?

    func makeCoordinator() -> Coordinator {
      return Coordinator(self)
    }
    
    func makeUIViewController(context: Context) -> UIViewController {
      vc.view.addSubview(button)
      return vc
    }
    
    func updateUIViewController(_ uiViewController: UIViewController, context: Context) { }
    
    class Coordinator: NSObject, ASAuthorizationControllerDelegate, ASAuthorizationControllerPresentationContextProviding {
      let parent: ButtonController
      
      init(_ parent: ButtonController) {
        self.parent = parent
        
        super.init()
        
        parent.button.addTarget(self, action: #selector(didTapButton), for: .touchUpInside)
      }
      
      @objc func didTapButton() {
        let appleIDProvider = ASAuthorizationAppleIDProvider()
        let request = appleIDProvider.createRequest()
        request.requestedScopes = [.fullName, .email]
        
        let authorizationController = ASAuthorizationController(authorizationRequests: [request])
        authorizationController.presentationContextProvider = self
        authorizationController.delegate = self
        authorizationController.performRequests()
      }
      
      func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor {
        return parent.vc.view.window!
      }
      
      func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
        guard let credentials = authorization.credential as? ASAuthorizationAppleIDCredential else {
          parent.credentials = .error("Credentials are not of type ASAuthorizationAppleIDCredential")
          return
        }
        
        parent.credentials = .credentials(user: credentials.user, givenName: credentials.fullName?.givenName, familyName: credentials.fullName?.familyName, email: credentials.email)
      }
      
      func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {
        parent.credentials = .error(error)

      }
    }
  }

}

附上一张我目前在暗模式 iPhone 上的样子的图片,我还附上了一张亮模式模拟器的图片。

相关问题:如何将屏幕背景硬编码为白色?

在模拟器中:

emulator

在我的深色模式 iPhone 上:

dark mode

0 个答案:

没有答案