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

Posted

技术标签:

【中文标题】如何在不填充视图的情况下使用 GeometryReader【英文标题】:How to use GeometryReader without it filling the View 【发布时间】:2020-02-14 14:10:29 【问题描述】:

这是我想要的布局。

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,当我将Text 放在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())

我该如何解决这个问题?

【问题讨论】:

这不是一个错误 - 这是一个预期的功能。 我知道但是如何使用geometryreader实现顶部布局? 在几何图形中使用 vstack 并在文本后使用 Spacer()? 【参考方案1】:

警告⚠️:这是几何阅读器无法帮助我学习几何的时候,我开始用头撞墙

您可以这样做:

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)
        
    

使用 height 作为计算属性手动设置 TestView 的高度。

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

shift + 命令 + 4 使用指针,找出相对 y 位置之间的差异

【讨论】:

以上是关于如何在不填充视图的情况下使用 GeometryReader的主要内容,如果未能解决你的问题,请参考以下文章

如何在不破坏滚动功能的情况下将 UIImage 添加到 UIScrollView?

如何在不重绘整个视图的情况下更新 NSView 的一部分

在不修改视图的情况下使用 GeometryReader

如何在不使用 for 循环的情况下填充二维数组?

如何在不移动地图的情况下更改 GMSMapView 填充

如何在不增加宽度的情况下向文本区域添加填充?