Недавно я начал использовать SwiftUI. Сегодня я столкнулся с самым странным явлением. Когда я отображаю простой текст, заканчивающийся двоеточием, это двоеточие в конце отображается ниже, чем все остальные символы, включая любые другие двоеточия в тексте. Это нормальное ожидаемое поведение SwiftUI? Есть ли способ запретить это?
Вход:
let myText: String = "1:2:3:".trimmingCharacters(in: NSCharacterSet.whitespacesAndNewlines)
var body: some View {
Text("8:8:8:")
Text("8:8:8:8")
Text(myText)
}
Выход:
Я новичок в Swift и SwiftUI. Я не уверен, что означает «пусто» в этом контексте, поскольку обе строки не были пустыми. Пожалуйста, простите мое невежество.
Я не использую все это, я имел в виду концепцию типа данных, пустое значение или, в строковых терминах, переменную = "" что-то вроде этого. Интересно, можете ли вы использовать оператор REGEX, чтобы проверить строку, чтобы увидеть, отсутствует ли в ней последнее значение, а затем заменить пустое пространство этим --> <-- это выглядит как пробел, но это ascii, так что это может просто работать чтобы исправить эту проблему. Это не устраняет причину, по которой это происходит, но может ее исправить.
Может ли быть что-то пустое или скрытое, когда я буквально набираю текст («8:8:8:»)
Ого, вау, это тоже внизу в комментарии, когда я копирую и вставляю сверху. Я уверен, что вы на правильном пути, и я просто туплю, но я не знаю, как это проверить, когда оно было просто буквально напечатано, а не сохранено в строке.
Ну ладно, значит, в нем должно быть место. Если вы удержите ALT и нажмете 255, вы сгенерируете пространство ASCII, о котором я говорю. Или, возможно, это другой персонаж, но это странно.
В этой статье представлены некоторые пояснения относительно интерполяции строк в SwiftUI. «SwiftUI интерпретирует двоеточие как специальный символ, указывая, что следующий текст должен быть отформатирован как LocalizedStringKey»
Это функция шрифта, называемая «вертикально центрированное двоеточие». Он автоматически применяется между цифрами. В противном случае он не применяется по умолчанию. В ваших тестах используются только цифры; если бы вы использовали буквы, вы бы увидели другие результаты.
Не все шрифты имеют эту функцию, но San Francisco (здесь используется по умолчанию). Например, добавление .fontDesign(.monospaced)
избавит от этого, как и .font(.custom("Helvetica", size: 18))
.
Я не знаю хорошего способа изменить функции шрифта SwiftUI. Вы можете сделать это, используя методы, аналогичные UIFont: Как использовать стилистический альтернативный символ?:
struct ContentView: View {
var body: some View {
Text("8:8:8:")
.font(thefont())
}
}
func thefont() -> Font {
let baseFont = UIFont.systemFont(ofSize: 18)
let descriptor = CTFontDescriptorCreateCopyWithFeature(
baseFont.fontDescriptor,
kStylisticAlternativesType as CFNumber,
6 as CFNumber)
return Font(UIFont(descriptor: descriptor, size: 0.0))
}
Это позволит использовать центрированное двоеточие для всей строки. Это довольно уродливое решение, но я не знаю другого подхода, более дружественного к SwiftUI.
Примечание относительно «... если бы вы использовали буквы, вы увидели бы другие результаты». В моих тестах Text("A:B:C:")
дает то же самое нижнее последнее двоеточие, но не Text("a:b:c:")
Большое спасибо, это решило проблему для меня, и это имеет смысл.
Интересно, можете ли вы использовать замену, чтобы проверить строку на пустую, а затем заменить ее старым ASCII невидимого пространства alt-255? 8:8:8: <-- это