带有 GeometryReader 和 paddings 的 SwiftUI HStack

2024-01-23

在我的 iOS 应用程序中,我想放置两个宽度相同的视图,以便它们填充父视图的整个宽度。

为此,我使用 GeometryReader,它破坏了自动布局。但自动布局不起作用,并且不会自动计算该视图的高度。 TestView 的高度未确定,所以我无法手动添加框架大小......

它应该是这样的(我所期望的TestView):

这就是我将视图放在列表上时的样子(货币查看):

测试视图.swift

struct TestView: View {
    var body: some View {
        GeometryReader { geometry in
            HStack(spacing: 0) {
                VStack(alignment: .leading, spacing: 0.0) {
                    Text("Name 1\n Test second name 2")
                        .font(.system(size: 18))
                        .fontWeight(.bold)
                    HStack {
                        Text("123")
                        Text(" + 5")
                    }
                }
                .padding(.horizontal, 12.0)
                .padding(.vertical, 9.0)
                .frame(width: geometry.size.width / 2)
                .background(RoundedRectangle(cornerRadius: 8.0)
                .foregroundColor(Color.blue
                                    .opacity(0.2)))

                VStack(alignment: .leading, spacing: 0.0) {
                    Text("Name 1")
                        .font(.system(size: 18))
                        .fontWeight(.bold)
                    HStack {
                        Text("123")
                        Text(" + 5")
                    }
                }
                .padding(.horizontal, 12.0)
                .padding(.vertical, 9.0)
                .frame(width: geometry.size.width / 2)
                .background(RoundedRectangle(cornerRadius: 8.0)
                .foregroundColor(Color.blue
                                    .opacity(0.2)))
            }
        }

    }
}

货币视图.swift

struct CurrenciesView: View {

    @State private var items: [Str] = (0..<5).map { i in

       return Str(title: "Struct  #\(i)")

    }

    var body: some View {
        NavigationView {
                    List {
                        Section(header:
                        TestView().listRowInsets(EdgeInsets())
                        ) {
                            ForEach(items) { item in
                                Text("asd")
                            }
                        }.clipped()

                    }
                    .navigationBarTitle("Section Name")
                    .navigationBarItems(trailing: EditButton())
                }
    }
}

您可以创建一个自定义PreferenceKey以及计算它的视图:

struct ViewSizeKey: PreferenceKey {
    static var defaultValue: CGSize = .zero

    static func reduce(value: inout CGSize, nextValue: () -> CGSize) {
        value = nextValue()
    }
}
struct ViewGeometry: View {
    var body: some View {
        GeometryReader { geometry in
            Color.clear
                .preference(key: ViewSizeKey.self, value: geometry.size)
        }
    }
}

然后,您可以在您的视图中使用它们。请注意,您需要使用@Binding in the TestView and @State private var headerSize在父视图中。否则,父视图将不会刷新,并且列表将无法正确重新计算标题大小。

struct CurrenciesView: View {
    @State private var items: [String] = (0 ..< 5).map(String.init)
    @State private var headerSize: CGSize = .zero

    var body: some View {
        NavigationView {
            List {
                Section(header:
                    TestView(viewSize: $headerSize)
                ) {
                    ForEach(items, id: \.self) {
                        Text($0)
                    }
                }.clipped()
            }
            .navigationBarTitle("Section Name")
            .navigationBarItems(trailing: EditButton())
        }
    }
}
struct TestView: View {
    @Binding var viewSize: CGSize

