Мне нужно получить координату 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)
}
Вы знаете, как заставить его работать снова?
Хорошо, а что может быть более надежным вариантом? Если я использовал диапазон (из:), я получаю 3 ошибки в строке префикса let = ...: Свойство «startIndex» требует, чтобы «String.Index.Stride» соответствовало «SignedInteger»; Свойство startIndex требует, чтобы String.Index соответствовал Strideable; Значение типа «String» не имеет члена «substringToIndex».
Ваш синтаксис 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?
Метод остался, только теперь он называется range(of:). Однако этот способ найти позицию одного символа не очень надежен.