概览
变更日志
功能
- Markdown 解析
- 斜体
- 粗体
- 标题
- 引用
- 列表
- 代码
- 语法
- 链接
- 图片
- 带有 Markdown 格式的 UITextView
- 带有 Markdown 格式的 UILabel
- 平台支持
- iOS
- macOS
- tvOS
- watchOS
- 文档
要求
- iOS 10.0+ / macOS 10.12+ / tvOS 10.0+ / watchOS 3.0+
- Swift 5.3+
安装
CocoaPods
CocoaPods 是 Cocoa 项目的依赖管理器。有关使用和安装说明,请访问他们的网站。要将 CDMarkdownKit 集成到您的 Xcode 项目中,请使用 CocoaPods,并在您的 Podfile
中指定它。
pod 'CDMarkdownKit', '2.5.1'
Carthage
Carthage 是一个去中心化的依赖管理器,它会构建您的依赖并提供二进制框架。要将 CDMarkdownKit 集成到您的 Xcode 项目中,请使用 Carthage,并在您的 Cartfile
中指定它。
github "chrisdhaan/CDMarkdownKit" == 2.5.1
Swift Package Manager
Swift Package Manager 是一个用于自动分发 Swift 代码的工具,它集成到 swift
编译器中。
一旦您已设置好 Swift 包,将 CDMarkdownKit 作为依赖项添加就像将它添加到您的 Package.swift
的 dependencies
值一样简单。
dependencies: [
.package(url: "https://github.com/chrisdhaan/CDMarkdownKit.git", .upToNextMajor(from: "2.5.1"))
]
Git Submodule
如果您不愿使用上述任何依赖管理器,您可以将 CDMarkdownKit 手动集成到项目中。
- 在终端中,
cd
到您的顶级项目目录,然后运行以下命令(如果您的项目未初始化为 git 仓库)
$ git init
- 通过运行以下命令将 CDMarkdownKit 添加为 git 子模块
git submodule add https://github.com/chrisdhaan/CDMarkdownKit.git
-
打开新的
CDMarkdownKit
文件夹,并将CDMarkdownKit.xcodeproj
拖动到应用程序 Xcode 项目的 Project Navigator 中。它应该出现在您应用程序蓝色项目图标下面。它是否位于所有其他 Xcode 组的上方或下方无关紧要。
-
在 Project Navigator 中选择
CDMarkdownKit.xcodeproj
并验证部署目标是否与您的应用程序目标相匹配。 -
接下来,在项目导航器(蓝色项目图标)中选择您的应用程序项目,以导航到目标配置窗口,并在侧边栏的“目标”部分中选择应用程序目标。
-
在那个窗口的标签栏上,打开“常规”面板。
-
在“二进制文件”部分下点击
+
按钮。 -
您将看到两个不同的
CDMarkdownKit.xcodeproj
文件夹,每个文件夹都有两个不同的CDMarkdownKit.framework
版本嵌入在“Products”文件夹中。您可以选择哪个“Products”文件夹无关紧要,但选择顶层或底层的
CDMarkdownKit.framework
是很重要的。 -
选择顶层的
CDMarkdownKit.framework
用于 iOS,底层的用于 macOS。您可以通过检查项目的构建日志来验证您选择的版本。针对
CDMarkdownKit
的构建目标将被列为CDMarkdownKit iOS
、CDMarkdownKit macOS
、CDMarkdownKit tvOS
或CDMarkdownKit watchOS
。 -
就是这些!
CDMarkdownKit.framework
会自动添加为目标依赖项、链接框架和嵌入式框架,在复制文件构建阶段即可完成所有步骤,这样就可以在模拟器和设备上构建了。
贡献
在向 CDMarkdownKit 贡献之前,请阅读我们贡献指南中详细说明的说明。
使用方式
初始化
// Create parser
let markdownParser = CDMarkdownParser()
// Parse markdown
let markdown = "This *framework* helps **with** parsing `markdown`."
label.attributedText = markdownParser.parse(markdown)
自定义
// Create parser
let markdownParser = CDMarkdownParser(font: UIFont(name: "HelveticaNeue", size: 16),
boldFont: UIFont(name: "HelveticaNeue-Bold", size: 16),
italicFont: UIFont(name: "HelveticaNeue-Thin", size: 16),
fontColor: UIColor.darkGray,
backgroundColor: UIColor.lightGray,
squashNewlines: false)
// Customize elements
/// Bold
markdownParser.bold.color = UIColor.cyan
markdownParser.bold.backgroundColor = UIColor.purple
markdownParser.bold.underlineColor = UIColor.red
markdownParser.bold.underlineStyle = .double
/// Header
markdownParser.header.color = UIColor.black
markdownParser.header.backgroundColor = UIColor.orange
/// List
markdownParser.list.color = UIColor.black
markdownParser.list.backgroundColor = UIColor.red
/// Quote
markdownParser.quote.color = UIColor.gray
markdownParser.quote.backgroundColor = UIColor.clear
/// Link
markdownParser.link.color = UIColor.blue
markdownParser.link.backgroundColor = UIColor.green
let linkParagraphStyle = NSMutableParagraphStyle()
linkParagraphStyle.paragraphSpacing = 20
linkParagraphStyle.paragraphSpacingBefore = 0
linkParagraphStyle.lineSpacing = 20.38
markdownParser.link.paragraphStyle = linkParagraphStyle
markdownParser.automaticLink.color = UIColor.blue
markdownParser.automaticLink.backgroundColor = UIColor.green
/// Italic
markdownParser.italic.color = UIColor.gray
markdownParser.italic.backgroundColor = UIColor.clear
/// Code
markdownParser.code.font = UIFont.systemFont(ofSize: 17)
markdownParser.code.color = UIColor.red
markdownParser.code.backgroundColor = UIColor.black
/// Syntax
markdownParser.syntax.font = UIFont.systemFont(ofSize: 15)
markdownParser.syntax.color = UIColor.lightGray
markdownParser.syntax.backgroundColor = UIColor.black
/// Image
markdownParser.image.size = CGSize(width: 100,
height: 50)
/// Strikethrough
markdownParser.strikethrough.font = UIFont.systemFont(ofSize: 20)
markdownParser.strikethrough.color = UIColor.magenta
markdownParser.strikethrough.strikethroughColor = UIColor.darkGray
markdownParser.strikethrough.strikethroughStyle = .double
// Parse markdown
let markdown = "This *framework* helps **with** parsing `markdown`."
label.attributedText = markdownParser.parse(markdown)
支持的 Markdown 元素
*italic* or _italic_
**bold** or __bold__
# Header 1
## Header 2
### Header 3
#### Header 4
##### Header 5
###### Header 6
> Quote
* List
- List
+ List
`code`
```syntax```
[Link](url)

CDMarkdownTextView
建议以程序方式初始化任何CDMarkdownTextView对象,因为它使用自定义文本绘制对象来渲染属性字符串。
即使是通过故事板初始化,CDMarkdownTextView对象仍然可以渲染,但以下属性的默认行为将被覆盖
isScrollEnabled = true
isSelectable = false
isEditable = false
这些默认值设置为防止崩溃。但仍可能在通过故事板初始化CDMarkdownTextView对象时出现意外的崩溃。
程序示例
let rect = CGRect(x: 20,
y: 10,
width: CGFloat(self.frame.size.width - 40),
height: CGFloat(self.frame.size.height - 30))
/// Create custom text container
let textContainer = NSTextContainer(size: rect.size)
/// Create custom layout manager
let layoutManager = CDMarkdownLayoutManager()
layoutManager.addTextContainer(textContainer)
/// Initialization
let textView = CDMarkdownTextView(frame: rect,
textContainer: textContainer,
layoutManager: layoutManager)
textView.translatesAutoresizingMaskIntoConstraints = false
/// Standard markdown UI formatting
textView.roundCodeCorners = true
textView.roundSyntaxCorners = true
/// Custom markdown UI formatting
textView.roundAllCorners = true
/// Add constraints so intrinsic content size is set correctly
let topConstraint = NSLayoutConstraint(item: textView,
attribute: NSLayoutAttribute.top,
relatedBy: NSLayoutRelation.equal,
toItem: textView.superview,
attribute: NSLayoutAttribute.bottom,
multiplier: 1,
constant: 10)
let leadingConstraint = NSLayoutConstraint(item: textView,
attribute: NSLayoutAttribute.leading,
relatedBy: NSLayoutRelation.equal,
toItem: textView.superview,
attribute: NSLayoutAttribute.leadingMargin,
multiplier: 1,
constant: 0)
let trailingConstraint = NSLayoutConstraint(item: textView,
attribute: NSLayoutAttribute.trailing,
relatedBy: NSLayoutRelation.equal,
toItem: textView.superview,
attribute: NSLayoutAttribute.trailingMargin,
multiplier: 1,
constant: 0)
let bottomConstraint = NSLayoutConstraint(item: self.bottomLayoutGuide,
attribute: NSLayoutAttribute.top,
relatedBy: NSLayoutRelation.equal,
toItem: textView,
attribute: NSLayoutAttribute.bottom,
multiplier: 1,
constant: 20)
self.view.addConstraints([topConstraint,
leadingConstraint,
trailingConstraint,
bottomConstraint])
/// Add to view hierarchy
self.view.addSubview(textView)
故事板示例
/// Initialization
@IBOutlet fileprivate weak var textView: CDMarkdownTextView!
/// Standard markdown UI formatting
self.textView.roundCodeCorners = true
self.textView.roundSyntaxCorners = true
/// Custom markdown UI formatting
self.textView.roundAllCorners = true
CDMarkdownLabel
程序示例
let size = self.frame.size
let rect = CGRect(x: 10,
y: 10,
width: CGFloat(size.width - 20),
height: CGFloat(size.height - 20))
/// Initialization
let label = CDMarkdownLabel(frame: rect)
label.autoresizingMask = [.flexibleWidth, .flexibleHeight]
/// Standard markdown UI formatting
label.roundCodeCorners = true
label.roundSyntaxCorners = true
/// Custom markdown UI formatting
label.roundAllCorners = true
self.view.addSubview(label)
故事板示例
/// Initialization
@IBOutlet fileprivate weak var label: CDMarkdownLabel!
/// Standard markdown UI formatting
self.label.roundCodeCorners = true
self.label.roundSyntaxCorners = true
/// Custom markdown UI formatting
self.label.roundAllCorners = true
作者
Christopher de Haan, [email protected]
致谢
CDMarkdownKit受到了由Ivan Bruel开发的markdown解析库MarkdownKit的启发。
CDMarkdownKit增加了以下功能
- 固定标题元素解析
- 图像元素解析
- 删除线元素解析
- 可自定义所有元素的字体
- 可自定义所有元素的色彩
- 可自定义所有元素的背景色彩
- 可自定义所有元素的段落样式
- 可自定义所有元素的下划线色彩样式
- 可自定义所有元素的下划线样式
- 具有为代码、语法或所有元素圆角背景文字色彩角的UITextView功能
- 具有为代码、语法或所有元素圆角背景文字色彩角的UILabel功能
- 支持macOS、tvOS和watchOS
许可
CDMarkdownKit适用于MIT许可。有关更多信息,请参阅LICENSE文件。