我可以停止 NSTextView 的 NSViewRepresentable 布局延迟吗?

2023-12-29

我正在使用一个NSTextView inside NSViewRepresentable在 SwiftUI 应用程序中。

The NSViewRepresentable正确调整大小到 NSTextView 的高度,因此文本会流向多行,但在创建后的第一次渲染中,它只显示一行.

看来NSTextView在第一帧上正确渲染,文本换行在正确的位置,但是NSViewRepresentable不显示完整高度。

The NSTextView已创建,并且文本设置为NSTextStorage in the makeCoordinator()的方法NSViewRepresentable,即之前NSViewRepresentable请求查看。

我覆盖NSTextView设置intrinsicContentSize:

    override func layout() {
        invalidateIntrinsicContentSize()
        super.layout()
    }

    override var intrinsicContentSize: NSSize {
            layoutManager!.ensureLayout(for: textContainer!)
            return CGSize(width: -1.0,
                          height: ceil(layoutManager!.usedRect(for: textContainer!).size.height))
    }

我认为这个问题是由中提到的“bobble”暗示的这个帖子 https://stackoverflow.com/a/63144255/978300。高度跟踪方法不同,但也无法设置第一帧。

我能做些什么来更快地强制布局NSTextView?视图的宽度不固定,因此需要动态流动。

这是一个最小的再现:

import SwiftUI

    let font = NSFont.systemFont(ofSize: 20, weight: .bold)
    let testString = "This long string demonstrates how its full extent is not shown on the first frame of an NSTextView rendered within an NSViewRepresentable."
    let fontAttribute = [NSAttributedString.Key.font: font]
    let testText = NSAttributedString(string: testString, attributes: fontAttribute)
    
    class InternalTextView: NSTextView
    {
        init() {
            super.init(frame: NSRect.zero)
            setContentHuggingPriority(.defaultHigh, for: .vertical)
        }
        
        override init(frame frameRect: NSRect, textContainer container: NSTextContainer?) {
            super.init(frame: frameRect, textContainer: container) }
        
        required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") }

        override func layout() {
            invalidateIntrinsicContentSize()
            super.layout()
        }
            
        override var intrinsicContentSize: NSSize {
            layoutManager!.ensureLayout(for: textContainer!)
            return CGSize(width: -1.0,
                          height: ceil(layoutManager!.usedRect(for: textContainer!).size.height))
        }
    }
    
    
    class TextViewCoordinator: NSObject {
        private(set) var view: InternalTextView
        
        init(withText text: NSAttributedString) {
            view = InternalTextView()
            view.textStorage?.setAttributedString(text)
            super.init()
        }
    }
    
    struct TextView: NSViewRepresentable
    {
        let text: NSAttributedString
        
        func makeNSView(context: Context) -> NSTextView { context.coordinator.view }
        
        func updateNSView(_ nsView: NSTextView, context: Context) { }
        
        func makeCoordinator() -> TextViewCoordinator { TextViewCoordinator(withText: text) }
    }
    
    struct ContentView: View
    {
        let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
        @State var showText: Bool = false
        
        var body: some View {
            HStack {
                Spacer()
                ScrollView {
                    VStack {
                        if showText {
                            ForEach(1..<10) { _ in
                                TextView(text: testText)
                            } }
                        
                        Spacer()
                    }.frame(maxWidth: 600)
                }
                Spacer()
            }
            .onReceive(timer) { _ in
                showText.toggle()
            }
        }
    }

Frame 1:

Frame 2:


I had a 非常相似的问题在 iOS 上使用 ViewRepresentable,我使用 CoreText 来执行一些文本渲染操作。症状几乎相同。

我的情况的解决方案是覆盖适合的尺寸()UIViewRepresentable 并在源视图中为其提供正确的信息(计算布局中框架的文本高度)。

func sizeThatFits(_ proposal: ProposedViewSize, uiView: <YOUR VIEW>, context: Context) -> CGSize? {
        
        return uiView.sizeThatFits(CGSize(width: proposal.width ?? 0, height: proposal.height ?? 0))
    }

