Swiftui 如何使用几何体读取器使视图不展开?

Swiftui 如何使用几何体读取器使视图不展开?,swiftui,Swiftui,我用过这样的几何阅读器 GeometryReader{r in 滚动视图{ 文本(“SomeText”).框架(宽度:r.size.width/2) } } 问题是读卡器垂直扩展很像Spacer()。 我是否可以让它不这样做?您可以尝试使用.fixedSize(): 由于背景始终适合实际视图大小。您可以使用此技巧,在背景中添加GeometryReader而不更改视图本身的大小 ScrollView { }.background( Geom

我用过这样的几何阅读器

GeometryReader{r in
滚动视图{
文本(“SomeText”).框架(宽度:r.size.width/2)
}
}
问题是读卡器垂直扩展很像
Spacer()

我是否可以让它不这样做?

您可以尝试使用
.fixedSize()


由于背景始终适合实际视图大小。您可以使用此技巧,在背景中添加GeometryReader而不更改视图本身的大小

       ScrollView {
        
    }.background(
        GeometryReader { r in
            // stuff
        }
    )
}

在谷歌搜索之后,我找到了这个答案

创建这个新结构

struct SingleAxisGeometryReader:视图{
private struct SizeKey:PreferenceKey{
静态var defaultValue:CGFloat{10}
静态函数reduce(值:inout CGFloat,nextValue:()->CGFloat){
value=max(value,nextValue())
}
}
@国家私有变量大小:CGFloat=SizeKey.defaultValue
变量轴:轴=.horizontal
变量对齐:对齐=.center
让内容:(CGFloat)->content
var body:一些观点{
内容(大小)
.frame(最大宽度:轴==.horizontal?.infinity:nil,
maxHeight:轴==.垂直?.无穷大:零,
对齐:对齐)
.背景(GeometryReader{
代理
Color.clear.preference(键:SizeKey.self,值:axis==.horizontal?proxy.size.width:proxy.size.height)
}).onPreferenceChange(SizeKey.self){size=$0}
}
}
然后像这样使用它

SingleAxisGeometryReader{水平方向的宽度//
//这里的东西
}

SingleAxisGeometryReader(轴:。垂直){height in//表示垂直
//这里的东西
}

有了这个答案,它现在是通用的,没有代码更改。

如果视图实际上不是您在顶部给出的代码,那么您实际上想对视图做什么就有点不清楚了。不过,关于这一点,您可以交换GeometryReader和ScrollView的位置。GeometryReader所做的是找到可用空间的框架,并填充它。对于滚动视图,实际高度为0。那么这个,

ScrollView {
       GeometryReader {r in
          Text("SomeText").frame(width: r.size.width / 2)
       }
    }

这不允许它扩展,但我需要在ScrollView中提供
r
,以便在需要获取滚动视图的内容大小时,可以根据
r
调整滚动视图的内容大小?因此,我们可以使用另一种合适的方法。因此,请更改问题,然后我将编辑我的答案。我已经编辑了问题,并在scrollView中添加了
Text()
对象。看起来这会导致
scrollView
中的每个视图都变为Squished您想使文本视图的宽度为scrollView的一半吗?不,这只是一个示例。我需要的是问题中提到的内容。我想使用geometry reader,但我不想看到geometry reader的不良副作用-->它在水平和垂直方向上扩展整个视图。如果希望文本视图的大小为内容大小的一半,则无法这样做,因为文本也在内容本身内部。:)我不希望文本视图的大小是内容大小的一半。请将其放在滚动视图的末尾
.border(Color.black,width:1)
您将看到滚动视图(由于几何体读取器)占据了整个屏幕的宽度和高度。我想让这一切不发生。为什么?你有没有想解决的具体问题?或者你只是想让GeometryReader以一种它不具备的方式工作?关于我上面的回答,占据整个屏幕高度的ScrollView实际上与GeometryReader无关:
ScrollView{Text(“SomeText”).frame(maxWidth:.infinity)}.border(Color.black,width:1)
可能不是高度(在这种特殊情况下)。但是你可以看到它确实占据了整个宽度,对吗?在其他情况下,它会占据整个高度。我想重点是这个。我想使用GeometryReader,但不要让GeometryReader弄乱我的视图。我现在有一个更复杂的视图,GeometryReader的这个副作用使我的视图扩展到最大容量。我不希望它这样做,因为它弄乱了我的布局。如果我需要更清楚,那就告诉我。你确实需要更清楚。您需要发布实际代码。它不必精确,但需要对所有涉及的视图进行某种表示。否则,您的原始问题的答案是明确的“否”。没有办法做到这一点。然而,几乎可以肯定的是,有一种方法可以让您的视图正确布局,而且它根本不需要使用GeometryReader。因此,发布一个更详细的示例。然后,有人可能会解决你的问题。这太有用了,真不敢相信它不是几何体阅读器中的默认设置。是的,我认为SwiftUI的边缘仍然有点粗糙
ScrollView {
       GeometryReader {r in
          Text("SomeText").frame(width: r.size.width / 2)
       }
    }