From dd3eadc1959266892cf239e08dc83fe178d133dc Mon Sep 17 00:00:00 2001
From: Tony <1355701658@qq.com>
Date: Sat, 30 Aug 2025 00:34:47 +0800
Subject: [PATCH] SwiftUI version of RichEditorView
---
README.md | 196 ++++++
RichEditorView/Sources/RichEditorState.swift | 138 ++++
.../Sources/SwiftUIRichEditor.swift | 272 ++++++++
.../project.pbxproj | 600 ++++++++++++++++++
.../contents.xcworkspacedata | 7 +
.../AccentColor.colorset/Contents.json | 11 +
.../AppIcon.appiconset/Contents.json | 35 +
.../Assets.xcassets/Contents.json | 6 +
.../RichEditorViewSwiftUI/ContentView.swift | 176 +++++
.../RichEditorViewSwiftUIApp.swift | 17 +
.../RichEditorViewSwiftUITests.swift | 36 ++
.../RichEditorViewSwiftUIUITests.swift | 41 ++
...hEditorViewSwiftUIUITestsLaunchTests.swift | 33 +
art/SwiftUI.jpg | Bin 0 -> 366509 bytes
14 files changed, 1568 insertions(+)
create mode 100644 RichEditorView/Sources/RichEditorState.swift
create mode 100644 RichEditorView/Sources/SwiftUIRichEditor.swift
create mode 100644 RichEditorViewSwiftUI/RichEditorViewSwiftUI.xcodeproj/project.pbxproj
create mode 100644 RichEditorViewSwiftUI/RichEditorViewSwiftUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata
create mode 100644 RichEditorViewSwiftUI/RichEditorViewSwiftUI/Assets.xcassets/AccentColor.colorset/Contents.json
create mode 100644 RichEditorViewSwiftUI/RichEditorViewSwiftUI/Assets.xcassets/AppIcon.appiconset/Contents.json
create mode 100644 RichEditorViewSwiftUI/RichEditorViewSwiftUI/Assets.xcassets/Contents.json
create mode 100644 RichEditorViewSwiftUI/RichEditorViewSwiftUI/ContentView.swift
create mode 100644 RichEditorViewSwiftUI/RichEditorViewSwiftUI/RichEditorViewSwiftUIApp.swift
create mode 100644 RichEditorViewSwiftUI/RichEditorViewSwiftUITests/RichEditorViewSwiftUITests.swift
create mode 100644 RichEditorViewSwiftUI/RichEditorViewSwiftUIUITests/RichEditorViewSwiftUIUITests.swift
create mode 100644 RichEditorViewSwiftUI/RichEditorViewSwiftUIUITests/RichEditorViewSwiftUIUITestsLaunchTests.swift
create mode 100644 art/SwiftUI.jpg
diff --git a/README.md b/README.md
index a31c3321..913af8e4 100755
--- a/README.md
+++ b/README.md
@@ -141,6 +141,202 @@ let clearAllItem = RichEditorOptionItem(image: UIImage(named: "clear"), title: "
toolbar.options = [clearAllItem]
```
+Using RichEditorView in SwiftUI
+--------------------
+
+`RichEditorView` can be easily integrated into your SwiftUI projects using the `SwiftUIRichEditor` and `SwiftUIRichEditorToolbar` wrappers.
+
+Start by creating a state object to manage the editor's content and properties.
+
+
+
+```swift
+import SwiftUI
+import RichEditorView
+
+class RichEditorState: ObservableObject {
+ @Published var htmlContent: String = ""
+ @Published var isEditing: Bool = false
+ @Published var editorHeight: CGFloat = 0
+
+ weak var editor: RichEditorView?
+}
+```
+
+Then, in your SwiftUI `View`, you can use `SwiftUIRichEditor` and `SwiftUIRichEditorToolbar` as follows:
+
+```swift
+import SwiftUI
+import RichEditorView
+
+struct ContentView: View {
+
+ // Rich text editor state management
+ @StateObject private var editorState = RichEditorState(
+ htmlContent: """
+
+ - This is the first line for testing styles.
+ - Bold this line.
+ - Make this line italic.
+ - Underline this one.
+ Apply a strikethrough here.
+ - This is for subscript test: H2O.
+ - And this is for superscript test: E=mc2.
+ - Let's test text color on this sentence.
+ - Now, let's try a background color.
+ Heading 1 will be applied here.
+ This should be Heading 2.
+ And here comes Heading 3.
+ Indent this paragraph.
+ - This is a standard line.
+ - This is the fifteenth item in our list.
+ - A slightly longer sentence to check wrapping and alignment.
+ Left align this text.
+ Center align this text.
+ Right align this text.
+ - Let's see how a hyperlink looks.
+ - This line contains some special characters: @#$%^&*().
+ - A sentence with multiple formats.
+ - The twenty-third line to test scrolling behavior.
+ - Almost there, just one more line to go.
+ - This is the final line for testing!
+
+ """
+ )
+
+ // State variables for ColorPicker
+ @State private var foregroundColor: Color = .black
+ @State private var highlightColor: Color = .white
+
+ // State variables to control color picker display
+ @State private var showTextColorPicker: Bool = false
+ @State private var showBackgroundColorPicker: Bool = false
+
+ // Toolbar options configuration - using all available options
+ private let toolbarOptions: [RichEditorDefaultOption] = RichEditorDefaultOption.all
+
+ var body: some View {
+ VStack(spacing: 0) {
+ // Toolbar section wrapped in VStack
+ VStack(spacing: 0) {
+ SwiftUIRichEditorToolbar(
+ options: toolbarOptions,
+ barTintColor: .systemBackground,
+ editor: editorState.editor,
+ onTextColorChange: {
+ // Show text color picker
+ showTextColorPicker = true
+ },
+ onBackgroundColorChange: {
+ // Show background color picker
+ showBackgroundColorPicker = true
+ },
+ onImageInsert: {
+ // Handle image insertion
+ print("Image insertion")
+ },
+ onLinkInsert: {
+ // Handle link insertion
+ print("Link insertion")
+ }
+ )
+ .frame(height: 44)
+ .background(
+ Rectangle()
+ .fill(Color(.systemBackground))
+ .overlay(
+ Rectangle()
+ .stroke(Color(.separator), lineWidth: 1)
+ )
+ )
+ }
+ .padding(.horizontal, 16)
+ .padding(.top, 8)
+ .zIndex(1) // Ensure toolbar is always on top
+
+ // Divider between toolbar and editor
+ Divider()
+ .padding(.horizontal, 16)
+
+ // Editor section wrapped in VStack
+ VStack(spacing: 0) {
+ SwiftUIRichEditor(
+ htmlContent: $editorState.htmlContent,
+ isEditing: $editorState.isEditing,
+ placeholder: "Enter content...",
+ isScrollEnabled: true,
+ editingEnabled: true,
+ backgroundColor: .systemGray6,
+ onContentChange: { content in
+ print("Content changed: \(content)")
+ },
+ onHeightChange: { height in
+ editorState.editorHeight = CGFloat(height)
+ },
+ onEditorReady: { richEditor in
+ editorState.editor = richEditor
+ }
+ )
+ .background(Color(.systemGray6))
+ .clipped() // Prevent content from overflowing its bounds
+ }
+ .padding(.horizontal, 16)
+ .padding(.bottom, 16)
+ .zIndex(0) // Ensure editor is below the toolbar
+ }
+ .ignoresSafeArea(.keyboard, edges: .bottom)
+ .onChange(of: foregroundColor) { newColor in
+ // Update editor text color when foregroundColor changes
+ editorState.editor?.setTextColor(UIColor(newColor))
+ }
+ .onChange(of: highlightColor) { newColor in
+ // Update editor text background color when highlightColor changes
+ editorState.editor?.setTextBackgroundColor(UIColor(newColor))
+ }
+ .sheet(isPresented: $showTextColorPicker) {
+ NavigationView {
+ VStack {
+ ColorPicker("Select Text Color", selection: $foregroundColor)
+ .padding()
+ Spacer()
+ }
+ .navigationTitle("Text Color")
+ .navigationBarTitleDisplayMode(.inline)
+ .toolbar {
+ ToolbarItem(placement: .navigationBarTrailing) {
+ Button("Done") {
+ showTextColorPicker = false
+ }
+ }
+ }
+ }
+ }
+ .sheet(isPresented: $showBackgroundColorPicker) {
+ NavigationView {
+ VStack {
+ ColorPicker("Select Background Color", selection: $highlightColor)
+ .padding()
+ Spacer()
+ }
+ .navigationTitle("Background Color")
+ .navigationBarTitleDisplayMode(.inline)
+ .toolbar {
+ ToolbarItem(placement: .navigationBarTrailing) {
+ Button("Done") {
+ showBackgroundColorPicker = false
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+#Preview {
+ ContentView()
+}
+```
+
Acknowledgements
----------------
diff --git a/RichEditorView/Sources/RichEditorState.swift b/RichEditorView/Sources/RichEditorState.swift
new file mode 100644
index 00000000..bb3a9118
--- /dev/null
+++ b/RichEditorView/Sources/RichEditorState.swift
@@ -0,0 +1,138 @@
+//
+// RichEditorState.swift
+// RichEditorView
+//
+// Created by yunning you on 2025/8/25.
+//
+
+import SwiftUI
+
+
+/// A state management class for the rich text editor, designed for use in SwiftUI environments.
+@available(iOS 13.0, *)
+public class RichEditorState: ObservableObject {
+
+ // MARK: - Published Properties
+
+ /// The HTML content of the editor.
+ @Published public var htmlContent: String
+
+ /// A boolean value indicating whether the editor is currently focused.
+ @Published public var isEditing: Bool = false
+
+ /// The dynamic height of the editor content.
+ @Published public var editorHeight: CGFloat = 200
+
+ // MARK: - Properties
+
+ /// A weak reference to the underlying RichEditorView instance.
+ public var editor: RichEditorView?
+
+ // MARK: - Initialization
+
+ /// Initializes the state with optional initial HTML content.
+ /// - Parameter htmlContent: The initial HTML content to load into the editor.
+ public init(htmlContent: String = "") {
+ self.htmlContent = htmlContent
+ }
+
+ // MARK: - Public Methods
+
+ /// Clears the content of the editor.
+ public func clearContent() {
+ htmlContent = ""
+ editor?.html = ""
+ }
+
+ /// Inserts sample HTML content into the editor for demonstration purposes.
+ public func insertSampleContent() {
+ let sampleHTML = """
+ Welcome to the Rich Editor
+ This is a powerful rich text editor that supports:
+
+ - Bold and italic text
+ - Underline and
strikethrough
+ - Multiple heading levels
+ - Ordered and unordered lists
+ - Text alignment
+ - Text and background colors
+
+ Start editing now!
+ """
+ htmlContent = sampleHTML
+ editor?.html = sampleHTML
+ }
+
+ /// Asynchronously retrieves the plain text content of the editor.
+ /// - Parameter completion: A closure that receives the plain text string.
+ public func getPlainText(completion: @escaping (String) -> Void) {
+ guard let editor = editor else {
+ completion("")
+ return
+ }
+ editor.getText { text in
+ completion(text)
+ }
+ }
+
+ /// Asynchronously retrieves content statistics, such as character and word counts.
+ /// - Parameter completion: A closure that receives the character count and word count.
+ public func getContentStats(completion: @escaping (Int, Int) -> Void) {
+ getPlainText { plainText in
+ let characters = plainText.count
+ let words = plainText.components(separatedBy: .whitespacesAndNewlines)
+ .filter { !$0.isEmpty }.count
+ completion(characters, words)
+ }
+ }
+
+ /// Saves the current HTML content to UserDefaults.
+ public func autoSave() {
+ UserDefaults.standard.set(htmlContent, forKey: "RichEditorAutoSave")
+ }
+
+ /// Restores the HTML content from UserDefaults if available.
+ public func restoreFromAutoSave() {
+ if let savedContent = UserDefaults.standard.string(forKey: "RichEditorAutoSave"),
+ !savedContent.isEmpty {
+ htmlContent = savedContent
+ editor?.html = savedContent
+ }
+ }
+
+ /// Saves the current HTML content to a file in the documents directory.
+ /// - Parameter filename: The name of the file to save the content to.
+ public func saveToFile(filename: String = "rich_editor_content.html") {
+ guard let documentsPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else {
+ print("Failed to access documents directory.")
+ return
+ }
+ let fileURL = documentsPath.appendingPathComponent(filename)
+
+ do {
+ try htmlContent.write(to: fileURL, atomically: true, encoding: .utf8)
+ print("Content successfully saved to: \(fileURL.path)")
+ } catch {
+ print("Failed to save content: \(error)")
+ }
+ }
+
+ /// Loads HTML content from a file in the documents directory.
+ /// - Parameter filename: The name of the file to load the content from.
+ public func loadFromFile(filename: String = "rich_editor_content.html") {
+ guard let documentsPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else {
+ print("Failed to access documents directory.")
+ return
+ }
+ let fileURL = documentsPath.appendingPathComponent(filename)
+
+ do {
+ let content = try String(contentsOf: fileURL, encoding: .utf8)
+ htmlContent = content
+ editor?.html = content
+ print("Content successfully loaded from file.")
+ } catch {
+ print("Failed to load content: \(error)")
+ }
+ }
+}
diff --git a/RichEditorView/Sources/SwiftUIRichEditor.swift b/RichEditorView/Sources/SwiftUIRichEditor.swift
new file mode 100644
index 00000000..fa1468be
--- /dev/null
+++ b/RichEditorView/Sources/SwiftUIRichEditor.swift
@@ -0,0 +1,272 @@
+//
+// SwiftUIRichEditor.swift
+// RichEditorView
+//
+// Created by SwiftUI Integration
+//
+
+import SwiftUI
+import UIKit
+
+// MARK: - SwiftUI包装器
+
+/// SwiftUI版本的富文本编辑器
+/// 支持独立使用或与工具栏配合使用
+@available(iOS 13.0, *)
+public struct SwiftUIRichEditor: UIViewRepresentable {
+
+ // MARK: - 绑定属性
+ @Binding private var htmlContent: String
+ @Binding private var isEditing: Bool
+
+ // MARK: - 配置属性
+ private let placeholder: String
+ private let isScrollEnabled: Bool
+ private let editingEnabled: Bool
+ private let backgroundColor: UIColor
+ private let onContentChange: ((String) -> Void)?
+ private let onHeightChange: ((Int) -> Void)?
+ private let onFocusChange: ((Bool) -> Void)?
+ private let onEditorReady: ((RichEditorView) -> Void)?
+
+ // MARK: - 初始化器
+
+ /// 基本初始化器
+ /// - Parameters:
+ /// - htmlContent: HTML内容的绑定
+ /// - isEditing: 编辑状态的绑定
+ /// - placeholder: 占位符文本
+ /// - isScrollEnabled: 是否允许滚动
+ /// - editingEnabled: 是否允许编辑
+ /// - backgroundColor: 背景颜色
+ /// - onContentChange: 内容变化回调
+ /// - onHeightChange: 高度变化回调
+ /// - onFocusChange: 焦点变化回调
+ /// - onEditorReady: 编辑器准备就绪回调
+ public init(
+ htmlContent: Binding,
+ isEditing: Binding = .constant(false),
+ placeholder: String = "请输入内容...",
+ isScrollEnabled: Bool = true,
+ editingEnabled: Bool = true,
+ backgroundColor: UIColor = .systemBackground,
+ onContentChange: ((String) -> Void)? = nil,
+ onHeightChange: ((Int) -> Void)? = nil,
+ onFocusChange: ((Bool) -> Void)? = nil,
+ onEditorReady: ((RichEditorView) -> Void)? = nil
+ ) {
+ self._htmlContent = htmlContent
+ self._isEditing = isEditing
+ self.placeholder = placeholder
+ self.isScrollEnabled = isScrollEnabled
+ self.editingEnabled = editingEnabled
+ self.backgroundColor = backgroundColor
+ self.onContentChange = onContentChange
+ self.onHeightChange = onHeightChange
+ self.onFocusChange = onFocusChange
+ self.onEditorReady = onEditorReady
+ }
+
+ // MARK: - UIViewRepresentable实现
+
+ public func makeCoordinator() -> Coordinator {
+ Coordinator(self)
+ }
+
+ public func makeUIView(context: Context) -> RichEditorView {
+ let editor = RichEditorView()
+
+ // 基本配置
+ editor.delegate = context.coordinator
+ editor.placeholder = placeholder
+ editor.isScrollEnabled = isScrollEnabled
+ editor.editingEnabled = editingEnabled
+ editor.setEditorBackgroundColor(backgroundColor)
+
+ // 设置初始内容
+ if !htmlContent.isEmpty {
+ editor.html = htmlContent
+ }
+
+ // 通知编辑器已准备就绪
+ onEditorReady?(editor)
+
+ return editor
+ }
+
+ public func updateUIView(_ uiView: RichEditorView, context: Context) {
+ // 更新内容(避免循环更新)
+ if uiView.contentHTML != htmlContent {
+ uiView.html = htmlContent
+ }
+
+ // 更新编辑状态
+ if uiView.editingEnabled != editingEnabled {
+ uiView.editingEnabled = editingEnabled
+ }
+
+ // 更新占位符
+ if uiView.placeholder != placeholder {
+ uiView.placeholder = placeholder
+ }
+ }
+}
+
+// MARK: - Coordinator
+@available(iOS 13.0, *)
+extension SwiftUIRichEditor {
+ public class Coordinator: NSObject, RichEditorDelegate {
+ var parent: SwiftUIRichEditor
+
+ init(_ parent: SwiftUIRichEditor) {
+ self.parent = parent
+ }
+
+ // MARK: - RichEditorDelegate方法
+
+ public func richEditor(_ editor: RichEditorView, contentDidChange content: String) {
+ // 更新绑定的HTML内容
+ DispatchQueue.main.async {
+ self.parent.htmlContent = content
+ self.parent.onContentChange?(content)
+ }
+ }
+
+ public func richEditor(_ editor: RichEditorView, heightDidChange height: Int) {
+ DispatchQueue.main.async {
+ self.parent.onHeightChange?(height)
+ }
+ }
+
+ public func richEditorTookFocus(_ editor: RichEditorView) {
+ DispatchQueue.main.async {
+ self.parent.isEditing = true
+ self.parent.onFocusChange?(true)
+ }
+ }
+
+ public func richEditorLostFocus(_ editor: RichEditorView) {
+ DispatchQueue.main.async {
+ self.parent.isEditing = false
+ self.parent.onFocusChange?(false)
+ }
+ }
+
+ public func richEditorDidLoad(_ editor: RichEditorView) {
+ // 编辑器加载完成
+ }
+
+ public func richEditor(_ editor: RichEditorView, shouldInteractWith url: URL) -> Bool {
+ return true
+ }
+
+ public func richEditor(_ editor: RichEditorView, handle action: String) {
+ // 处理自定义操作
+ }
+ }
+}
+
+// MARK: - SwiftUI工具栏包装器
+
+/// SwiftUI版本的富文本编辑器工具栏
+@available(iOS 13.0, *)
+public struct SwiftUIRichEditorToolbar: UIViewRepresentable {
+
+ // MARK: - 属性
+ private let options: [RichEditorOption]
+ private let barTintColor: UIColor?
+ private weak var editor: RichEditorView?
+ private let onTextColorChange: (() -> Void)?
+ private let onBackgroundColorChange: (() -> Void)?
+ private let onImageInsert: (() -> Void)?
+ private let onLinkInsert: (() -> Void)?
+
+ // MARK: - 初始化器
+
+ /// 初始化工具栏
+ /// - Parameters:
+ /// - options: 工具栏选项数组
+ /// - barTintColor: 工具栏背景色
+ /// - editor: 关联的编辑器
+ /// - onTextColorChange: 文字颜色变化回调
+ /// - onBackgroundColorChange: 背景颜色变化回调
+ /// - onImageInsert: 图片插入回调
+ /// - onLinkInsert: 链接插入回调
+ public init(
+ options: [RichEditorOption] = RichEditorDefaultOption.all,
+ barTintColor: UIColor? = nil,
+ editor: RichEditorView? = nil,
+ onTextColorChange: (() -> Void)? = nil,
+ onBackgroundColorChange: (() -> Void)? = nil,
+ onImageInsert: (() -> Void)? = nil,
+ onLinkInsert: (() -> Void)? = nil
+ ) {
+ self.options = options
+ self.barTintColor = barTintColor
+ self.editor = editor
+ self.onTextColorChange = onTextColorChange
+ self.onBackgroundColorChange = onBackgroundColorChange
+ self.onImageInsert = onImageInsert
+ self.onLinkInsert = onLinkInsert
+ }
+
+ // MARK: - UIViewRepresentable实现
+
+ public func makeCoordinator() -> ToolbarCoordinator {
+ ToolbarCoordinator(self)
+ }
+
+ public func makeUIView(context: Context) -> RichEditorToolbar {
+ let toolbar = RichEditorToolbar()
+ toolbar.options = options
+ toolbar.delegate = context.coordinator
+ toolbar.editor = editor
+
+ if let barTintColor = barTintColor {
+ toolbar.barTintColor = barTintColor
+ }
+
+ return toolbar
+ }
+
+ public func updateUIView(_ uiView: RichEditorToolbar, context: Context) {
+ uiView.options = options
+ uiView.editor = editor
+
+ if let barTintColor = barTintColor {
+ uiView.barTintColor = barTintColor
+ }
+ }
+}
+
+// MARK: - 工具栏Coordinator
+
+@available(iOS 13.0, *)
+extension SwiftUIRichEditorToolbar {
+ public class ToolbarCoordinator: NSObject, RichEditorToolbarDelegate {
+ var parent: SwiftUIRichEditorToolbar
+
+ init(_ parent: SwiftUIRichEditorToolbar) {
+ self.parent = parent
+ }
+
+ // MARK: - RichEditorToolbarDelegate方法
+
+ public func richEditorToolbarChangeTextColor(_ toolbar: RichEditorToolbar) {
+ parent.onTextColorChange?()
+ }
+
+ public func richEditorToolbarChangeBackgroundColor(_ toolbar: RichEditorToolbar) {
+ parent.onBackgroundColorChange?()
+ }
+
+ public func richEditorToolbarInsertImage(_ toolbar: RichEditorToolbar) {
+ parent.onImageInsert?()
+ }
+
+ public func richEditorToolbarInsertLink(_ toolbar: RichEditorToolbar) {
+ parent.onLinkInsert?()
+ }
+ }
+}
+
diff --git a/RichEditorViewSwiftUI/RichEditorViewSwiftUI.xcodeproj/project.pbxproj b/RichEditorViewSwiftUI/RichEditorViewSwiftUI.xcodeproj/project.pbxproj
new file mode 100644
index 00000000..7205b9d8
--- /dev/null
+++ b/RichEditorViewSwiftUI/RichEditorViewSwiftUI.xcodeproj/project.pbxproj
@@ -0,0 +1,600 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 77;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 7F7CAD2E2E61FEEA000492B0 /* RichEditorView in Frameworks */ = {isa = PBXBuildFile; productRef = 7F7CAD2D2E61FEEA000492B0 /* RichEditorView */; };
+ 7F7CAD892E620B47000492B0 /* RichEditorView in Frameworks */ = {isa = PBXBuildFile; productRef = 7F7CAD882E620B47000492B0 /* RichEditorView */; };
+ 7F9E9BAB2E5B802B004AD074 /* RichEditorView in Frameworks */ = {isa = PBXBuildFile; productRef = 7F9E9BAA2E5B802B004AD074 /* RichEditorView */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 7F9E9B8D2E5B7FCF004AD074 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 7F9E9B772E5B7FCE004AD074 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 7F9E9B7E2E5B7FCE004AD074;
+ remoteInfo = RichEditorViewSwiftUI;
+ };
+ 7F9E9B972E5B7FCF004AD074 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 7F9E9B772E5B7FCE004AD074 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 7F9E9B7E2E5B7FCE004AD074;
+ remoteInfo = RichEditorViewSwiftUI;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXFileReference section */
+ 7F9E9B7F2E5B7FCE004AD074 /* RichEditorViewSwiftUI.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RichEditorViewSwiftUI.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 7F9E9B8C2E5B7FCF004AD074 /* RichEditorViewSwiftUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RichEditorViewSwiftUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+ 7F9E9B962E5B7FCF004AD074 /* RichEditorViewSwiftUIUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RichEditorViewSwiftUIUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFileSystemSynchronizedRootGroup section */
+ 7F9E9B812E5B7FCE004AD074 /* RichEditorViewSwiftUI */ = {
+ isa = PBXFileSystemSynchronizedRootGroup;
+ path = RichEditorViewSwiftUI;
+ sourceTree = "";
+ };
+ 7F9E9B8F2E5B7FCF004AD074 /* RichEditorViewSwiftUITests */ = {
+ isa = PBXFileSystemSynchronizedRootGroup;
+ path = RichEditorViewSwiftUITests;
+ sourceTree = "";
+ };
+ 7F9E9B992E5B7FCF004AD074 /* RichEditorViewSwiftUIUITests */ = {
+ isa = PBXFileSystemSynchronizedRootGroup;
+ path = RichEditorViewSwiftUIUITests;
+ sourceTree = "";
+ };
+/* End PBXFileSystemSynchronizedRootGroup section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 7F9E9B7C2E5B7FCE004AD074 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 7F7CAD2E2E61FEEA000492B0 /* RichEditorView in Frameworks */,
+ 7F7CAD892E620B47000492B0 /* RichEditorView in Frameworks */,
+ 7F9E9BAB2E5B802B004AD074 /* RichEditorView in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 7F9E9B892E5B7FCF004AD074 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 7F9E9B932E5B7FCF004AD074 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 7F9E9B762E5B7FCE004AD074 = {
+ isa = PBXGroup;
+ children = (
+ 7F9E9B812E5B7FCE004AD074 /* RichEditorViewSwiftUI */,
+ 7F9E9B8F2E5B7FCF004AD074 /* RichEditorViewSwiftUITests */,
+ 7F9E9B992E5B7FCF004AD074 /* RichEditorViewSwiftUIUITests */,
+ 7F9E9B802E5B7FCE004AD074 /* Products */,
+ );
+ sourceTree = "";
+ };
+ 7F9E9B802E5B7FCE004AD074 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 7F9E9B7F2E5B7FCE004AD074 /* RichEditorViewSwiftUI.app */,
+ 7F9E9B8C2E5B7FCF004AD074 /* RichEditorViewSwiftUITests.xctest */,
+ 7F9E9B962E5B7FCF004AD074 /* RichEditorViewSwiftUIUITests.xctest */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 7F9E9B7E2E5B7FCE004AD074 /* RichEditorViewSwiftUI */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 7F9E9BA02E5B7FCF004AD074 /* Build configuration list for PBXNativeTarget "RichEditorViewSwiftUI" */;
+ buildPhases = (
+ 7F9E9B7B2E5B7FCE004AD074 /* Sources */,
+ 7F9E9B7C2E5B7FCE004AD074 /* Frameworks */,
+ 7F9E9B7D2E5B7FCE004AD074 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ fileSystemSynchronizedGroups = (
+ 7F9E9B812E5B7FCE004AD074 /* RichEditorViewSwiftUI */,
+ );
+ name = RichEditorViewSwiftUI;
+ packageProductDependencies = (
+ 7F9E9BAA2E5B802B004AD074 /* RichEditorView */,
+ 7F7CAD2D2E61FEEA000492B0 /* RichEditorView */,
+ 7F7CAD882E620B47000492B0 /* RichEditorView */,
+ );
+ productName = RichEditorViewSwiftUI;
+ productReference = 7F9E9B7F2E5B7FCE004AD074 /* RichEditorViewSwiftUI.app */;
+ productType = "com.apple.product-type.application";
+ };
+ 7F9E9B8B2E5B7FCF004AD074 /* RichEditorViewSwiftUITests */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 7F9E9BA32E5B7FCF004AD074 /* Build configuration list for PBXNativeTarget "RichEditorViewSwiftUITests" */;
+ buildPhases = (
+ 7F9E9B882E5B7FCF004AD074 /* Sources */,
+ 7F9E9B892E5B7FCF004AD074 /* Frameworks */,
+ 7F9E9B8A2E5B7FCF004AD074 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 7F9E9B8E2E5B7FCF004AD074 /* PBXTargetDependency */,
+ );
+ fileSystemSynchronizedGroups = (
+ 7F9E9B8F2E5B7FCF004AD074 /* RichEditorViewSwiftUITests */,
+ );
+ name = RichEditorViewSwiftUITests;
+ packageProductDependencies = (
+ );
+ productName = RichEditorViewSwiftUITests;
+ productReference = 7F9E9B8C2E5B7FCF004AD074 /* RichEditorViewSwiftUITests.xctest */;
+ productType = "com.apple.product-type.bundle.unit-test";
+ };
+ 7F9E9B952E5B7FCF004AD074 /* RichEditorViewSwiftUIUITests */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 7F9E9BA62E5B7FCF004AD074 /* Build configuration list for PBXNativeTarget "RichEditorViewSwiftUIUITests" */;
+ buildPhases = (
+ 7F9E9B922E5B7FCF004AD074 /* Sources */,
+ 7F9E9B932E5B7FCF004AD074 /* Frameworks */,
+ 7F9E9B942E5B7FCF004AD074 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 7F9E9B982E5B7FCF004AD074 /* PBXTargetDependency */,
+ );
+ fileSystemSynchronizedGroups = (
+ 7F9E9B992E5B7FCF004AD074 /* RichEditorViewSwiftUIUITests */,
+ );
+ name = RichEditorViewSwiftUIUITests;
+ packageProductDependencies = (
+ );
+ productName = RichEditorViewSwiftUIUITests;
+ productReference = 7F9E9B962E5B7FCF004AD074 /* RichEditorViewSwiftUIUITests.xctest */;
+ productType = "com.apple.product-type.bundle.ui-testing";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 7F9E9B772E5B7FCE004AD074 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ BuildIndependentTargetsInParallel = 1;
+ LastSwiftUpdateCheck = 1640;
+ LastUpgradeCheck = 1640;
+ TargetAttributes = {
+ 7F9E9B7E2E5B7FCE004AD074 = {
+ CreatedOnToolsVersion = 16.4;
+ };
+ 7F9E9B8B2E5B7FCF004AD074 = {
+ CreatedOnToolsVersion = 16.4;
+ TestTargetID = 7F9E9B7E2E5B7FCE004AD074;
+ };
+ 7F9E9B952E5B7FCF004AD074 = {
+ CreatedOnToolsVersion = 16.4;
+ TestTargetID = 7F9E9B7E2E5B7FCE004AD074;
+ };
+ };
+ };
+ buildConfigurationList = 7F9E9B7A2E5B7FCE004AD074 /* Build configuration list for PBXProject "RichEditorViewSwiftUI" */;
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 7F9E9B762E5B7FCE004AD074;
+ minimizedProjectReferenceProxies = 1;
+ packageReferences = (
+ 7F7CAD872E620B47000492B0 /* XCLocalSwiftPackageReference "../../RichEditorView" */,
+ );
+ preferredProjectObjectVersion = 77;
+ productRefGroup = 7F9E9B802E5B7FCE004AD074 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 7F9E9B7E2E5B7FCE004AD074 /* RichEditorViewSwiftUI */,
+ 7F9E9B8B2E5B7FCF004AD074 /* RichEditorViewSwiftUITests */,
+ 7F9E9B952E5B7FCF004AD074 /* RichEditorViewSwiftUIUITests */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 7F9E9B7D2E5B7FCE004AD074 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 7F9E9B8A2E5B7FCF004AD074 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 7F9E9B942E5B7FCF004AD074 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 7F9E9B7B2E5B7FCE004AD074 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 7F9E9B882E5B7FCF004AD074 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 7F9E9B922E5B7FCF004AD074 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 7F9E9B8E2E5B7FCF004AD074 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 7F9E9B7E2E5B7FCE004AD074 /* RichEditorViewSwiftUI */;
+ targetProxy = 7F9E9B8D2E5B7FCF004AD074 /* PBXContainerItemProxy */;
+ };
+ 7F9E9B982E5B7FCF004AD074 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 7F9E9B7E2E5B7FCE004AD074 /* RichEditorViewSwiftUI */;
+ targetProxy = 7F9E9B972E5B7FCF004AD074 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin XCBuildConfiguration section */
+ 7F9E9B9E2E5B7FCF004AD074 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ DEVELOPMENT_TEAM = T5WWP2Z4XN;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu17;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 18.5;
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+ MTL_FAST_MATH = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ };
+ name = Debug;
+ };
+ 7F9E9B9F2E5B7FCF004AD074 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ DEVELOPMENT_TEAM = T5WWP2Z4XN;
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu17;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 18.5;
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ MTL_FAST_MATH = YES;
+ SDKROOT = iphoneos;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+ 7F9E9BA12E5B7FCF004AD074 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_TEAM = T5WWP2Z4XN;
+ ENABLE_PREVIEWS = YES;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
+ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+ INFOPLIST_KEY_UILaunchScreen_Generation = YES;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.ites.easumerebuild4.RichEditorViewSwiftUI;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 7F9E9BA22E5B7FCF004AD074 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_TEAM = T5WWP2Z4XN;
+ ENABLE_PREVIEWS = YES;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
+ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+ INFOPLIST_KEY_UILaunchScreen_Generation = YES;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.ites.easumerebuild4.RichEditorViewSwiftUI;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Release;
+ };
+ 7F9E9BA42E5B7FCF004AD074 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_TEAM = T5WWP2Z4XN;
+ GENERATE_INFOPLIST_FILE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 18.5;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.ites.easumerebuild4.RichEditorViewSwiftUITests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_EMIT_LOC_STRINGS = NO;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/RichEditorViewSwiftUI.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/RichEditorViewSwiftUI";
+ };
+ name = Debug;
+ };
+ 7F9E9BA52E5B7FCF004AD074 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_TEAM = T5WWP2Z4XN;
+ GENERATE_INFOPLIST_FILE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 18.5;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.ites.easumerebuild4.RichEditorViewSwiftUITests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_EMIT_LOC_STRINGS = NO;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/RichEditorViewSwiftUI.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/RichEditorViewSwiftUI";
+ };
+ name = Release;
+ };
+ 7F9E9BA72E5B7FCF004AD074 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_TEAM = T5WWP2Z4XN;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.ites.easumerebuild4.RichEditorViewSwiftUIUITests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_EMIT_LOC_STRINGS = NO;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ TEST_TARGET_NAME = RichEditorViewSwiftUI;
+ };
+ name = Debug;
+ };
+ 7F9E9BA82E5B7FCF004AD074 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_TEAM = T5WWP2Z4XN;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.ites.easumerebuild4.RichEditorViewSwiftUIUITests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_EMIT_LOC_STRINGS = NO;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ TEST_TARGET_NAME = RichEditorViewSwiftUI;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 7F9E9B7A2E5B7FCE004AD074 /* Build configuration list for PBXProject "RichEditorViewSwiftUI" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 7F9E9B9E2E5B7FCF004AD074 /* Debug */,
+ 7F9E9B9F2E5B7FCF004AD074 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 7F9E9BA02E5B7FCF004AD074 /* Build configuration list for PBXNativeTarget "RichEditorViewSwiftUI" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 7F9E9BA12E5B7FCF004AD074 /* Debug */,
+ 7F9E9BA22E5B7FCF004AD074 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 7F9E9BA32E5B7FCF004AD074 /* Build configuration list for PBXNativeTarget "RichEditorViewSwiftUITests" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 7F9E9BA42E5B7FCF004AD074 /* Debug */,
+ 7F9E9BA52E5B7FCF004AD074 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 7F9E9BA62E5B7FCF004AD074 /* Build configuration list for PBXNativeTarget "RichEditorViewSwiftUIUITests" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 7F9E9BA72E5B7FCF004AD074 /* Debug */,
+ 7F9E9BA82E5B7FCF004AD074 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+
+/* Begin XCLocalSwiftPackageReference section */
+ 7F7CAD872E620B47000492B0 /* XCLocalSwiftPackageReference "../../RichEditorView" */ = {
+ isa = XCLocalSwiftPackageReference;
+ relativePath = ../../RichEditorView;
+ };
+/* End XCLocalSwiftPackageReference section */
+
+/* Begin XCSwiftPackageProductDependency section */
+ 7F7CAD2D2E61FEEA000492B0 /* RichEditorView */ = {
+ isa = XCSwiftPackageProductDependency;
+ productName = RichEditorView;
+ };
+ 7F7CAD882E620B47000492B0 /* RichEditorView */ = {
+ isa = XCSwiftPackageProductDependency;
+ productName = RichEditorView;
+ };
+ 7F9E9BAA2E5B802B004AD074 /* RichEditorView */ = {
+ isa = XCSwiftPackageProductDependency;
+ productName = RichEditorView;
+ };
+/* End XCSwiftPackageProductDependency section */
+ };
+ rootObject = 7F9E9B772E5B7FCE004AD074 /* Project object */;
+}
diff --git a/RichEditorViewSwiftUI/RichEditorViewSwiftUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/RichEditorViewSwiftUI/RichEditorViewSwiftUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 00000000..919434a6
--- /dev/null
+++ b/RichEditorViewSwiftUI/RichEditorViewSwiftUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/RichEditorViewSwiftUI/RichEditorViewSwiftUI/Assets.xcassets/AccentColor.colorset/Contents.json b/RichEditorViewSwiftUI/RichEditorViewSwiftUI/Assets.xcassets/AccentColor.colorset/Contents.json
new file mode 100644
index 00000000..eb878970
--- /dev/null
+++ b/RichEditorViewSwiftUI/RichEditorViewSwiftUI/Assets.xcassets/AccentColor.colorset/Contents.json
@@ -0,0 +1,11 @@
+{
+ "colors" : [
+ {
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/RichEditorViewSwiftUI/RichEditorViewSwiftUI/Assets.xcassets/AppIcon.appiconset/Contents.json b/RichEditorViewSwiftUI/RichEditorViewSwiftUI/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 00000000..23058801
--- /dev/null
+++ b/RichEditorViewSwiftUI/RichEditorViewSwiftUI/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,35 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "platform" : "ios",
+ "size" : "1024x1024"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "idiom" : "universal",
+ "platform" : "ios",
+ "size" : "1024x1024"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "tinted"
+ }
+ ],
+ "idiom" : "universal",
+ "platform" : "ios",
+ "size" : "1024x1024"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/RichEditorViewSwiftUI/RichEditorViewSwiftUI/Assets.xcassets/Contents.json b/RichEditorViewSwiftUI/RichEditorViewSwiftUI/Assets.xcassets/Contents.json
new file mode 100644
index 00000000..73c00596
--- /dev/null
+++ b/RichEditorViewSwiftUI/RichEditorViewSwiftUI/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/RichEditorViewSwiftUI/RichEditorViewSwiftUI/ContentView.swift b/RichEditorViewSwiftUI/RichEditorViewSwiftUI/ContentView.swift
new file mode 100644
index 00000000..8d67ec41
--- /dev/null
+++ b/RichEditorViewSwiftUI/RichEditorViewSwiftUI/ContentView.swift
@@ -0,0 +1,176 @@
+//
+// ContentView.swift
+// RichEditorViewSwiftUI
+//
+// Created by yunning you on 2025/8/25.
+//
+
+import SwiftUI
+import RichEditorView
+
+struct ContentView: View {
+
+ // Rich text editor state management
+ @StateObject private var editorState = RichEditorState(
+ htmlContent: """
+
+ - This is the first line for testing styles.
+ - Bold this line.
+ - Make this line italic.
+ - Underline this one.
+ Apply a strikethrough here.
+ - This is for subscript test: H2O.
+ - And this is for superscript test: E=mc2.
+ - Let's test text color on this sentence.
+ - Now, let's try a background color.
+ Heading 1 will be applied here.
+ This should be Heading 2.
+ And here comes Heading 3.
+ Indent this paragraph.
+ - This is a standard line.
+ - This is the fifteenth item in our list.
+ - A slightly longer sentence to check wrapping and alignment.
+ Left align this text.
+ Center align this text.
+ Right align this text.
+ - Let's see how a hyperlink looks.
+ - This line contains some special characters: @#$%^&*().
+ - A sentence with multiple formats.
+ - The twenty-third line to test scrolling behavior.
+ - Almost there, just one more line to go.
+ - This is the final line for testing!
+
+ """
+ )
+
+ // State variables for ColorPicker
+ @State private var foregroundColor: Color = .black
+ @State private var highlightColor: Color = .white
+
+ // State variables to control color picker display
+ @State private var showTextColorPicker: Bool = false
+ @State private var showBackgroundColorPicker: Bool = false
+
+ // Toolbar options configuration - using all available options
+ private let toolbarOptions: [RichEditorDefaultOption] = RichEditorDefaultOption.all
+
+ var body: some View {
+ VStack(spacing: 0) {
+ // Toolbar section wrapped in VStack
+ VStack(spacing: 0) {
+ SwiftUIRichEditorToolbar(
+ options: toolbarOptions,
+ barTintColor: .systemBackground,
+ editor: editorState.editor,
+ onTextColorChange: {
+ // Show text color picker
+ showTextColorPicker = true
+ },
+ onBackgroundColorChange: {
+ // Show background color picker
+ showBackgroundColorPicker = true
+ },
+ onImageInsert: {
+ // Handle image insertion
+ print("Image insertion")
+ },
+ onLinkInsert: {
+ // Handle link insertion
+ print("Link insertion")
+ }
+ )
+ .frame(height: 44)
+ .background(
+ Rectangle()
+ .fill(Color(.systemBackground))
+ .overlay(
+ Rectangle()
+ .stroke(Color(.separator), lineWidth: 1)
+ )
+ )
+ }
+ .padding(.horizontal, 16)
+ .padding(.top, 8)
+ .zIndex(1) // Ensure toolbar is always on top
+
+ // Divider between toolbar and editor
+ Divider()
+ .padding(.horizontal, 16)
+
+ // Editor section wrapped in VStack
+ VStack(spacing: 0) {
+ SwiftUIRichEditor(
+ htmlContent: $editorState.htmlContent,
+ isEditing: $editorState.isEditing,
+ placeholder: "Enter content...",
+ isScrollEnabled: true,
+ editingEnabled: true,
+ backgroundColor: .systemGray6,
+ onContentChange: { content in
+ print("Content changed: \(content)")
+ },
+ onHeightChange: { height in
+ editorState.editorHeight = CGFloat(height)
+ },
+ onEditorReady: { richEditor in
+ editorState.editor = richEditor
+ }
+ )
+ .background(Color(.systemGray6))
+ .clipped() // Prevent content from overflowing its bounds
+ }
+ .padding(.horizontal, 16)
+ .padding(.bottom, 16)
+ .zIndex(0) // Ensure editor is below the toolbar
+ }
+ .ignoresSafeArea(.keyboard, edges: .bottom)
+ .onChange(of: foregroundColor) { newColor in
+ // Update editor text color when foregroundColor changes
+ editorState.editor?.setTextColor(UIColor(newColor))
+ }
+ .onChange(of: highlightColor) { newColor in
+ // Update editor text background color when highlightColor changes
+ editorState.editor?.setTextBackgroundColor(UIColor(newColor))
+ }
+ .sheet(isPresented: $showTextColorPicker) {
+ NavigationView {
+ VStack {
+ ColorPicker("Select Text Color", selection: $foregroundColor)
+ .padding()
+ Spacer()
+ }
+ .navigationTitle("Text Color")
+ .navigationBarTitleDisplayMode(.inline)
+ .toolbar {
+ ToolbarItem(placement: .navigationBarTrailing) {
+ Button("Done") {
+ showTextColorPicker = false
+ }
+ }
+ }
+ }
+ }
+ .sheet(isPresented: $showBackgroundColorPicker) {
+ NavigationView {
+ VStack {
+ ColorPicker("Select Background Color", selection: $highlightColor)
+ .padding()
+ Spacer()
+ }
+ .navigationTitle("Background Color")
+ .navigationBarTitleDisplayMode(.inline)
+ .toolbar {
+ ToolbarItem(placement: .navigationBarTrailing) {
+ Button("Done") {
+ showBackgroundColorPicker = false
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+#Preview {
+ ContentView()
+}
diff --git a/RichEditorViewSwiftUI/RichEditorViewSwiftUI/RichEditorViewSwiftUIApp.swift b/RichEditorViewSwiftUI/RichEditorViewSwiftUI/RichEditorViewSwiftUIApp.swift
new file mode 100644
index 00000000..6dd797aa
--- /dev/null
+++ b/RichEditorViewSwiftUI/RichEditorViewSwiftUI/RichEditorViewSwiftUIApp.swift
@@ -0,0 +1,17 @@
+//
+// RichEditorViewSwiftUIApp.swift
+// RichEditorViewSwiftUI
+//
+// Created by yunning you on 2025/8/25.
+//
+
+import SwiftUI
+
+@main
+struct RichEditorViewSwiftUIApp: App {
+ var body: some Scene {
+ WindowGroup {
+ ContentView()
+ }
+ }
+}
diff --git a/RichEditorViewSwiftUI/RichEditorViewSwiftUITests/RichEditorViewSwiftUITests.swift b/RichEditorViewSwiftUI/RichEditorViewSwiftUITests/RichEditorViewSwiftUITests.swift
new file mode 100644
index 00000000..a9a8b01f
--- /dev/null
+++ b/RichEditorViewSwiftUI/RichEditorViewSwiftUITests/RichEditorViewSwiftUITests.swift
@@ -0,0 +1,36 @@
+//
+// RichEditorViewSwiftUITests.swift
+// RichEditorViewSwiftUITests
+//
+// Created by yunning you on 2025/8/25.
+//
+
+import XCTest
+@testable import RichEditorViewSwiftUI
+
+final class RichEditorViewSwiftUITests: XCTestCase {
+
+ override func setUpWithError() throws {
+ // Put setup code here. This method is called before the invocation of each test method in the class.
+ }
+
+ override func tearDownWithError() throws {
+ // Put teardown code here. This method is called after the invocation of each test method in the class.
+ }
+
+ func testExample() throws {
+ // This is an example of a functional test case.
+ // Use XCTAssert and related functions to verify your tests produce the correct results.
+ // Any test you write for XCTest can be annotated as throws and async.
+ // Mark your test throws to produce an unexpected failure when your test encounters an uncaught error.
+ // Mark your test async to allow awaiting for asynchronous code to complete. Check the results with assertions afterwards.
+ }
+
+ func testPerformanceExample() throws {
+ // This is an example of a performance test case.
+ self.measure {
+ // Put the code you want to measure the time of here.
+ }
+ }
+
+}
diff --git a/RichEditorViewSwiftUI/RichEditorViewSwiftUIUITests/RichEditorViewSwiftUIUITests.swift b/RichEditorViewSwiftUI/RichEditorViewSwiftUIUITests/RichEditorViewSwiftUIUITests.swift
new file mode 100644
index 00000000..f71da156
--- /dev/null
+++ b/RichEditorViewSwiftUI/RichEditorViewSwiftUIUITests/RichEditorViewSwiftUIUITests.swift
@@ -0,0 +1,41 @@
+//
+// RichEditorViewSwiftUIUITests.swift
+// RichEditorViewSwiftUIUITests
+//
+// Created by yunning you on 2025/8/25.
+//
+
+import XCTest
+
+final class RichEditorViewSwiftUIUITests: XCTestCase {
+
+ override func setUpWithError() throws {
+ // Put setup code here. This method is called before the invocation of each test method in the class.
+
+ // In UI tests it is usually best to stop immediately when a failure occurs.
+ continueAfterFailure = false
+
+ // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
+ }
+
+ override func tearDownWithError() throws {
+ // Put teardown code here. This method is called after the invocation of each test method in the class.
+ }
+
+ @MainActor
+ func testExample() throws {
+ // UI tests must launch the application that they test.
+ let app = XCUIApplication()
+ app.launch()
+
+ // Use XCTAssert and related functions to verify your tests produce the correct results.
+ }
+
+ @MainActor
+ func testLaunchPerformance() throws {
+ // This measures how long it takes to launch your application.
+ measure(metrics: [XCTApplicationLaunchMetric()]) {
+ XCUIApplication().launch()
+ }
+ }
+}
diff --git a/RichEditorViewSwiftUI/RichEditorViewSwiftUIUITests/RichEditorViewSwiftUIUITestsLaunchTests.swift b/RichEditorViewSwiftUI/RichEditorViewSwiftUIUITests/RichEditorViewSwiftUIUITestsLaunchTests.swift
new file mode 100644
index 00000000..6d31ff2c
--- /dev/null
+++ b/RichEditorViewSwiftUI/RichEditorViewSwiftUIUITests/RichEditorViewSwiftUIUITestsLaunchTests.swift
@@ -0,0 +1,33 @@
+//
+// RichEditorViewSwiftUIUITestsLaunchTests.swift
+// RichEditorViewSwiftUIUITests
+//
+// Created by yunning you on 2025/8/25.
+//
+
+import XCTest
+
+final class RichEditorViewSwiftUIUITestsLaunchTests: XCTestCase {
+
+ override class var runsForEachTargetApplicationUIConfiguration: Bool {
+ true
+ }
+
+ override func setUpWithError() throws {
+ continueAfterFailure = false
+ }
+
+ @MainActor
+ func testLaunch() throws {
+ let app = XCUIApplication()
+ app.launch()
+
+ // Insert steps here to perform after app launch but before taking a screenshot,
+ // such as logging into a test account or navigating somewhere in the app
+
+ let attachment = XCTAttachment(screenshot: app.screenshot())
+ attachment.name = "Launch Screen"
+ attachment.lifetime = .keepAlways
+ add(attachment)
+ }
+}
diff --git a/art/SwiftUI.jpg b/art/SwiftUI.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..11174fb3677038cf4e9bd07780e91a8f8479e6c2
GIT binary patch
literal 366509
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 0jR=&{%ITUzib
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 |