Меньший приоритет для Spacer в SwiftUI
Изучаю SwiftUI. Столкнулся с Picker внутри Form. Он, кажется, супер удобным, но иконка с галочкой справа не совсем нравится. Вариантов по трансформации внешнего вида не нашел и решил сделать свой. Но, столкнулся со странным поведением Spacer().
Пример:
Здесь, Picker A - это стандартный Picker с элементарным кодом:
Picker("Picker A", selection: $selectedCurrency) {
ForEach(currencies) { currency in
Text(currency.title)
.lineLimit(1)
.tag(currency.id)
}
}
.pickerStyle(DefaultPickerStyle())
Picker B - кастомный (мой):
NavigationLink(
destination: CurrencyListView(currency: $currency),
label: {
Text("Picker B")
Spacer()
if currency != nil {
Text(currency!.title)
.lineLimit(1)
.foregroundColor(.gray)
}
}
)
Проблема в обрезании выбранного значения. В случае, если выбранное значение полностью помещается в ячейку (не мешая левой части), то, кажется логичным показывать его полностью (как в дефолтном Picker'е). Проблема решается с помощью .fixedSize(horizontal: true, vertical: true) у обоих Text. Но если так сделать, то в случае, если будет выбрано что-то с длинным названием, то chevron стрелка уезжает за пределы ячейки вправо. В Apple же продумали такой кейс и решили его по-своему:

Я пробовал использовать .layoutPriority(), но это не сработало. Пытался определить ширину правого Text до Spacer, что бы просчитать его ширину до отображения. Но толкового решения тоже не нашел. Вариант с определением кол-ва символов - костыль
Есть у кого-то идеи как можно решить такую задачку? Спасибо
Ответы (1 шт):
Используйте frame:
Text(title)
.lineLimit(1)
.foregroundColor(.gray)
.frame(maxWidth: .infinity, alignment: .trailing)
Результат:
