Layout 如何在不填充视图的情况下使用GeometryReader

Layout 如何在不填充视图的情况下使用GeometryReader,layout,swiftui,geometryreader,Layout,Swiftui,Geometryreader,这就是我的目标布局 import SwiftUI import PlaygroundSupport struct TestView: View { let text: String var body: some View { Text(self.text) } } struct ContentView: View { var body: some View { ZStack {

这就是我的目标布局

import SwiftUI
import PlaygroundSupport

struct TestView: View {
        
    let text: String
    
    var body: some View {
        Text(self.text)
    }
}

struct ContentView: View {
    var body: some View {
        ZStack {
            TestView(text: "bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla")
                .frame(width: 250)
                .background(Color.red)
        }
    }
}

PlaygroundPage.current.setLiveView(ContentView())

但是我还想使用
GeometryReader
,当我将
文本
放在
GeometryReader
中时,它将占据整个高度

import SwiftUI
import PlaygroundSupport

struct TestView: View {
        
    let text: String
    
    var body: some View {
        GeometryReader { reader in
            Text(self.text)
        }
    }
}

struct ContentView: View {
    var body: some View {
        ZStack {
            TestView(text: "bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla")
                .frame(width: 250)
                .background(Color.red)
        }
    }
}

PlaygroundPage.current.setLiveView(ContentView())


我怎样才能避开这个问题?

警告⚠️ : 这时geometry reader无法帮助我学习几何,我开始把头撞到墙上

以下是您可以做的:

struct ContentView: View {

    var text =  "bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla"
    var width : CGFloat = 250

    var height: CGFloat {
        var size : CGFloat
        let chars = self.width / 14  // assuming width of 1 character is 14 which is the case by default for Text view
        let lines = CGFloat(text.count) / chars
        size = CGFloat(14 * (lines + 1))
        return size
    }

    var body: some View {
        ZStack {
            TestView(text: text)
            .frame(width: width, height: height)
            .background(Color.red)
        }
    }
}
使用高度作为计算属性,手动设置TestView的高度

关于我如何估计默认字体高度的背景故事

按shift+command+4
使用指针并查找相对y位置之间的差异⚠️ : 这时geometry reader无法帮助我学习几何,我开始把头撞到墙上

以下是您可以做的:

struct ContentView: View {

    var text =  "bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla"
    var width : CGFloat = 250

    var height: CGFloat {
        var size : CGFloat
        let chars = self.width / 14  // assuming width of 1 character is 14 which is the case by default for Text view
        let lines = CGFloat(text.count) / chars
        size = CGFloat(14 * (lines + 1))
        return size
    }

    var body: some View {
        ZStack {
            TestView(text: text)
            .frame(width: width, height: height)
            .background(Color.red)
        }
    }
}
使用高度作为计算属性,手动设置TestView的高度

关于我如何估计默认字体高度的背景故事

按shift+command+4
使用指针并找到相对y位置之间的差异

这不是错误-这是一个预期功能。我知道,但如何使用geometryreader实现顶部布局?使用vstack INDER geometry和Spacer()在文本之后?这不是一个bug-这是一个预期功能。我知道,但如何使用geometryreader实现顶部布局?在文本之后使用vstack INDER geometry和Spacer()?