Комментарии 8
А как на телефоне можно понять что за "бесполе..."? Навести мышкой, чтобы увидеть подсказку, не получится.
Хорошее замечание, так как я тренировалась и делала эту фичу в отдельном проекте, я не сильно замораживалась с UI частью. А так в идеале либо подстраиваться под ширину экрана и уменьшать шрифт, либо же как у нас в итоге сделано - просто оставлять только значки без текста, если размер экрана не позволяет полностью надпись вставить.
Можно сделать иначе. (пример из моего проекта) В основном окне сделать Sheet
.blur(radius: isPressedSheet3 ? 5 : 0) // для размытия основного окна. Можно заменить на затемнение. или наложить так же overlay с чем угодно
.animation(.easeOut(duration: 0.2), value: isPressedSheet3) ///планое размытие
.sheet(isPresented: $isPressedSheet3, content: {
ListTimer(isPressedSheet3: $isPressedSheet3, isShowTimer: $isShowTimer)
.presentationDetents([.height(HeightListTimer) ,.large])
.presentationDragIndicator(.hidden)
})
Само всплывающее окно
VStack{
// код
}
.background(
GeometryReader { geometry2 in
Color.clear
.onAppear {
print("Размер VStack: \(geometry2.size)")
HeightListTimer = Double(geometry2.size.height)
}
}
)
GeometryReader расположен в бекграунде. тк если его накладывать на все окно размер получается на весь экран а не на нужное нам VStack. Но если размеры известны заранее то можно передавать сразу их через
.onAppear { HeightListTimer = 350 // известная высота }
А так же в главном и всплывающем вью нужно поместить переменную. я сделал через:
@AppStorage("HeightListTimer") private var HeightListTimer: Double = 400
Можно и другими методами но так вышло проще
Не вижу никакой сложности сделать динамическое по высоте вью, как в дизайне на UIKit и не костылять в SUI. Думаю, вам не подходит презентовать целый контроллер, по дизайну лучше подходит кастомная вью. Единственное, что не понятно, как между собой связаны вью с индикатором загрузки и вью с текстом. Это одно вью с какой-то анимацией перехода или вью с индикатором загрузке должно скрыться и вместо него появиться вью с текстом (скелетоном). И не очень понятно, зачем вам вью с индикатором загрузки, а потом еще вью со скелетоном (та же загрузка), выглядит как дизайнерский просчет. Я бы оставил что-то одно и скорей всего это было бы второе вью со скелетоном, т.к. не понятно к чему должна быть привязана загрузка с прогрессбаром или там рандомная анимация?
Если очень хочется использовать модальное окно, его рутовую вью можно сделать прозрачной и закруглить углы уже во вложенном вью, но в таком случае будет не очень красиво выглядеть анимация заблюренной вью, которая снизу-вверх показывается.
Вот вы и раскрыли интригу второй части)) да, действительно нет смысла иметь одновременно скелетон и прогресс вью. Они взаимозаменяемые. Но я думаю всё равно покажу как их делала.
Приложение довольно активно переходит на SwiftUI, поэтому всё же думаю небольшие костыли оправданы, с учётом того, что они уберутся впоследствии. Но в целом да, если бы не переход, то конечно, имел бы смысл сделать всё на UIKit.
Видео к посту в ТГ добавил
А вы читаете нормальным что у вам модальное окно празднуется вместе с затемненным слоем? См последний гиф.
мои способы реализации bottom sheet (а также alert и им подобных) на UIKit. Что-то из этого можно использовать и для SwiftUI:
UIViewController, view полупрозрачный, во view с анимацией добавляется еще один view - контейнер для содержимого плашки
UIViewController + custom tranisition. Фактически это то, что вы пытались сделать в статье - плашка произвольной формы и высоты, соответствующая view controller
всевозможные готовые библиотеки
История одного модального окна или переходим с UIKit на SwiftUI. Часть 1