我不确定这是否适合你的具体情况,但我花了一周左右的时间在同一件事上抓狂,所以我想我会分享。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以停止 NSTextView 的 NSViewRepresentable 布局延迟吗? 的相关文章

  • SwiftUI - 获取孩子的大小?

    有什么方法可以获取 SwiftUI 中子视图的大小吗 我基本上希望做 UIKit 相当于 self child frame origin x self child intrinsicContentSize width 2 0 我认为 Geo
  • 在 SwiftUI TextEditor 中设置光标位置

    有没有办法以编程方式将光标移动到特定文本行或在 SwifUI 中选择它TextEditor 例如 如果有一个TextEditor里面写着10行 当用户按下按钮时 光标将导航到第三行 或者文本将被选择 目前使用默认的 SwiftUI 是不可能
  • 工作表关闭后 SwiftUI 导航栏项目框架未对齐

    在 SwiftUI 中关闭工作表后 导航栏按钮不可点击 以下是重现该问题的步骤 出示一张单子 将应用程序移至后台一小段时间 2 秒 恢复应用程序并向下滑动关闭工作表 现在导航栏按钮框架未对齐 点击的工作框架与按钮的可见框架不同 这在 iOS
  • SwiftUI 更新主菜单 [已解决] kludgey

    真正的问题 你如何更新mainMenu在 SwiftUI 中 它真的可以工作吗 我在 SwiftUI 中构建了一个基于 MacOS 文档的应用程序 其中包括所有内置的文件菜单命令 即关闭 保存 复制 重命名 等 在保存文档之前 我会验证结构
  • 如何使用 SwiftUI 获取多个屏幕上的键盘高度并移动按钮

    以下代码获取键盘显示时的键盘高度 并将按钮移动键盘高度 在转换源 ContentView 和转换目标 SecibdContentView 处以相同的方式执行此移动 但按钮在转换目标处不移动 如何使按钮在多个屏幕上移动相同 import Sw
  • 如何观察UserDefaults的变化?

    我有一个 ObservedObject在我看来 struct HomeView View ObservedObject var station Station var body some View Text self station sta
  • 对成员“buildBlock()”的引用不明确

    我一直在尝试使用 Swift UI 为 iOS 13 制作一个应用程序 但我不断收到这个奇怪的错误 对成员 buildBlock 的引用不明确 无论我做什么 错误都不会消失 我尝试一次对代码段进行注释 以查看哪一部分可能导致了问题 但唯一有
  • 具有多个 ViewBuilder 的 SwiftUI 视图

    我有一个视图 表示单元格中的一行 如下所示 这很有效 但三个水平元素 图像 标题 副标题 图像 被硬编码为其各自的类型 我想要一个通用的ThreeItemView这可能需要 3Views任何类型并如图所示排列它们 这将允许我将相同的容器布局
  • 由枚举驱动的 SwiftUI 选择器:值未更新

    根据苹果公司的相关文档SwiftUI 中使用 Enum 的选取器 https developer apple com documentation swiftui picker 如果枚举符合Identifiable协议除了CaseIterab
  • SwiftUI:状态栏颜色

    有没有办法将 SwiftUI 视图的状态栏更改为白色 我可能错过了一些简单的东西 但我似乎找不到在 SwiftUI 中将状态栏更改为白色的方法 到目前为止我只看到 statusBar hidden Bool 状态栏文本 色调 前景色可以通过
  • 可搜索修饰符不在导航栏标题下方显示搜索栏

    我正在使用 iOS 15 并尝试新版本searchableSwiftUI 中列表的修饰符 看起来就像你附加时searchable text searchText 对于 NavigationView 搜索栏默认呈现在屏幕上导航栏标题下方 当我
  • 导航栏隐藏在 SwiftUI 中不起作用

    我有三观 我想隐藏第三个视图中的导航栏 即使我给 navigationBarHidden true 导航栏正在显示 我找不到我哪里做错了 我已在下面附上我的代码和生成的屏幕截图 Xcode 版本 11 1 struct ContentVie
  • 如何将 WKUIDelegate 实现到 SwiftUI WKWebView 中?

    我正在 Xcode v11 上创建一个 Web 应用程序 但在实现 WKUIDelegate 来显示 Javascript 警报并在 Web 应用程序上正确确认时遇到问题 我在 ContentView swift 上得到了一个非常简单的 w
  • 如何将NSTextView的格式化内容转换为字符串

    我需要将 NSTextView 的内容从 Mac 应用程序传输到 iOS 应用程序 我使用 XML 作为传输文件格式 所以我需要将 NSTextView 的内容 文本 字体 颜色等 保存为字符串 有什么办法可以做到这一点吗 一种方法是存档
  • SwiftUI - 使用“ObservableObject”和@EnvironmentObject 有条件地显示视图

    我想在我的应用程序中有条件地显示不同的视图 如果某个布尔值为 true 则将显示一个视图 如果为 false 将显示不同的视图 该布尔值位于 ObservableObject 类中 并根据将要显示的视图之一进行更改 PracticeStat
  • SwiftUI 关闭多个模态表

    我在用 sheet isPresented self showModal 在我的根视图中呈现一个模式 在模态中 我正在使用NavigationView引导用户浏览各个页面 对于用户配置文件构建器 在导航堆栈的最后一页中 我正在使用 Envi
  • 如何将一个 SwiftUI View 作为变量传递给另一个 View 结构

    我正在实施一个very自定义 NavigationLink 称为MenuItem并希望在整个项目中重用它 它是一个符合以下条件的结构体View并实施var body some View其中包含一个NavigationLink 我需要以某种方
  • 在 iOS 上将 SwiftUI 视图转换为 PDF

    我用 SwiftUI 画了一些漂亮的图表 因为它非常简单且容易做 然后我想将整个 SwiftUI 视图导出为 PDF 以便其他人可以以良好的方式查看图表 SwiftUI 没有直接为此提供解决方案 Cheers Alex 经过一番思考 我想到
  • Core Data + CloudKit 无法在其他设备上自动刷新?

    我的 SwiftUI 应用程序与 Core Data CloudKit 一起使用 我可以从 Mac 或 iPhone 将新条目保存到数据库中 该应用程序对所有设备使用完全相同的项目 代码库 唯一的问题是我需要关闭应用程序并重新打开它才能查看
  • 在 HStack 中以正确的方式对齐两个 SwiftUI 文本视图

    我有一个包含两行的简单列表视图 每行包含两个文本视图 查看一和查看二 我想对齐每行中的最后一个标签 查看两个 以便名称标签领先对齐并保持对齐 无论字体大小如何 第一个标签 查看一个 也需要前导对齐 我尝试在第一个标签 查看一个 上设置最小框

