Cómo obtener las coordenadas (x, y) de un personaje en una cadena

Dec 21 2020

Necesito obtener la coordenada xy de un carácter en una cadena, pero no pude encontrar ninguna respuesta actualizada. ¿Cómo puedo conseguir esto? Encontré este artículo aquí: Swift: ¿Cómo encuentro la posición (x, y) de una letra en un UILabel? pero .rangeOfString ya no está disponible:

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)
}

¿Sabes cómo hacer que vuelva a funcionar?

Respuestas

1 LeoDabus Dec 21 2020 at 03:23

Su sintaxis Swift es realmente antigua (Swift 2). Cambiar range.startIndexa range.lowerBound. substringToIndexahora se llama subcadena (to: Index) pero está en desuso, debe usar subíndice self[..<range.lowerBound]. Por cierto, no es necesario utilizar String range(of: String)si está buscando un índice de un carácter. Puedes usar el método de recolección 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)
    }
}