You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SignInWithAppleButton占满可用空间,求更优布局解决方案

Apple登录按钮(SignInWithAppleButton)布局问题优化方案

我在集成Apple登录时遇到了SignInWithAppleButton的布局问题:使用以下代码时,按钮会占据所有可用空间,无法居中显示在视图中部,同时顶部和底部的长文本也会被截断。

struct DebugSignInButtonLayout_Previews: PreviewProvider {
    static var previews: some View {
        VStack {
            Text("top with some very long text to check that wrapping is ok")
            Spacer()
            SignInWithAppleButton { _ in }
            onCompletion: { _ in }
                .frame(minHeight: 44.0)
            Spacer()
            Text("bottom with some very long text to check that wrapping is ok")
        }
        .padding()
    }
}

我曾尝试给所有其他元素添加.layoutPriority(1)临时解决,但这种方式需要给每个元素都加修饰符,非常繁琐。

struct DebugSignInButtonLayout_Previews: PreviewProvider {
    static var previews: some View {
        VStack {
            Text("top with some very long text to check that wrapping is ok").layoutPriority(1)
            Spacer().layoutPriority(1)
            SignInWithAppleButton { _ in }
            onCompletion: { _ in }
                .frame(minHeight: 44.0)
            Spacer().layoutPriority(1)
            Text("bottom with some very long text to check that wrapping is ok").layoutPriority(1)
        }
        .padding()
    }
}

更优解决方案

以下几种方式可以更简洁地解决问题:

1. 限制按钮最大高度(推荐)

直接给按钮设置固定的最大高度,符合Apple登录按钮的设计规范(建议高度44pt),按钮不会再扩展占用多余空间:

struct DebugSignInButtonLayout_Previews: PreviewProvider {
    static var previews: some View {
        VStack {
            Text("top with some very long text to check that wrapping is ok")
            Spacer()
            SignInWithAppleButton { _ in }
                onCompletion: { _ in }
                .frame(minHeight: 44, maxHeight: 44) // 固定按钮高度范围
            Spacer()
            Text("bottom with some very long text to check that wrapping is ok")
        }
        .padding()
    }
}

2. 固定按钮垂直尺寸

使用fixedSize让按钮仅占用自身内容所需的垂直空间,不会自动扩展:

struct DebugSignInButtonLayout_Previews: PreviewProvider {
    static var previews: some View {
        VStack {
            Text("top with some very long text to check that wrapping is ok")
            Spacer()
            SignInWithAppleButton { _ in }
                onCompletion: { _ in }
                .frame(minHeight: 44.0)
                .fixedSize(horizontal: false, vertical: true) // 垂直方向保持内容尺寸
            Spacer()
            Text("bottom with some very long text to check that wrapping is ok")
        }
        .padding()
    }
}

3. 调整文本布局优先级

仅给顶部和底部的文本设置更高的布局优先级,确保文本优先获得足够空间换行,按钮则使用最小高度:

struct DebugSignInButtonLayout_Previews: PreviewProvider {
    static var previews: some View {
        VStack {
            Text("top with some very long text to check that wrapping is ok")
                .layoutPriority(1) // 文本优先获取布局空间
            Spacer()
            SignInWithAppleButton { _ in }
                onCompletion: { _ in }
                .frame(minHeight: 44.0)
            Spacer()
            Text("bottom with some very long text to check that wrapping is ok")
                .layoutPriority(1)
        }
        .padding()
    }
}

内容的提问来源于stack exchange,提问作者drekka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 05:34:55