在 SwiftUI 中使用新的 (iOS 14) DatePicker,它按预期工作并且在模拟器和设备上看起来很好,但是一旦日历弹出,我会在输出窗口中收到几行警告。这是一个有点讨厌!
虽然日志贴在下面,但看似相关的内容似乎是:
UIDatePicker 0x7fbd66fc49f0 is being laid out below its minimum width of 280. This may not look like expected, especially with larger than normal font sizes.
Run Code Online (Sandbox Code Playgroud)
但是,正如下面的代码所示,我不限制任何小于 300 点的内容。而且,一切都显示正常。
从我的角度来看,两种解决方案中的任何一种都可以正常工作:
弹出日期选择器的代码,一旦点击控件就会生成所有警告:
struct MyCustomDatePicker : View {
var doSomething : (Date) -> ()
@State var title: String
@State var ignoreSelStart : Bool
@State var ignoreSelEnd : Bool
@State var selectedDate : Date
@ObservedObject var limits : DateRangeLimits
var body: …Run Code Online (Sandbox Code Playgroud) 我有两个列表,每个列表都有简单的项目。我可以重新排列列表中的项目,代码如下所示。我希望能够从一个列表中拖动一个项目并将其放入另一个列表中。不确定我需要启用什么才能实现这一点。照原样,我可以从一个列表中将某些内容拖到整个屏幕上,但是除了它自己的列表之外,我不能将它放在任何地方;如果我在其他任何地方释放阻力,它就会飞回原来的位置。
显然,我需要添加一些东西来启用所需的行为;关于所需内容的任何想法(不一定使用.onMove- 在同一列表中)将不胜感激。
struct ContentView: View {
@State private var users1 = ["AAA", "BBB", "CCC"]
@State private var users2 = ["DDD", "EEE", "FFF"]
@State private var isEditable = true
var body: some View {
HStack {
Spacer()
List {
ForEach(users1, id: \.self) { user in
Text(user)
.background(Color(.yellow))
}
.onMove(perform: move1)
}
.environment(\.editMode, isEditable ? .constant(.active) : .constant(.inactive))
Spacer()
List {
ForEach(users2, id: \.self) { user in
Text(user)
.background(Color(.orange))
}
.onMove(perform: move2)
}
.environment(\.editMode, isEditable ? .constant(.active) : .constant(.inactive)) …Run Code Online (Sandbox Code Playgroud) 我有一个带有单元格的 UITableView,我希望用户能够通过使用每个单元格右侧的“手柄”上下拖动它们来重新排序。我不想实现“拖放”功能,因为这些单元格后面的数据在这个表之外没有任何意义(考虑到表视图及其单元格后面的数据,实现 NSItemProvider 看起来是一个丑陋的过程)。到目前为止,一切都已实施并运行良好。看起来有点像这篇文章的结果。
下一步是,我想知道用户何时“抬起”或开始移动单元格——类似于使用拖放时的dragStateDidChange能力。我什至想在单元格移出其位置之前收到此通知——因为 UI 将单元格背景变成白色并将其“抬高”到表格上方。
如何在不实施“拖放”的情况下获得此通知?
我尝试过的事情没有完成我想要的:
func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath?在 UITableViewDelegate 代码中实现了该功能;当用户触摸拖动手柄时不会调用它。func tableView(_ tableView: UITableView, targetIndexPathForMoveFromRowAt sourceIndexPath: IndexPath, toProposedIndexPath proposedDestinationIndexPath: IndexPath) -> IndexPath当拖动的单元格改变位置时触发该函数,但直到那时才会触发;它没有捕捉到我正在寻找的提升/拖动过程的开始。我怀疑必须有一个简单的通知,即单元格已被提起并正在使用手柄拖动,即使它尚未移动到足够远以高于或低于其旧位置。毕竟,操作系统“知道”这一点,因为它会改变背景并添加阴影等等。任何访问该通知以便其他代码也可以对其做出响应的帮助将不胜感激!
我试图获取文件夹(应用程序的Documents目录,在下面的示例中)中所有子文件夹的列表。下面的代码成功地找到了文件夹中的所有内容(文件和文件夹都存在),并且还找到了具有指定.text扩展名的文件,但是我无法将结果缩小为仅子目录的列表。
let filemgr = FileManager.default
var dirPaths = filemgr.urls(for: .documentDirectory, in: .userDomainMask)
myDocumentsDirectory = dirPaths[0]
var r = "Directory Listing:\n------------------\n" // r = will be returned (or displayed in this case)
do {
let directoryContents = try FileManager.default.contentsOfDirectory(at: myDocumentsDirectory, includingPropertiesForKeys: nil, options: [])
// all files -- works fine
let allFileNames = directoryContents.map{ $0.deletingPathExtension().lastPathComponent }
r += "All file names:\n\(allFileNames)\n\n"
// filtering for text files -- also works fine
let textFiles = directoryContents.filter{ $0.pathExtension …Run Code Online (Sandbox Code Playgroud) 我在视图中有一个选择器,我希望将其限制为定义的高度和宽度。虽然下面的代码在视觉上实现了这一点,但选择器响应其区域外的点击操作——在某些情况下,响应点击附近的按钮,就像我点击以将选择器滚动到其值的开头或结尾一样。(按钮不响应点击;选择器会响应。但是当点击靠近 - 但在 - 选择器之外 - 没有控制的地方时,也会发生这种情况。)
选择器似乎对上方、下方和侧面的触摸都有反应。当视图足够大(全屏或 2/3 屏幕)时,效果变得不那么明显,但是当整个应用程序只获得屏幕的 1/3 以及选择器的宽度时——作为视图的函数几何体——变小,其他控件也靠得更近,使用起来变得非常困难。
如何让 Picker 忽略其可见区域之外的所有触摸?
Picker(selection: self.$monthSelector, label: Text("Month")) {
ForEach(0 ..< 12, id: \.self) {
Text(self.monthNames()[$0])
.foregroundColor( Color.black )
}
}
.labelsHidden()
// THE FOLLOWING 2 STATEMENTS *IN CONJUNCTION* SEEM TO GIVE DESIRED Height/Width
.fixedSize()
.frame(maxWidth: geometry.size.width * 0.35, maxHeight: 100)
.clipped() // seems to accomplish nothing, visually or regarding touches
.background(Color.white)
.cornerRadius(10)
Run Code Online (Sandbox Code Playgroud)
我考虑过的事情: