测试已测试 | ✗ |
语语言 | SwiftSwift |
许可证 | MIT |
发布最后发布 | 2017年11月 |
SwiftSwift 版本 | 4.0 |
SPM支持 SPM | ✗ |
由 Jeff Hurray 维护。
![]() |
![]() |
![]() |
UILabel
和 UITextView
在文本选择方面的支持令人不满意。
现有的解决方案,如 TTTAttributedLabel 很棒,但提供的文本选择 API 相对有限。
从仓库中克隆并手动添加 /SelectableTextView 目录中的文件
import SelectableTextView
let textView = SelectableTextView()
textView.text = "Hello World!"
textView.truncationMode = .truncateTail
textView.alignment = .center
textView.numberOfLines = 1
let greetingValidator = MatchesTextValidator(text: "hello")
textView.registerValidator(_ validator: greetingValidator) { (validText, validator) in
// Handle selection of "Hello"
}
let exclamationValidator = SuffixValidator(suffix: "!")
textView.registerValidator(_ validator: exclamationValidator) { (validText, validator) in
// Handle selection of "World!"
}
要创建可选文本,您需要创建并注册一个验证器。验证器必须遵守 TextSelectionValidator
协议。
let hashtagValidator = PrefixValidator(prefix: "#")
textView.registerValidator(validator: hashtagValidator) { (validText, validator) in
// Handle selection of hashtag
}
您可以在任何时候注销验证器。
textView.removeValidator(validator: hashtagValidator)
这里有关于如何使用 TextSelectionValidator
协议 创建自定义验证器 的资源。
还有其他一些更具体的协议,使得自定义更容易,例如 ContainerTextSelectionValidator
和 CompositeTextSelectionValidator
。
提供了一些预写验证器。这些可以作为现有的,作为构建更复杂验证器的积木,以及作为如何构建自定义验证器的示例。
MatchesTextValidator(text: String, caseSensitive: Bool = false)
ContainsTextValidator(text: String, caseSensitive: Bool = false)
PrefixValidator(text: String, caseSensitive: Bool = false)
SuffixValidator(text: String, caseSensitive: Bool = false)
HashtagTextValidator()
AtSymbolTagTextValidator()
QuotationsTextValidator()
HandlebarsValidator(searchableText: String, replacementText: String)
ReverseValidator(validator: TextSelectionValidator)
ContainerValidator(validator: TextSelectionValidator, selectionAttributes: [String: Any]? = nil)
CompositeValidator(validators: [TextSelectionValidator], selectionAttributes: [String: Any]? = nil)
LinkValidator() // Validates any link (HTTP, HTTPS, file, etc...)
HTTPLinkValidator() // Validates HTTP and HTTPS links
UnsafeLinkValidator() // Validates HTTP links
HTTPSLinkValidator()
CustomLinkValidator(urlString: String!, replacementText: String? = nil)
可以使用 LinkValidatorAttributes
协议进行自定义。示例 在此。
RegexValidator(pattern: String, options: NSRegularExpression.Options = .caseInsensitive)
EmailValidator()
PhoneNumberValidator()
您可以使用以下方法添加文本扩展按钮
public func addExpansionButton(collapsedState: (text: String, lines: Int), expandedState: (text: String, lines: Int), attributes: [String: Any]? = nil)
您可以使用以下方法删除扩展按钮
public func removeExpansionButton(numberOfLines: Int = 1)
示例
let attributes = [NSForegroundColorAttributeName: purple]
textView.addExpansionButton(collapsedState: ("More...", 2),
expandedState: ("Less", 0),
attributes: attributes)
...
textView.removeExpansionButton(numberOfLines: 2)
您可以使用 SelectedBackgroundColorAttribute
属性和 HighlightedTextSelectionAttributes
结构作为属性键来自定义扩展按钮的背景颜色。
let attributes: [String: Any] = [HighlightedTextSelectionAttributes.SelectedBackgroundColorAttribute : UIColor.purple]
String?
UIFont
UIFont.systemFont(ofSize: 17)
UIColor
UIColor.darkText
text
和 textColor
NSAttributedString?
nil
TextAlignment
.left
、.right
、.center
.left
LineBreakMode
.wordWrap
. wordWrap
TruncationMode
.clipping
,.truncateTail
.clipping
Int
0
UILabel
CGFloat
0
UIEdgeInsets
UIEdgeInsets.zero
[String : AnyObject]?
color
= tintColor
,font
= boldSystemFont(ofSize: font.pointSize + 2)
Bool?
nil
。只有当展开按钮被添加时才会返回值CGSize
Bool
true
Bool
false
SelectableTextViewDelegate?
SelectableTextViewScrollDelegate?
\n
\t
\0
如果您想在可选文本旁边放入文本,但仍需正确验证文本,请使用空字符终结符。
let text = "The period next to the #Hashtag\0. Will not be highlighted if I use a hashtag validator."
您可以使用以下方法获取文本视图内单词的相对框架。这就是我在第一个示例 Gif 中设置星星效果的方法。
public func framesOfWordsMatchingValidator(_ validator: TextSelectionValidator) -> [CGRect]
您可以使用 TabTextModelConfig.numberOfSpaces
调整制表符字符产生的空格数。默认值是 4。
TabTextModelConfig.numberOfSpaces = 2
您可以通过界面构建器设置大多数自定义属性。《SelectableTextView》标记为@IBDesignable
。
numberOfLines: Int
text: String
textColor: UIColor
lineSpacing: Float
isSelectionEnabled: Bool
isScrollEnabled: Bool
fontSize: Float
truncateTail: Bool
topTextInsets: Float
bottomTextInsets: Float
leftTextInsets: Float
rightTextInsets: Float
为所有的 SelectableTextViewDelegate
方法提供了默认实现。
public protocol SelectableTextViewDelegate: class {
/// Resolves conflict between multiple validates that return `true` from their `validate:` method
//
// i.e. PrefixTextValidator for `#` and `#my` will both return true for `#myCoolHashtag`,
// but the actions they are registered for may differ
//
/// Default behavior is to choose the first validator in the composite validator's `validators` array
func resolveValidationConflictsForSelectableTextView(textView: SelectableTextView, conflictingValidators: [TextSelectionValidator]) -> TextSelectionValidator
/// Defaults to `false`
func animateExpansionButtonForSelectableTextView(textView: SelectableTextView) -> Bool
/// Defaults to `.truncateTail`
func truncationModeForWordsThatDontFitForSelectableTextView(textView: SelectableTextView) -> TruncationMode
/// Optional, Default empty implementation provideed
func selectableTextViewContentHeightDidChange(textView: SelectableTextView, oldHeight: CGFloat, newHeight: CGFloat)
}
SelectableTextView
支持滚动,并通过 SelectableTextViewScrollDelegate
转发滚动事件。
public protocol SelectableTextViewScrollDelegate: class {
func selectableTextViewDidScroll(_ scrollView: UIScrollView)
func selectableTextViewWillBeginDragging(_ scrollView: UIScrollView)
func selectableTextViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>)
func selectableTextViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool)
func selectableTextViewWillBeginDecelerating(_ scrollView: UIScrollView)
func selectableTextViewDidEndDecelerating(_ scrollView: UIScrollView)
func selectableTextViewDidEndScrollingAnimation(_ scrollView: UIScrollView)
}
您也可以滚动到特定的单词或第一个通过验证器的单词。
/// Scrolls to the first instance of the word
/// Attempts to match the text and display text of a word
public func scrollToWord(_ word: String, position: ScrollPosition, animated: Bool)
/// Scrolls to the first instance of a word that passes the provided TextSelectionValidator
public func scrollToWordPassingValidator(_ validator: TextSelectionValidator, position: ScrollPosition, animated: Bool)
.head
,.center
请随时发送电子邮件至 [email protected]。我很乐意听听您的想法,或者看看已经使用了此功能的示例。