我正在尝试使用 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 约束,这可以完美地工作,但我确实需要这个约束。但由于意见,我得到一个错误。不在同一层次结构中