    var body: some View {
        HStack(spacing: 0) {
            VStack(alignment: .leading, spacing: 0.0) {
                Text("Name 1\n Test second name 2")
                    .font(.system(size: 18))
                    .fontWeight(.bold)
                HStack {
                    Text("123")
                    Text(" + 5")
                }
            }
            .padding(.horizontal, 12.0)
            .padding(.vertical, 9.0)
            .frame(width: viewSize.width / 2)
            .background(RoundedRectangle(cornerRadius: 8.0)
                .foregroundColor(Color.blue
                    .opacity(0.2)))

            VStack(alignment: .leading, spacing: 0.0) {
                Text("Name 1")
                    .font(.system(size: 18))
                    .fontWeight(.bold)
                HStack {
                    Text("123")
                    Text(" + 5")
                }
            }
            .padding(.horizontal, 12.0)
            .padding(.vertical, 9.0)
            .frame(width: viewSize.width / 2)
            .background(RoundedRectangle(cornerRadius: 8.0)
                .foregroundColor(Color.blue
                    .opacity(0.2)))
        }
        .frame(maxWidth: .infinity)
        .background(ViewGeometry()) // calculate the view size
        .onPreferenceChange(ViewSizeKey.self) {
            viewSize = $0 // assign the size to `viewSize`
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带有 GeometryReader 和 paddings 的 SwiftUI HStack 的相关文章

随机推荐

  • 根据任意分布设置 Eigen::Matrix 的系数

    Eigen Matrix 有一个 setRandom 方法 它将矩阵的所有系数设置为随机值 但是 是否有一种内置方法可以将所有矩阵系数设置为随机值 同时指定要使用的分布 有没有办法实现类似以下内容 Eigen Matrix3f myMatr
  • SqlDependency 仅在订阅时触发

    我正在尝试利用SqlDependancy在 SignalR 项目中 但我似乎无法得到OnChanged事件多次触发 它最初在订阅事件上触发 但在对底层数据库进行更改后不会再次触发 我省略了 SignalR 和控制器代码 因为问题似乎出在存储
  • PHP 引导基础知识

    我正在编写我的第一个 PHP 应用程序 每个人都谈论拥有一个bootstrap php初始化您的应用程序 这是有道理的 我已经整理了一个我很满意的 有两件事我不明白 而且似乎没有人提到 我在哪里调用我的引导表单 我是否将其包含在每个页面中
  • C++ 中的 IPv6 连接测试

    是否有任何 C 函数可以测试运行我的程序的计算机是否支持 IPv6 连接 我需要知道类似此页面的结果http test ipv6 com http test ipv6 com 但是在 C 中 EDIT 我试图使用getifaddrs 但返回
  • 如何从 FTP 获取文件(使用 C#)?

    现在我知道如何将文件从一个目录复制到另一个目录 这非常简单 但现在我需要对 FTP 服务器上的文件执行相同的操作 你能给我一些如何在更改文件名的同时从 FTP 获取文件的示例吗 看一眼如何 使用 FTP 下载文件 http msdn mic
  • 将动态加载的自定义 ASP 控件的脚本注册到 DOM

    我在 a 期间加载我的 ascx 控件postback 下拉更改事件 父级 C private void ddlChange MyControl myCtr CallScript Page LoadControl Controls MyCo
  • 通过单击按钮填充 Javascript 中的文本框 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我试图通过单击表单按钮来填充表单上的
  • WebClient DownloadString UTF-8 不显示国际字符

    我尝试将网站的 html 保存在字符串中 该网站具有国际字符 即使我将编码设置为与网站字符集相对应的 UTF 8 它们也不会保存到字符串中 这是我的代码 using WebClient client new WebClient client
  • 优化多重连接

    我正在尝试找出一种方法来加速一个特别繁琐的查询 该查询按日期在几个表中聚合一些数据 下面是完整的 丑陋的 查询以及EXPLAIN ANALYZE以表明它是多么可怕 如果有人可以看一下 看看他们是否能发现任何重大问题 很可能 我不是 Post
  • 是否可以使用 Mongoose 在 MongoDB 中创建新数据库?

    我想知道是否可以使用 Mongoose 在 MongoDB 中创建一个新数据库 我在 Node 上运行 并且我知道 Node 的 MongoDB 驱动程序可以做到这一点 但我想知道是否可以仅从 Mongoose 中做到这一点 有没有相当于d
  • 对于 OS X 特定代码,我应该使用什么 C 预处理器条件?

    对于 OS X 特定代码 我应该使用什么 C 预处理器条件 如果我为 OS X 进行编译 则需要包含特定的库 如果为 Linux 进行编译 则需要包含不同的标头 我知道有 APPLE 但我不知道这是否是 OS X 10 x 的当前条件 此操
  • 如何在云(AWS、heroku 等)中跨多个节点建立时钟同步?

    我想在云中运行一个大型节点集群 AWS Heroku 或者可能是自我管理的 VMS 其时钟必须与预定义的容差同步 我正在寻找大约 200 毫秒的容差 这意味着 如果我有 250 个节点 那么这 250 个节点之间的最大时钟差异不应超过 20
  • SQL 查询:在给定时间间隔内处于活动状态的所有 ID 的列表,按开始时间排序

    我有一个包含轨道点 x y 坐标 的 MySQL 表 每行包含 TrackID 时间戳以及该轨道在给定时间点的 X 和 Y 位置 我想要的是在给定时间间隔 tmin tmax 内处于活动状态的所有 TrackID 的列表 按其开始时间排序
  • YouTube 搜索 API 与 YouTube 上的手动搜索返回不同的结果

    我正在使用 YouTube v3 API 来搜索视频 在某些情况下 从 API 返回的结果与我在 YouTube 网站上手动使用完全相同的查询字符串时得到的结果完全不同 请任何人解释为什么会发生这种情况 例如搜索 Zombie Huntin
  • 如何使标签显示带有不同颜色字母的FormattedString?

    我正在使用 FormattedString 在 Xamarin Forms 上的标签上显示自定义文本 我想要实现的是更改一个或多个元素的颜色 例如 但即使我正在更改颜色 标签也只会显示具有相同颜色的所有美元符号 这是视图上的标签
  • 在 Bukkit 插件中将赏金参数读取为整数

    这只是该插件的开始 还会有更多 这就是我想要的 对于 bounty
  • 从初始视口启用“缩小”

    这是在我的 Android Chrome 浏览器上处理视口元标记时出现的问题 未在其他浏览器中测试 我想要一个可以缩小的网页 而不仅仅是放大 如果我用这个 我可以缩小到 0 5 的比例 0 5 是 初始 缩放 正如我所期望的那样 但如果我用
  • C# 对象引用如何在内存中/运行时(在 CLR 中)表示?

    我很想知道 C 对象引用在运行时 在 NET CLR 中 如何在内存中表示 我想到的一些问题是 对象引用占用多少内存 在类的范围和方法的范围中定义时有什么不同吗 它所在的位置是否根据此范围 堆栈与堆 而有所不同 对象引用中维护的实际数据是什
  • 在回形针中调整原始图像的大小

    回形针将原始图像存储在 original 文件夹中 有没有办法调整原始图像的大小 我想缩小原件以节省光盘空间 因此 例如 如果访问者上传一张 2592x1936 的照片 我想将其存储为 1024x1024 就像我们在 styles 中设置
  • 带有 GeometryReader 和 paddings 的 SwiftUI HStack

    在我的 iOS 应用程序中 我想放置两个宽度相同的视图 以便它们填充父视图的整个宽度 为此 我使用 GeometryReader 它破坏了自动布局 但自动布局不起作用 并且不会自动计算该视图的高度 TestView 的高度未确定 所以我无法