在SwiftUI中,GeometryReader占用额外空间

3
以下代码是创建自定义按钮的代码:
import SwiftUI

let skyBlue = Color(red: 75/255, green: 170/255, blue: 193/255)

struct RegisterButtonView: View {
    var body: some View {
        GeometryReader { geo in
            HStack {
                Spacer()

                Text("Register")
                    .foregroundColor(Color(.white))
                    .font(.system(size: geo.size.width / 20))
                    .bold()

                Spacer()
            }
            .frame(width: geo.size.width * 4/9, height: geo.size.height / 7)
            .background(skyBlue)
            .cornerRadius(60)
        }

    }
}

struct RegisterButtonView_Previews: PreviewProvider {
    static var previews: some View {
        RegisterButtonView()
    }
}

然而,整个按钮视图包含GeometryReader引入的额外空间,因此当我将此视图放置到根视图时,该空间无法消除。

1
欢迎上船。这并不是额外的空间 - GeometryReader使用了所有可用的空间。 这是一项功能。 - Asperi
谢谢,但是有没有可能让我的RegisterButtonView只包含形状而没有空白区域呢?(如果必须使用GeometryReader) - Lance Chan
1
问题在于RegisterButtonView的大小基于Text的大小,而Text的大小基于其字体大小,而字体大小又基于GeometryReader的大小。GeometryReader获取其父视图给出的所有大小。在这种情况下,父视图是根视图。那么,如果不是基于GeometryReader的大小,告诉我们你希望RegisterButtonView的大小基于什么? - rob mayoff
我实际上希望它的大小基于按钮的形状,我认为这是 HStack - Lance Chan
1个回答

0
您可能需要直接设置GeoReader的框架。
    struct RegisterButtonView: View {
var body: some View {
    GeometryReader { geo in
        HStack {
            Spacer()

            Text("Register")
                .foregroundColor(Color(.white))
                .font(.system(size: geo.size.width / 20 * 9 / 4))
                .bold()

            Spacer()
        }
        .frame(width: geo.size.width , height: geo.size.height )
        .background(skyBlue)
        .cornerRadius(60)
    }.frame(width: UIScreen.main.bounds.width * 4/9 , height: UIScreen.main.bounds.height / 7)

}
}

但是设置GeoReader实际上会拉伸整个视图,而不仅仅是裁剪空白部分。 - Lance Chan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接