Я создаю представление заметок с нижним колонтитулом по всему пользовательскому интерфейсу.
var body: some View {
ZStack(alignment: .bottom) {
VStack(alignment: .leading) {
Text("\(note.date.formatted())")
.padding([.leading, .trailing])
TextEditor(text: $note.text)
.padding()
}
Footer {}
}
}
Существует текст заголовка с датой, TextEditor и элемент нижнего колонтитула. Нижний колонтитул просто плавает над TextEditor и блокирует текст от просмотра. Это то, что мне нужно, но вот подвох
Мне нужно добавить отступы к внутренней прокрутке TextEditor, чтобы текст прокручивался под элементом нижнего колонтитула, но я могу прокрутить достаточно вверх, чтобы увидеть все это. Если я добавлю .padding([.bottom], 150)
в TextEditor, он просто обрежет текст и будет выглядеть некрасиво.
с точки зрения непрофессионала, мне нужна иллюзия, что в конце текста есть около 5 «\n», но без добавления «\n»
Возможно, вы захотите попробовать contentMargins(_:for:) из iOS 17:
TextEditor(text: $note.text)
.padding()
.contentMargins(.bottom, .init(top: 0, leading: 0, bottom: 50, trailing: 0)) //<- here
Для аналогичной задачи я предпочел использовать scrollClipDisabled()
, а не contentMargins
или safeAreaInset(edge:alignment:spacing:content:)
, у которых есть одна неприятная вещь — они обеспечивают фон, который полностью покрывает прокручиваемый контент. Я заметил, что это происходит только с TextEditor, тогда как ScrollView прекрасно работает с указанными модификаторами.
scrollClipDisabled()
не имеет этой проблемы и кажется лучшим вариантом в вашей ситуации, чтобы красиво и частично перекрыть прокручиваемый контент.
struct FooterAboveScrollingText: View {
var body: some View {
VStack(spacing: 0) {
Text("14 October, 2023")
.frame(height: 60)
.frame(maxWidth: .infinity)
.background {
Rectangle().foregroundStyle(.white).ignoresSafeArea() // <-- Attention here!
}
.zIndex(1) // <-- And here!
TextEditor(text: { your huge text })
.scrollClipDisabled()
RoundedRectangle(cornerRadius: 20)
.frame(maxHeight: 60)
.foregroundStyle(.white)
.shadow(radius: 15)
.padding()
}
}
}
Однако, как видите, вам все равно нужно внести пару корректировок в заголовок даты. Вам необходимо добавить фон и zIndex(1), чтобы убедиться, что ваш заголовок не перекрывается содержимым прокрутки.
Результат:
ПРИМЕЧАНИЕ. Еще одна вещь, которую следует знать: это решение предназначено для iOS 17 и более поздних версий, а safeAreaInset(edge:alignment:spacing:content:)
доступно и для iOS 15.
.scrollContentBackground(.hidden) удаляет фон для contentMargins. Спасибо за ответ. ты очень помог