0

我正在尝试使用 swift UI 创建一个下拉菜单。我实际上正在将它实现到一个 UIKit 项目中。

我要实现的基本功能应该是用户单击带有特定数据单元的标签,然后列表扩展为可以选择的其他度量单位。

这是我的 SwiftUI 代码:

import SwiftUI

@available(iOS 14.0.0, *)
struct DataUnitDropDown: View {
    var units = ["ltr", "usg", "impg"]
    
    @State private var selectedDataUnit = 0
    @State private var isExpanded = false
    
    var body: some View {
        VStack(alignment: .leading, spacing: 15) {
            DisclosureGroup(units[selectedDataUnit], isExpanded: $isExpanded) {
                VStack {
                    ForEach(0 ..< units.count, id: \.self) { index in
                        Text("\(units[index])")
                            .font(.title3)
                            .padding(.all)
                            .onTapGesture {
                                self.selectedDataUnit = index
                                withAnimation {
                                    self.isExpanded.toggle()
                                }
                            }
                        
                    }
                }
            }
        }
    }
}

所以我在这里有几个问题。首先,理想情况下,我想将其放入现有的水平 UIStackView 中。但是,我遇到的问题是,一旦下拉列表扩展,它就会增加堆栈的高度,这不是我想要的。这是组件的屏幕截图(请参阅“ltr”):

在此处输入图像描述

在 stackView 中展开时:

在此处输入图像描述

所以我不情愿地将它放在主视图中,添加了一些自动布局约束:

    if #available(iOS 14.0.0, *) {
        let controller = UIHostingController(rootView: DataUnitDropDown())
        controller.view.translatesAutoresizingMaskIntoConstraints = false
        addSubview(controller.view)
        controller.view.leadingAnchor.constraint(equalTo: refuelInfoView.actualUpliftVolume.trailingAnchor).isActive = true
        controller.view.centerYAnchor.constraint(equalTo: refuelInfoView.actualUpliftVolume.centerYAnchor).isActive = true
    }

但是现在当我展开时,整个菜单会向上移动:

在此处输入图像描述

显然不是我要找的。

所以我想我的问题是2倍的:

1-有什么方法可以将此元素合并到现有的堆栈视图中,而在展开下拉列表时堆栈不会增加高度?(我猜不是!)

2-如果我必须将其添加到主视图而不是堆栈中,如何在展开时阻止整个菜单向上移动?

更新:

我已将代码修改如下:

 if #available(iOS 14.0.0, *) {
        let controller = UIHostingController(rootView: DataUnitDropDown())
        controller.view.translatesAutoresizingMaskIntoConstraints = false
        controller.view.clipsToBounds = false
        controller.view.heightAnchor.constraint(equalToConstant: 22).isActive = true
        controller.view.topAnchor.constraint(equalTo: topAnchor).isActive = true
        stackSubviews = [inputField, controller.view]
    }

现在,没有 topAnchor 约束,这可以完美地工作,但我确实需要这个约束。但由于意见,我得到一个错误。不在同一层次结构中

4

1 回答 1

1

我假设而不是

controller.view.centerYAnchor.constraint(equalTo: 
       refuelInfoView.actualUpliftVolume.centerYAnchor).isActive = true

你需要

controller.view.topAnchor.constraint(equalTo: 
       refuelInfoView.actualUpliftVolume.bottomAnchor).isActive = true
于 2020-12-07T12:23:21.013 回答