Phát hiện các lần nhấn trên văn bản được gán bằng Swift
Đôi khi đối với những người mới bắt đầu thì hơi khó để biết cách thiết lập mọi thứ (dù sao thì đối với tôi cũng vậy), vì vậy ví dụ này đầy đủ hơn một chút.
Thêm một UITextView
vào dự án của bạn.
Cửa hàng
Kết nối UITextView
đến ViewController
với một lối thoát tên textView
.
Thuộc tính tùy chỉnh
Chúng tôi sẽ tạo một thuộc tính tùy chỉnh bằng cách tạo một Tiện ích mở rộng .
Lưu ý: Về mặt kỹ thuật, bước này là tùy chọn, nhưng nếu không thực hiện, bạn sẽ cần chỉnh sửa mã trong phần tiếp theo để sử dụng thuộc tính tiêu chuẩn như NSAttributedString.Key.foregroundColor
. Lợi thế của việc sử dụng thuộc tính tùy chỉnh là bạn có thể xác định những giá trị nào bạn muốn lưu trữ trong phạm vi văn bản được phân bổ.
Thêm một tệp nhanh mới với Tệp> Mới> Tệp ...> iOS> Nguồn> Tệp Swift . Bạn có thể gọi nó là gì bạn muốn. Tôi đang gọi NSAttributedStringKey + CustomAttribute.swift của tôi .
Dán mã sau:
import Foundation
extension NSAttributedString.Key {
static let myAttributeName = NSAttributedString.Key(rawValue: "MyCustomAttribute")
}
Mã
Thay thế mã trong ViewController.swift bằng mã sau. Lưu ý UIGestureRecognizerDelegate
.
import UIKit
class ViewController: UIViewController, UIGestureRecognizerDelegate {
@IBOutlet weak var textView: UITextView!
override func viewDidLoad() {
super.viewDidLoad()
// Create an attributed string
let myString = NSMutableAttributedString(string: "Swift attributed text")
// Set an attribute on part of the string
let myRange = NSRange(location: 0, length: 5) // range of "Swift"
let myCustomAttribute = [ NSAttributedString.Key.myAttributeName: "some value"]
myString.addAttributes(myCustomAttribute, range: myRange)
textView.attributedText = myString
// Add tap gesture recognizer to Text View
let tap = UITapGestureRecognizer(target: self, action: #selector(myMethodToHandleTap(_:)))
tap.delegate = self
textView.addGestureRecognizer(tap)
}
@objc func myMethodToHandleTap(_ sender: UITapGestureRecognizer) {
let myTextView = sender.view as! UITextView
let layoutManager = myTextView.layoutManager
// location of tap in myTextView coordinates and taking the inset into account
var location = sender.location(in: myTextView)
location.x -= myTextView.textContainerInset.left;
location.y -= myTextView.textContainerInset.top;
// character index at tap location
let characterIndex = layoutManager.characterIndex(for: location, in: myTextView.textContainer, fractionOfDistanceBetweenInsertionPoints: nil)
// if index is valid then do something.
if characterIndex < myTextView.textStorage.length {
// print the character index
print("character index: \(characterIndex)")
// print the character at the index
let myRange = NSRange(location: characterIndex, length: 1)
let substring = (myTextView.attributedText.string as NSString).substring(with: myRange)
print("character at index: \(substring)")
// check if the tap location has a certain attribute
let attributeName = NSAttributedString.Key.myAttributeName
let attributeValue = myTextView.attributedText?.attribute(attributeName, at: characterIndex, effectiveRange: nil)
if let value = attributeValue {
print("You tapped on \(attributeName.rawValue) and the value is: \(value)")
}
}
}
}
Bây giờ nếu bạn nhấn vào "w" của "Swift", bạn sẽ nhận được kết quả sau:
character index: 1
character at index: w
You tapped on MyCustomAttribute and the value is: some value
Ghi chú
- Ở đây tôi đã sử dụng một thuộc tính tùy chỉnh, nhưng nó có thể dễ dàng như vậy
NSAttributedString.Key.foregroundColor
(màu văn bản) có giá trị là UIColor.green
.
- Trước đây, chế độ xem văn bản không thể chỉnh sửa hoặc có thể chọn được, nhưng trong câu trả lời cập nhật của tôi cho Swift 4.2, nó dường như hoạt động tốt cho dù chúng có được chọn hay không.
Học cao hơn
Câu trả lời này dựa trên một số câu trả lời khác cho câu hỏi này. Bên cạnh những điều này, hãy xem thêm