Skip to content

Instantly share code, notes, and snippets.

@kemchenj
Created December 22, 2017 10:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kemchenj/c89d70f4ff1f67fccac8a4416dea1570 to your computer and use it in GitHub Desktop.
Save kemchenj/c89d70f4ff1f67fccac8a4416dea1570 to your computer and use it in GitHub Desktop.
extension UITextView {
func correctSelection() {
let currentSelectedRange = selectedRange
let wholeRange = attributedText.wholeRange
let emptyRange = NSRange()
var lowerAttributeEffectiveRange = NSRange()
var upperAttributeEffectiveRange = NSRange()
let validRange = NSRange(
location: wholeRange.lowerBound + 1,
length: wholeRange.length - 2
)
let lowerBindingText: String? = {
var text: String? = nil
if validRange.contains(currentSelectedRange.lowerBound) {
text = attributedText.attribute(
NSAttributedStringKey.bindingText,
at: currentSelectedRange.lowerBound,
longestEffectiveRange: &lowerAttributeEffectiveRange,
in: wholeRange
) as? String
}
return text
}()
if lowerBindingText == nil {
lowerAttributeEffectiveRange = emptyRange
}
let upperBindingText: String? = {
var text: String? = nil
if validRange.contains(currentSelectedRange.upperBound - 1) {
text = attributedText.attribute(
NSAttributedStringKey.bindingText,
at: currentSelectedRange.upperBound - 1,
longestEffectiveRange: &upperAttributeEffectiveRange,
in: wholeRange
) as? String
}
return text
}()
if upperBindingText == nil {
upperAttributeEffectiveRange = emptyRange
}
guard currentSelectedRange.upperBound != lowerAttributeEffectiveRange.lowerBound else { return }
switch (lowerAttributeEffectiveRange, upperAttributeEffectiveRange) {
case (emptyRange, emptyRange):
break
case (let effectiveRange, emptyRange), (emptyRange, let effectiveRange):
selectedRange = currentSelectedRange
.union(effectiveRange)
case (_, _):
selectedRange = currentSelectedRange
.union(lowerAttributeEffectiveRange)
.union(upperAttributeEffectiveRange)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment