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

Dec 21 2020

Мне нужно получить координату 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)
}

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

Ответы

1 LeoDabus Dec 21 2020 at 03:23

Ваш синтаксис Swift действительно старый (Swift 2). Измените range.startIndexна range.lowerBound. substringToIndexтеперь называется подстрокой (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)
    }
}