MarkdownView icon indicating copy to clipboard operation
MarkdownView copied to clipboard

能否加入整个View文本选择功能?

Open alexcding opened this issue 9 months ago • 19 comments

感谢作者, 这个markdown是目前github最好用的 🙏

The feature you want to get in MarkdownView 唯一一个缺陷就是目前文本选择只能选择一行,无法选中整个段落。希望能增加支持整段文本的选择功能。

Describe that feature in detail 希望在 MarkdownView 中,可以通过拖动光标或双击等操作,方便地选中整个段落,而不仅限于单行选择。这将提升编辑长文本时的效率,方便进行复制、剪切、格式化等操作。

Behavior in different OS iOS / iPadOS: 支持手指拖动或双击选中整个段落。 macOS: 支持鼠标拖动或双击选中整个段落,配合快捷键(如 Shift + 点击)扩展选择范围。

Additional context 增加段落选择功能将改善 Markdown 文档的编辑体验,特别是在处理较长文本时。若能配合「全选」和「扩展选择」等快捷操作,用户将能更高效地管理文本内容。

如果需要进一步修改或补充内容,随时告诉我!✨

alexcding avatar Mar 26 '25 00:03 alexcding

感谢认可

MarkdownView 致力于提供高度可自定义的 Markdown 视图,所有的自定义都是基于 View 来实现 因此可能存在文本和视图之间文本选择存在断层

SwiftUI 的 .textSelection(.enabled) 仅适用于 Text

后续会提供另外一种专注于文本的版本,MarkdownText,完全基于 Text 构建,可以完全支持文本选择,但是无法自定义样式等限制

我会尽可能的减少限制 但是一定是不如现有的 MarkdownView 来的灵活的

LiYanan2004 avatar Mar 26 '25 03:03 LiYanan2004

我测试一下这个 webview 版本的, 内存占用和scrollview 流畅度都比原生的要好, 很奇怪, 难道是苹果的优化实在太拉垮.
是否可以考虑之后再出一个 web版本 ? 再次感谢🙏

alexcding avatar Mar 26 '25 03:03 alexcding

这个 package 只提供原生的解决方案 因此不会出 WebView 版本

WebView 的这个需要用 css 来做自定义

内存占用和scrollview 流畅度都比原生的要好

尝试过和 MarkdownView 对比过嘛

LiYanan2004 avatar Mar 26 '25 03:03 LiYanan2004

是的, 我在做一个类似Chatgpt的app, 基本上对话都是markdown. 我测了一个包含10个api 回复, 带code, 带普通的markdown, 不用LazyVStack的情况下, 原生的内存占用差不过160MB, Webview版本是70MB左右.

 ScrollView {
            ForEach(viewModel.conversation.messages) { message in
                     MessageView(message: message)
              }
  }

关于流畅度, 暂时没有测试, 就CPU占比, 滚动的时候时候原生40%, Web是30%. 机子是Mac Studio M4 Max

怀疑流畅度是不是这个bug https://developer.apple.com/forums/thread/764264, 好像list的表现更好一点

alexcding avatar Mar 26 '25 13:03 alexcding

Web vs Native

WebView 在后台还会开其他的 Helper Processes 很难计算所有的内存消耗的 CPU 占用 Xcode 里显示的只是 app 的占用

而你看到的 native 占用是整个的

因此你这个比较是不太准确的

流畅度

List ≈ ScrollView + LazyVStack

多个 MarkdownView 在一个 Stack 里的话 这个 Stack 推荐用 Lazy 版本的哈

LiYanan2004 avatar Mar 26 '25 13:03 LiYanan2004

我测试一下这个 webview 版本的, 内存占用和scrollview 流畅度都比原生的要好, 很奇怪, 难道是苹果的优化实在太拉垮. 是否可以考虑之后再出一个 web版本 ? 再次感谢🙏

我也发现了 这个修改过的web版本用来做打字机效果快速刷新的时候,内存和CPU都很低。

Mase9527 avatar Mar 29 '25 01:03 Mase9527

我也发现了 这个修改过的web版本用来做打字机效果快速刷新的时候,内存和CPU都很低。

后台 WKWebView 起的进程你是一点不算啊 😂

LiYanan2004 avatar Mar 29 '25 03:03 LiYanan2004

我也发现了 这个修改过的web版本用来做打字机效果快速刷新的时候,内存和CPU都很低。

后台 WKWebView 起的进程你是一点不算啊 😂

同样的代码,换了WebView 和原生来对比,都是发了3条消息,原生的Memory去到了130 ,web的才40多,这个差别有点远😂 第一个视频是原生的,第二个是web的

https://github.com/user-attachments/assets/7ed6d7eb-d959-48ef-895d-bbd587e8cbcd

https://github.com/user-attachments/assets/4a4751e1-3bfc-44a2-b8b5-89e9023f248f

Mase9527 avatar Mar 29 '25 04:03 Mase9527

  • 原生:140 MB 包含了所有的渲染占用
  • WebView:40 MB 只是 App 的占用 WebView 后台还会再开渲染进程 这些都是不算在 app 里的

LiYanan2004 avatar Mar 29 '25 04:03 LiYanan2004

这个其他进程的,我观察了一下使用web和原生的都是差不多,WebView的占用的内存应该是包含在这里的吧 Image

Mase9527 avatar Mar 29 '25 05:03 Mase9527

@Marcello168 再开一个 issue 讨论吧 提供最小可复现的对比代码

LiYanan2004 avatar Mar 29 '25 05:03 LiYanan2004

Image 这是基于Down和UITextView的CommonMark

Image 这是MarkdownView

希望后续支持RangeSelection

cyg02032015 avatar Jun 13 '25 06:06 cyg02032015

啊 这个在 MarkdownView 中不会支持 也许可以利用 OS 26 上的新 RichTextEditor 来实现一个新的可以编辑的 markdown view

后续我会研究一下

LiYanan2004 avatar Jun 13 '25 06:06 LiYanan2004

啊 这个在 MarkdownView 中不会支持 也许可以利用 OS 26 上的新 RichTextEditor 来实现一个新的可以编辑的 markdown view

后续我会研究一下

我看了下chatgpt及豆包, 应该是使用UITextView展示文本, 代码块和Table这种使用自定义view Thank u for reply

cyg02032015 avatar Jun 13 '25 06:06 cyg02032015

MarkdownView 95% 基于 SwiftUI 来做的 SwiftUI 中的 Text 的选择在iOS 上就是这样的

后续看看有没有机会用 TextEditor 吧(这个是UITextView)但是这个做出来也需要 OS 26 以上了

LiYanan2004 avatar Jun 13 '25 07:06 LiYanan2004

得N年后才能用上RichTextEditor了 哈哈

cyg02032015 avatar Jun 13 '25 07:06 cyg02032015

哈哈 没办法 🥹

LiYanan2004 avatar Jun 13 '25 07:06 LiYanan2004

Hi @LiYanan2004 👋🏽

First of all, I would like to thank you as well for this library. I'm also working on an AI chat app to render markdown text and found your library which already looks very awesome!

I still need to find a way to make text selectable with the range selector. In this thread you wrote:

The selection of Text in SwiftUI is like this on iOS.

Do I understand correctly that this is currently working using the internal MarkdownText view but it's not ready to use yet?

I'm also happy to support you if you need any help. Just let me know.

iphilgood avatar Oct 02 '25 11:10 iphilgood

No. MarkdownText is still not available to use. I may switch to another approach. Currently no use of MarkdownText internally at all

Stay tuned for the next major updates. But that may take a while, I am super busy recently.

LiYanan2004 avatar Oct 02 '25 12:10 LiYanan2004