Cómo obtener las coordenadas (x, y) de un personaje en una cadena
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
Su sintaxis Swift es realmente antigua (Swift 2). Cambiar range.startIndex
a range.lowerBound
. substringToIndex
ahora 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)
}
}