SwiftUI中Google SignIn按钮外观修改问题:无法调整高度
先通过ViewModel参数调整基础样式
你当前使用的GoogleSignInButtonViewModel已经提供了scheme和style参数,先确认这些配置是否生效:
- 将
scheme: .dark改为scheme: .light,即可得到蓝色背景带Google图标的标准样式(这就是你看到其他应用用的样式) style参数可选.wide(带文字)、.iconOnly(仅图标)、.icon(图标+短文字),根据需求选择
强制设置按钮高度(解决frame无效问题)
GoogleSignInButton是封装的UIViewRepresentable,内部的GIDSignInButton有固定的布局约束,直接加.frame(height:55)会被覆盖,可通过以下两种方式解决:
方式1:用容器包裹并强制填充
把按钮放在VStack/HStack中,给容器设置高度,再让按钮填充容器:
VStack { GoogleSignInButton(viewModel: GoogleSignInButtonViewModel(scheme: .light, style: .wide, state: .normal)) { Task { do { try await viewModel.signInGoogle() showSignInView = false } catch { print(error) } } } .frame(maxWidth: .infinity, maxHeight: .infinity) // 让按钮填充容器 } .frame(height: 55) // 这里设置目标高度
方式2:自定义Modifier修改内部约束
通过ViewModifier直接修改底层GIDSignInButton的高度约束,不用自定义按钮:
// 扩展GoogleSignInButton,添加自定义高度方法 extension GoogleSignInButton { func setButtonHeight(_ height: CGFloat) -> some View { self.modifier(GoogleButtonHeightModifier(targetHeight: height)) } } // 自定义Modifier处理高度约束 struct GoogleButtonHeightModifier: ViewModifier { let targetHeight: CGFloat func body(content: Content) -> some View { content .onAppear { // 获取底层的GIDSignInButton并修改约束 if let uiView = (content as? UIViewRepresentable)?.makeUIView(context: .init()) as? GIDSignInButton { uiView.translatesAutoresizingMaskIntoConstraints = false uiView.heightAnchor.constraint(equalToConstant: targetHeight).isActive = true } } } }
使用时直接调用:
GoogleSignInButton(viewModel: GoogleSignInButtonViewModel(scheme: .light, style: .wide, state: .normal)) { Task { do { try await viewModel.signInGoogle() showSignInView = false } catch { print(error) } } } .setButtonHeight(55)
检查库版本
旧版本的GoogleSignInSwift库可能存在样式修改的bug,建议通过Swift Package Manager或CocoaPods更新到最新版本,新版本可能已经修复了.frame修饰符无效的问题。
内容的提问来源于stack exchange,提问作者user3712626
相关产品推荐
相关产品推荐

