Как получить координаты (x, y) символа в строке

Мне нужно получить координату xy символа в строке, но я не смог найти актуальных ответов. Как я могу этого добиться? Я нашел эту статью здесь: Swift: как мне найти позицию (x, y) буквы в UILabel? но .rangeOfString больше не доступен:

extension String {

func characterPosition(character: Character, withFont: UIFont = UIFont.systemFontOfSize(18.0)) -> CGPoint? {

    guard let range = self.rangeOfString(String(character)) else {
        print("\(character) is missed")
        return nil
    }

    let prefix = self.substringToIndex(range.startIndex) as NSString
    let size = prefix.sizeWithAttributes([NSFontAttributeName: withFont])

    return CGPointMake(size.width, 0)
}

Вы знаете, как заставить его работать снова?

Метод остался, только теперь он называется range(of:). Однако этот способ найти позицию одного символа не очень надежен.

Sulthan 20.12.2020 19:46

Хорошо, а что может быть более надежным вариантом? Если я использовал диапазон (из:), я получаю 3 ошибки в строке префикса let = ...: Свойство «startIndex» требует, чтобы «String.Index.Stride» соответствовало «SignedInteger»; Свойство startIndex требует, чтобы String.Index соответствовал Strideable; Значение типа «String» не имеет члена «substringToIndex».

yoKurt 20.12.2020 19:49
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
2
294
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш синтаксис Swift действительно старый (Swift 2). Замените range.startIndex на range.lowerBound. substringToIndex теперь называется substring(to: Index), но он устарел, вы должны использовать индекс self[..<range.lowerBound]. Кстати, нет необходимости использовать String range(of: String), если вы ищете индекс символа. Вы можете использовать метод сбора firstIndex(of: Element):

extension StringProtocol {
    func characterPosition(character: Character, with font: UIFont = .systemFont(ofSize: 18.0)) -> CGPoint? {
        guard let index = firstIndex(of: character) else {
            print("\(character) is missed")
            return nil
        }
        let string = String(self[..<index])
        let size = string.size(withAttributes: [.font: font])
        return CGPoint(x: size.width, y: 0)
    }
}

Вы также знаете, как получить расстояние между первой (или любой другой) базовой линией текста в UILabel и верхней частью фрейма UILabel?

yoKurt 21.12.2020 11:21

Другие вопросы по теме