问题标签 [nsviewrepresentable]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
swiftui - 如何在 SwiftUI 列表中以正确的高度呈现多行文本?
我想要一个显示多行文本的 SwiftUI 视图,具有以下要求:
- 适用于 macOS 和 iOS。
- 显示大量字符串(每个字符串由单独的模型对象支持)。
- 我可以对多行文本进行任意样式设置。
- 每个文本字符串可以是任意长度,可能跨越多行和多段。
- 每个文本字符串的最大宽度固定为容器的宽度。高度根据文本的实际长度而变化。
- 每个单独的文本都没有滚动,只有列表。
- 文本中的链接必须是可点击/可点击的。
- 文本是只读的,不一定是可编辑的。
感觉最合适的解决方案是拥有一个列表视图,包装原生 UITextView/NSTextView。
这是我到目前为止所拥有的。它实现了大多数要求,除了具有正确的行高度。
这是它在 iOS 上输出的内容。macOS 输出类似。
如何获得此解决方案来调整具有正确高度的文本视图?
我尝试过但未在此处显示的一种方法是给出“从外到内”的高度 - 用框架指定列表行本身的高度。当我知道宽度时,我可以计算 NSAttributedString 的高度,这可以通过 geoReader 获得。这几乎可以工作,但是有问题,而且感觉不对,所以我不在这里展示它。
macos - 如何在 SwiftUI 中自动扩展 NSTextView 的高度?
如何在下面的 NSTextView 上正确实现 NSView 约束,以便它与 SwiftUI .frame() 交互?
目标
一个 NSTextView,它在换行后垂直扩展其框架以强制 SwiftUI 父视图再次呈现(即,扩展文本下方的背景面板 + 下推 VStack 中的其他内容)。父视图已经包含在一个 ScrollView 中。由于 SwiftUI TextEditor 丑陋且功能不足,我猜其他几个 MacOS 新手会想知道如何做同样的事情。
更新
@Asperi 指出了一个隐藏在另一个线程中的 UIKit 示例。我尝试为 AppKit 调整它,但是 async recalculateHeight 函数中有一些循环。明天我会在喝咖啡时多看看它。谢谢阿斯佩里。(无论你是谁,你都是 SwiftUI SO 爸爸。)
问题
下面的 NSTextView 实现编辑愉快,但不服从 SwiftUI 的垂直框架。在水平方向上一切都被遵守,但文本只是继续向下超过垂直高度限制。除非,当将焦点移开时,编辑器会裁剪多余的文本……直到再次开始编辑。
我试过的
作为模特的帖子太多了。下面是一些。我认为我的不足是误解了如何设置约束,如何使用 NSTextView 对象,也许是想太多了。
- 我尝试在下面的代码中一起实现 NSTextContainer、NSLayoutManager 和 NSTextStorage 堆栈,但没有任何进展。
- 我玩过 GeometryReader 输入,没有骰子。
- 我在 textdidChange() 上打印了 LayoutManager 和 TextContainer 变量,但没有看到新行的尺寸变化。还尝试监听 .boundsDidChangeNotification / .frameDidChangeNotification。
- GitHub:未命名的 MacEditorTextView.swift <- 删除了它的 ScrollView,但这样做后无法立即获得文本约束
- SO:SwiftUI 中的多行可编辑文本字段<- 帮助我理解了如何换行,删除了 ScrollView
- SO:使用 layoutManager 的计算<- 我的实现不起作用
- Reddit:在 SwiftUI 中包装 NSTextView <- 提示似乎很到位,但缺乏可遵循的 AppKit 知识
- SO:使用intrinsicContentSize自动增长高度<-我的实现不起作用
- SO:更改 ScrollView <- 不知道如何推断
- SO:关于设置 NSTextView 的 Cocoa 教程
- 苹果 NSTextContainer 类
- Apple 跟踪文本视图的大小
内容视图.swift
NSTextEditor.swift
来自 UIKit 线程的快速 Asperi 的回答
碰撞
macos - 在 MacOS 上的 SwiftUI 中查找点击位置
我尝试使用 NSViewRepresentable 而不是 UIViewRepresentable 将我在 iOS 应用程序上使用的解决方案调整为 macOS。
下面是我的“可点击视图”。我的问题是,当我尝试使用这个视图时,我得到了错误Cannot find "TappableView" in scope
。
谢谢。
(使用 Xcode 版本 12.0 beta 4)
swift - 选择更改时,通过 NSViewRepresentable 将值从 NSTextView 传递到父 SwiftUI 视图
问题
我希望能够从 textView.textStorage 的选定范围和/或 textView 的键入属性传递文本属性。这应该在选择更改时发生。
这样做的目的是让 SwiftUI 视图可以根据用户使用的属性进行更新。
我正在尝试使用该textViewDidChangeSelection
方法来做到这一点。但是,使用 NSTextViewDelegate 我只能获得选定的范围,并且不能传递从 textView 中存储的任何值。
我的尝试
下面是我的 RepresentableView 的精简版。
是否可以创建订阅相同通知但传递 textView 的自定义方法?我必须制作自定义代表吗?
任何帮助将不胜感激。干杯。
swift - 在范围内找不到类型“NSViewRepresentable”
我想使用 NSViewRepresentable 在 SwiftUI 中创建一个模糊视图,但 XCode 给了我一条错误消息,上面写着“在范围内找不到类型 'NSViewRepresentable'”。
但是,当我将这个完全相同的代码复制并粘贴到一个新的全新 Xcode 项目中时,没有错误。我在 Google 和 StackOverflow 上进行了搜索,但没有发现任何人有同样的问题。
swiftui - SwiftUI 中的 WKWebView 未在 macOS 上加载 HTML 字符串
关于 StackOverflow 的第一个问题(对于针对 macOS 的原生应用程序开发来说相对较新)。
我目前正在尝试构建一个简单的 SwiftUI 视图,它利用 WKWebView 的 loadHTMLString 函数在屏幕上显示硬编码的 HTML 字符串。
AFAIK webkit 目前不支持 SwiftUI,因此我需要使用 NSViewRepresentable 将 AppKit UI 嵌入到我的 SwiftUI 应用程序中。这是我在文档和 XCode 的自动完成之后得到的:
需要注意的是,预览画布不会加载 HTML(显示空窗口)。
然后,我将 ContentView.Swift 中的默认 Text() 视图替换为 HTMLView(),并运行我的应用程序。
应用程序编译,但 WebView 无法加载 HTML(我得到一个空窗口)。我在控制台中收到以下错误:
任何有关上述内容的帮助将不胜感激!
swiftui - 在 SwiftUI 中使用时如何更改 NSTextField 字体大小
下面是一个演示应用程序,带有一个简单NSTextField
的 Mac 应用程序。出于某种原因,无论我尝试什么,字体大小都不会改变。
这就是整个应用程序。在这个简单的例子中,我没有做任何其他事情。我可以更改文本颜色和其他属性,但由于某种原因字体大小不会改变。
一时兴起,我也尝试在 SwiftUI 端更改它,但我没想到它会起作用(而且它没有):
有任何想法吗?
swift - ScrollView 中的自动调整大小的 NSViewRepresentables 相互重叠(SwiftUI)
我正在尝试在包含几个自动调整大小的 NSViewRepresentables 的 ScrollView 中显示项目。但是,似乎项目在滚动后或当其父 ScrollView 的大小发生更改时相互重叠:
如果我从这里的其他重要回复中正确理解(例如@Asperi 的答案在这里),则 ScrollView 需要知道其项目的高度才能正确呈现它。因此,我尝试将每个项目的总高度传递给其父 ScrollView,但是,这些项目仍然重叠。
我做了一个简单的例子:
有人知道为什么会这样吗?或者 NSTextView 的自动调整大小有什么问题?非常感谢您的任何建议。
swiftui - 用 NSViewRepresentable 包装 NSComboBox 需要什么接线代码?
我正在尝试用 NSViewRepresentable 包装 NSComboBox 以在 SwiftUI 中使用。我想将下拉选项列表和组合框的文本值作为绑定传递。我希望文本值绑定在每次击键时更新,并在选择下拉选项之一时更新。如果在外部更改绑定,我还希望更改组合框的文本值/选择。
现在,我没有看到选项选择的绑定更新,更不用说每次击键了,正如代码底部的 SwiftUI 预览所示。
我阅读旧文档的最新线索是,可能在 NSComboBox 中,选择值和文本值是两个不同的属性,我已经编写了这个包装,就好像它们是一样的?试图运行它。出于我的目的,它们将是相同的,或者至少只有文本值很重要:它是用于任意用户字符串输入的表单字段,也有一些预设字符串。
这是代码。我认为这应该可以粘贴到 Mac 平台的游乐场文件中:
如果您有任何建议,请提前感谢您!
swift - 如何在 NSTableView 的选择和重点更改上自定义表格项目内容?
我目前正在尝试在 SwiftUI 中创建一个 3 窗格布局。由于 SwiftUI 的 List 没有提供更多的自定义功能,我决定基于 NSTableView 创建自己的 NSViewRepresentableView。NSTableView 有一个列,每一行都由一个包含 SwiftUI 视图的 NSHostingView 表示。这是选择单个项目后的部分屏幕截图:
我有两个问题:
- 选择项目时,文本应为白色。我该怎么做呢?我已经用 tableViewSelectionDidChange() 解决了这部分并弄乱了视图,但是它的性能非常慢并且看起来一团糟。
- 当带有某些选择的表格视图失去焦点时,我如何检测到它并再次返回黑色?
这是我到目前为止编写的代码:
视图使用MkList
如下:
总的来说,解决这个问题的最佳方法是什么?