【问题标题】:How to get a GeometryReader to work only in one dimension?如何让 GeometryReader 只在一维中工作?
【发布时间】:2020-06-23 16:18:07
【问题描述】:

我正在使用几何阅读器来控制 HStack 中某些子视图的水平布局。子视图最终必须是等间距的,并且它们的数量不是固定的。这工作正常,没有任何问题。

但是,仅由内容(子视图)确定的垂直布局会被几何阅读器扩展到最大可用高度(这是标准行为)。

欢迎任何关于如何克服这种行为的建议?

(解释问题的另一种方式是说水平几何阅读器可以解决问题)

为了清楚起见,特此添加代码 sn-p:

public struct ToolbarView: View {
    
    @ObservedObject public var viewModel: ToolbarViewModel
    
    public var body: some View
    {
        GeometryReader { geometry in
            
            HStack(spacing:0) {
                ForEach(self.viewModel.items.filter({ $0.visible })) { item in
                    ToolbarItemView(itemViewModel:item, toolbarViewModel: self.viewModel)
                        .frame(width:geometry.size.width / CGFloat(Double(self.viewModel.items.count)))
                        .font(self.viewModel.textFont)
                }
            }
        }.frame(height:CGFloat(50))
    }
}

【问题讨论】:

  • HStack 中等间距的视图不需要 GR。 GR 在这里做什么?
  • 您是否只显示您的代码并指出问题所在?
  • 对不起,我在解释问题时犯了一个错误。视图由下面带有文本的图像组成。两者都垂直居中。为了看起来不错,所有视图的大小必须相同。 GeometryReader 用于获得相等的大小。我曾考虑使用 Spacers 来获得相同的效果,但由于文本长度不同,这不适用于外观要求。同样,这一切都很好,但是 GeometryReader 在垂直轴上的布局方面遇到了麻烦。

标签: swiftui


【解决方案1】:

正如您在 cmets 中所指出的,Spacers 将在没有 GR 的情况下解决此问题。你只需要把它们放在一个 HStack 中:

HStack(spacing:0) {
    ForEach(self.viewModel.items.filter({ $0.visible })) { item in
        HStack {
            Spacer()
            ToolbarItemView(itemViewModel:item, toolbarViewModel: self.viewModel)
                .font(self.viewModel.textFont)
            Spacer()
        }
    }.frame(height:CGFloat(50))
}

【讨论】:

    猜你喜欢
    • 2018-02-17
    • 1970-01-01
    • 2017-10-31
    • 2020-08-19
    • 2015-09-01
    • 1970-01-01
    • 2011-05-31
    • 2016-04-14
    • 2011-04-16
    相关资源
    最近更新 更多