123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- //
- // CustomTextView.swift
- // Qmera
- //
- // Created by Akhmad Al Qindi Irsyam on 27/09/21.
- //
- import UIKit
- class CustomTextView: UITextView {
-
- override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
- let menuController = UIMenuController.shared
- if var menuItems = menuController.menuItems,
- (menuItems.map { $0.action }).elementsEqual([#selector(toggleBoldface), #selector(toggleItalics), #selector(toggleUnderline)]) {
- menuItems.append(UIMenuItem(title: "Strikethrough", action: #selector(toggleStrikethrough)))
- menuController.menuItems = menuItems
- }
- return super.canPerformAction(action, withSender: sender)
- }
-
- @objc func toggleStrikethrough(_ sender: Any?) {
- if let range = self.selectedTextRange {
- let startPosition = self.offset(from: self.beginningOfDocument, to: range.start)
- if startPosition == 0 || checkCharBefore(char: self.text.substring(from: startPosition - 1, to: startPosition - 1)) {
- self.replace(self.textRange(from: range.start, to: range.end)!, withText: "~\(self.text(in: range)!)~")
- } else {
- self.replace(self.textRange(from: range.start, to: range.end)!, withText: " ~\(self.text(in: range)!)~")
- }
- UIMenuController.shared.isMenuVisible = false
- }
- }
- override func toggleBoldface(_ sender: Any?) {
- if let range = self.selectedTextRange {
- let startPosition = self.offset(from: self.beginningOfDocument, to: range.start)
- if startPosition == 0 || checkCharBefore(char: self.text.substring(from: startPosition - 1, to: startPosition - 1)) {
- self.replace(self.textRange(from: range.start, to: range.end)!, withText: "*\(self.text(in: range)!)*")
- } else {
- self.replace(self.textRange(from: range.start, to: range.end)!, withText: " *\(self.text(in: range)!)*")
- }
- UIMenuController.shared.isMenuVisible = false
- }
- }
-
- override func toggleUnderline(_ sender: Any?) {
- if let range = self.selectedTextRange {
- let startPosition = self.offset(from: self.beginningOfDocument, to: range.start)
- if startPosition == 0 || checkCharBefore(char: self.text.substring(from: startPosition - 1, to: startPosition - 1)) {
- self.replace(self.textRange(from: range.start, to: range.end)!, withText: "^\(self.text(in: range)!)^")
- } else {
- self.replace(self.textRange(from: range.start, to: range.end)!, withText: " ^\(self.text(in: range)!)^")
- }
- UIMenuController.shared.isMenuVisible = false
- }
- }
-
- override func toggleItalics(_ sender: Any?) {
- if let range = self.selectedTextRange {
- let startPosition = self.offset(from: self.beginningOfDocument, to: range.start)
- if startPosition == 0 || checkCharBefore(char: self.text.substring(from: startPosition - 1, to: startPosition - 1)) {
- self.replace(self.textRange(from: range.start, to: range.end)!, withText: "_\(self.text(in: range)!)_")
- } else {
- self.replace(self.textRange(from: range.start, to: range.end)!, withText: " _\(self.text(in: range)!)_")
- }
- UIMenuController.shared.isMenuVisible = false
- }
- }
-
- func checkCharBefore(char: String) -> Bool {
- return char == " " || char == "\n"
- }
-
- }
|