在本机运行的 macOS 上(不在催化剂模式下),启用选择的 SwiftUI 列表具有多种样式状态,这些状态由我似乎无法访问的隐式变量控制。因此,foregroundColor列表中视图的自定义行为会不稳定。特别是,给出下面的示例,理论上总共应该有 3 种样式状态,但实际上第 2 项实际上有 5 种可能的样式状态:
如何控制 B、D、E 状态下的前景色?对于情况 D 和 E,似乎 macOS 列表选择上存在某种内置的去抖功能,导致在首次单击后实际被选中之前出现短暂的延迟。是否有类似未反跳isHighlighted属性之类的东西?显然,内置系统正在使用类似的东西,因为无论去抖如何,非自定义列表标签颜色都会立即从黑色切换到白色,如上面状态 5 中的项目 1 所示。对于情况 B,也许有不同的颜色属性而不是foregroundColor我需要使用的颜色属性?
非常感谢任何建议!
最低限度可重现的示例(在 macOS …
在 SwiftUI 中,内置DatePicker有两个按钮,每个按钮在单击时都会显示一个带有高度自定义视图的弹出菜单(分别是日历和多组件轮式选择器)。
如何在菜单中使用自定义按钮和我自己的滚轮样式选择器重新创建类似的设置?例如,我试图创建一个与 DatePicker 风格相同的持续时间选择器。不幸的是,当使用stylePicker渲染时,放置在 a 内的 aMenu根本不会渲染。使用默认选择器样式等替代方案不允许获得与 DatePicker 中的设置相同的体验。使用上下文菜单也不太正确,因为它需要长按并在打开时模糊屏幕的其余部分(加上轮式选择器在此视图中也被破坏)。.wheel.menu
最小可重现示例:单击Test甚至不会打开菜单。请注意,向选择器添加.frame(width: 100, height: 100)或fixedSize()没有帮助。
struct ExampleView: View {
@State var selection = 1
var body: some View {
Menu("Test") {
Picker("Test", selection: $selection) {
ForEach(0..<10) {
Text("\($0)").tag($0)
}
}
.pickerStyle(.wheel)
}
}
}
Run Code Online (Sandbox Code Playgroud) 在 Swift 5.5 SwiftUI 中,现在可以在 Markdown 文本中包含链接。是否可以使用它为Text视图中的子文本添加点击处理程序?例如,我正在想象做如下的事情,但我还没有弄清楚如何构建一个适用于此目的的链接(我每次都会收到 URL 错误)。设置某种自定义 url 架构是否有效?有没有更好的解决方案可以做到这一点,比如我可以添加到与sText类似的视图中?目标是解决与此处提到的类似问题,但不必回退到 UITextView 或非包装 HStack 或带有 ZStack 的 GeometryReaders。UITextViewshouldInteractWith
let baseText = "apple banana pear orange lemon"
let clickableText = baseText.split(separator: " ")
.map{ "[\($0)](domainThatImAllowedToCapture.../\($0))" }
Text(.init(clickableText)).onOpenLink { link in
print(link.split(separator: "/").last) // prints "pear" if word pear is tapped.
}
Run Code Online (Sandbox Code Playgroud) 给出以下最小的可重现示例:
struct ParentView: View {
@State private var showSheet = false
var body: some View {
return Button("Show sheet") {
showSheet.toggle()
}.sheet(
isPresented: $showSheet,
onDismiss: {
print("Parent onDismiss")
},
content: {
NavigationView {
SheetView(parentShowSheet: $showSheet)
}
}
)
}
}
struct SheetView: View {
@Environment(\.dismiss) private var dismiss
@Environment(\.isPresented) private var isPresented
@Binding var parentShowSheet: Bool
var body: some View {
Button("Manual close") {
dismiss()
}
.onChange(of: isPresented) { isPresented in
print("Sheet isPresented", isPresented)
}
.onChange(of: parentShowSheet) { parentShowSheet in …Run Code Online (Sandbox Code Playgroud) 在下面的示例中,我尝试删除填充,使“A”看起来像“C”。我找不到任何方法来删除MenuToolbarItemGroup 内的此填充(在 iOS 15 或 iOS 16 中测试)。“A”中的绿色和红色边框之间不应有任何空格。这显然是由.buttonStyle(.borderless)按钮控制的,但相应的.menuStyle(.borderlessButton)在工具栏中不起作用(但在工具栏中没有时起作用)。有任何想法吗?
@main
struct TestApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
struct ContentView: View {
var body: some View {
NavigationView {
ScrollView{}.toolbar {
ToolbarItemGroup(placement: .navigationBarTrailing) {
HStack {
Button {
} label: {
Image(systemName: "square.and.arrow.up")
.border(Color.red)
}
.buttonStyle(.borderless) // <--Removed in "B" below.
.border(Color.green)
Menu {
EmptyView()
} label: {
Image(systemName: "square.and.arrow.up")
.border(Color.red)
}
.menuStyle(.borderlessButton) // <--Removed in "B" below. …Run Code Online (Sandbox Code Playgroud) 我需要在swift中解压缩.epub文件以完全自己读取数据.我知道如何解析ePub的输出如果我能得到它(我在python中编写了一个工作示例),但SSZipArchive显然不会解压缩.epubs.但是,它确实可以在伪.zip文件上正常工作; 只有.epub是个问题.据我所知,毫无疑问,如果只是将人们指向那些在Objective-c中为你做的项目,并且有很多开销(我不明白或不需要) )这违背了我需要做的目的.以下是我目前的尝试.请注意,有问题的epub可以在以下链接(项目gutenberg)http://www.gutenberg.org/ebooks/158.epub.noimages找到,当我运行它时,print语句会发出:"true,true, true,false"(即文件和路径都存在,但不会解压缩):
import Foundation
class EpubExtractor: NSObject, SSZipArchiveDelegate {
init(fileName: String) {
fName = fileName
}
func getEpubInfo() {
var paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
let documentsDir = paths[0]
let zipPath = documentsDir.stringByAppendingString("/MyZipFiles") // My folder name in document directory
let fileManager = NSFileManager.defaultManager()
let success1 = fileManager.fileExistsAtPath(zipPath) as Bool
if success1 == false {
print("no directory")
do {
try! fileManager.createDirectoryAtPath(zipPath, withIntermediateDirectories: true, attributes: nil)
}
}
let archivePath = zipPath.stringByAppendingString("/emma.epub") // Sample folder is going …Run Code Online (Sandbox Code Playgroud)