随机推荐

  • 在node.js中异步查询数据库

    我试图找出异步调用函数的正确方法 如果它也对数据库进行异步调用 在我的代码中 我调用了一个名为 check foods 的函数 如果尚未调用该函数 它将查询数据库最多两次 数据库查询将填充两个变量蔬菜和水果 假设它们尚未填充 一旦函数返回
  • 为什么在 onOpen 触发器中调用 UrlFetchApp 失败?

    我试图在加载 Google 电子表格时发出 HTTP POST 请求 我已经让我的 HTTP POST 请求作为菜单下拉列表中的函数工作 但我can t让它工作onOpen or onInstall 这是代码 function onOpen
  • 在 godot 游戏引擎中使用不同的编程语言?

    我想要将不同的编程语言绑定到 Godot 游戏引擎 有关于这个主题的指导文件或视频吗 例如 这个项目是如何完成的 戈多锈 https github com godot rust godot rust 如果我能学习基础知识 我就能成功地用不同
  • 为什么将 UILabel 设置为完全透明会丢失点击手势?

    我无法弄清楚这一点 我也不认为this https stackoverflow com questions 11142176 view transparency and gesture handling也确实解释了这一点 我有一个UILab
  • 以*字符*指定宽度

    当使用固定宽度字体 我想指定 HTML 元素的宽度人物 em 单位应该是 M 字符的宽度 所以我应该能够使用它来指定宽度 这是一个例子 div 1 3 5 7 9 1 3 5 7 9 1 div 结果不是我想要的 因为浏览器在第 15 列之
  • 禁用新的 Chrome 日期类型输入格式和占位符

    最新版本的Chrome终于原生支持日期类型输入了 就好了 but它强制使用自己的日期格式和占位符文本 这不太适合我的布局 如何删除本地化日期格式 使其显示为 ISO 它is当然作为 ISO 发送 但只是在浏览器中不以这种方式显示 以及如何删
  • var 查询未返回所需结果

    我有一个 javascript 文件 它通过在 SharePoint 列表中输入的信息将结果返回到 HTML 页面 它工作正常 但我被要求返回另一个名为 更多详细信息 的多个文本字段 但是它没有显示在 HTML 页面上 我检查了控制台 在
  • 如何将多个 QJsonObject 添加到 QJsonDocument

    我想添加多个QJsonObject to a QJsonDocument 这可能吗 它应该看起来像这样 objID obj1 Some other parameter objID obj2 Some other parameter 我试过这
  • 查找二维矩阵中的相邻元素

    我有一个 m n 阶的二维矩阵 00 01 02 03 0n 10 11 12 13 1n 20 21 22 23 2n m0 m1 m2 m3 mn 由此 给定一个 element 我需要编写一个返回其相邻元素的方法 相邻元素可以水平 垂
  • 有没有办法直接压缩 SQL 查询的结果?

    最近我一直在使用 SSMS 转储相对较大的表 通常的方法是设置Query gt Results To gt File 执行 选择一个文件并让 SQL 查询运行 完成后 我通常会压缩文件 然后将其传输到本地计算机 这在夜间 SQL 查询期间存
  • svn log/diff 前端像 gitk 一样吗?

    我想研究对 SVN 管理的 Google Chrome 源代码所做的更改 可以在以下位置找到网络界面 http src chromium org viewvc chrome http src chromium org viewvc chro
  • 如何在javascript中解码变量中的字符串?

    我有 JavaScript 代码 var location quot HCM NYC New York NY quot td Details innerText location 现在我想将文本位置解码为 HCM NYC 纽约州纽约市 请指
  • 加载器中的 Ionic 2 自定义 svg 旋转器

    我正在尝试将我的 SVG 添加到加载创建函数中 但是当我查看它时 我看到的只是一个空标签 let loading this loadingCtrl create spinner content this appConfig customSp
  • Firebase Deep Link 打开 Play 商店而不是应用程序

    您好 我是 Firebase 动态链接的新手 并且是自己学习的 我一直在关注this https firebase google com docs dynamic links use cases rewarded referral教程来完成
  • Rust“预期类型”错误打印完全相同的不匹配类型

    夜间生锈 struct Foo
  • Azure AD B2C:允许访问自定义策略 HTML 模板的策略 IP 地址

    我们正在使用 Azure AD B2C 仍处于预览版 对我们的应用程序的客户进行身份验证 我们将使用自定义 html 模板来实现登录体验和注册 使我们能够更强大地控制 MS 内容之外的格式和链接 由于我们的开发环境位于受限网络上 系统工程师
  • Java 主游戏循环

    我正在编写一个游戏循环 我在下面的示例中找到了代码here http www java gaming org index php topic 24220 0 我还研究了其他进行游戏循环的方法 例如本文 https dewitters com
  • 展开验证错误时的手风琴面板

    我使用 jQuery 手风琴将表单拆分为多个面板 并使用 jQuery 验证来检查所需字段 只要它们位于打开的面板中 它就可以很好地显示已验证字段中的错误 一个例子 假设我有三个手风琴面板 第一个面板上有两个需要验证的表单字段 现在 如果访
  • 如何在 R 中打印所有十进制值的数据框[重复]

    这个问题在这里已经有答案了 我有一个数据帧 我想检查其值 但是当我打印数据帧时 只打印 2 或 3 位小数 我直接检查了数据框并确认小数位数比打印的小数位数更多 到目前为止我已经尝试过print df digits 10 and optio
  • 我可以停止 NSTextView 的 NSViewRepresentable 布局延迟吗?

    我正在使用一个NSTextView inside NSViewRepresentable在 SwiftUI 应用程序中 The NSViewRepresentable正确调整大小到 NSTextView 的高度 因此文本会流向多行 但在创建