Как стать автором
Обновить

Комментарии 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

  • всевозможные готовые библиотеки

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации