feature/bottom-sheet #11
No reviewers
Labels
No Label
No Milestone
No project
No Assignees
3 Participants
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: TouchInstinct/LeadKit#11
Loading…
Reference in New Issue
No description provided.
Delete Branch "feature/bottom-sheet"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
TIBottomSheet
TIBottomSheet содержить базовую реализацию модального котроллера и немного видоизмененную библиотеку PanModal.
Базовый контроллер
Для создания модального котроллера можно унаследоваться от
BaseModalViewController. Данный клас принимает два generic типа: тип основного контента, тип контента футера.Обертка вокруг существующего контроллера
Может быть такое, что из уже существующего контроллера нужно сделать модальное окно. С этим может помочь обертка
BaseModalWrapperViewController. Данный контроллер является наследником BaseModalViewController, что позволяет его настраивать так же, как и базовый модальный котроллерКонтент модального контроллера
Модальный котроллер может содержать следующие элементы:
DragView,HeaderView,FooterView. Каждый из них является опциональным и без дополнительных настроек не будет показываться.DragView - небольшая view, за которую пользователь "держит" модальный контроллер
HeaderView - контейнер, содержащий в себе кнопки назад/закрыть или какие-то другие элементы управления
FooterView - view, располагающаяся внизу контроллера, поверх всего контента (модальный контроллер уже настроен так, чтобы при скролле в самый низ, футер не перекрывал последнюю ячейку)
Для настройки каждого у котроллера есть свойство
viewControllerAppearance. Через него будет настраиваться весь контроллер. Однако стоит заметить, что котроллер не будет настраивать передаваимую вью, содержащую основной контент. Стандартно котроллер будет пытаться расположить контент так, чтобы он заполнил все пространство.Вот пример настройки внешнего вида так, чтобы был видет dragView и headerView с левой кнопкой:
"Якори" контроллера
Раньше для настройки высоты контроллера необходимо было пользоваться свойствами
longFormHeight,shortFormHeight. В базовом контроллере можно лишь передать список точек на которых контроллер должен будет задержаться:В данный массив не рекомендуется передавать больше 3 значений, т.к. модальное окно все равно сможет занять только 3 положения на экране.
DimmedView и PassthroughDimmedView
Для контроля
DimmedView(затемняющей view) есть отдельное свойствоdimmedView. Эти классы позволяют настраивать поведение при тапе в затемнённую область и кастомизировать затемнение под ваши нужды.Контроль закрытия
PanModalPresentableне умеет в настройку закрытия контроллера, делая это самостоятельно черезdismiss(animated:completion:). Теперь можно настроить закрытие самостоятельно через свойства:onTapToDismissиonDragToDismiss.Взаимедействие с PanModal
Если нет необходимости или возможности использовать
BaseModalViewController, вы все так же можете пользоваться протоколомPanModalRepresentable. Вот список изменений протокола:onTapToDismissиonDragToDismissmediumFormHeightDimmedViewоткрыт для наследования и может создаваться вdimmedViewу@ -0,0 +6,4 @@pod 'TIUIElements', :path => '../../../../TIUIElements/TIUIElements.podspec'pod 'TIUIKitCore', :path => '../../../../TIUIKitCore/TIUIKitCore.podspec'pod 'TISwiftUtils', :path => '../../../../TISwiftUtils/TISwiftUtils.podspec'TIBottomSheet тоже надо добавить
@ -0,0 +123,4 @@configureFooterViewLayout()}open override func bindViews() {а ты как-то учитываешь, что contentView.bounds может поменяться? типа мы обновили содержимое таблицы/коллекции?
@ -0,0 +340,4 @@}private func getFittingSize(forView view: UIView) -> CGSize {let targetSize = CGSize(width: UIScreen.main.bounds.width,🤔
есть другие варианты?
@ -0,0 +27,4 @@// MARK: - Default Valuespublic static var headerOnly: ModalViewPresentationDetent {ModalViewPresentationDetent(height: CGFloat(Int.min))CGFLOAT_MIN? https://developer.apple.com/documentation/corefoundation/cgfloat_min
@ -0,0 +35,4 @@}public static var maxHeight: ModalViewPresentationDetent {ModalViewPresentationDetent(height: CGFloat(Int.max))аналогично
@ -0,0 +35,4 @@case presented(UIView.BaseWrappedViewHolderAppearance<UIView.DefaultWrappedAppearance, UIView.DefaultWrappedLayout>)}func configureAppearance(appearance: UIView.BaseWrappedViewHolderAppearance<UIView.DefaultWrappedAppearance, UIView.DefaultWrappedLayout>) {configureModalFooter(appearance:)
может some заиспользовать? чуть меньше кода, чуть больше гибкости в передаваемом параметре
@ -0,0 +37,4 @@case nonecase buttonLeft(BaseButtonStyle)case buttonRight(BaseButtonStyle)case buttons(left: BaseButtonStyle, right: BaseButtonStyle)лучше leading, trailing
@ -0,0 +53,4 @@topConstraint: leftButton.topAnchor.constraint(equalTo: topAnchor),bottomConstraint: leftButton.bottomAnchor.constraint(equalTo: bottomAnchor)),centerConstraints: .init(centerYConstraint: leftButton.centerYAnchor.constraint(equalTo: centerYAnchor)),sizeConstraints: .init())а почему бы не дать поддержку размеров?
@ -0,0 +133,4 @@bottomConstraint: view.bottomAnchor.constraint(equalTo: bottomAnchor)),centerConstraints: .init(centerXConstraint: view.centerXAnchor.constraint(equalTo: centerXAnchor),centerYConstraint: view.centerYAnchor.constraint(equalTo: centerYAnchor)),sizeConstraints: .init())и тут
@ -0,0 +137,4 @@self.customViewConstraints = customViewConstraintsNSLayoutConstraint.deactivate(customViewConstraints.centerConstraints.allConstraints)@ -0,0 +1,28 @@Pod::Spec.new do |s|s.name = 'TIBottomSheet's.version = '1.45.0'1.50.0
@ -133,3 +133,3 @@middleViewLayout: WrappedViewLayout) {let leadingToSuperviewContraint: NSLayoutConstraintlet leadingToSuperviewContraint: NSLayoutConstraint?а зачем? в коде не вижу причины
153 строка: leadingViewConstraints.edgeConstraints.leadingConstraint - опциональный констрейнт
@ -48,0 +47,4 @@centerYConstraint?.setActiveConstantOrDeactivate(constant: offset.vertical)}public var centerConstraints: [NSLayoutConstraint] {а чем отличается от allConstraints?
@ -0,0 +22,4 @@import UIKitpublic final class ScrollViewWrapper<ContentView: UIView>: UIScrollView {из названия создаётся впечатление, что мы оборачиваем scrollView
@ -0,0 +43,4 @@])}required init?(coder: NSCoder) {unavailable?
ba4cdc6e0eto27d5a3a9cad55745efc6to35ec61a0ee35ec61a0eeto843a887ec7@ -0,0 +65,4 @@}extension ContainerScrollView: AppearanceConfigurable where View: AppearanceConfigurable,View.Appearance: WrappedViewAppearance {Тут поехало немного
Автовыравнивание, я бы не фокусировался на этих мелочах
@ -0,0 +108,4 @@`PanModalPresentable` не умеет в настройку закрытия контроллера, делая это самостоятельно через `dismiss(animated:completion:)`. Теперь можно настроить закрытие самостоятельно через свойства: `onTapToDismiss` и `onDragToDismiss`.# Взаимедействие с PanModalВзаимодействие
@ -20,3 +19,1 @@exit $?fidoneGIT_REPO_PATH="github.com:petropavel13/TestPodspecs"А это так и должно быть, да?
утёк тестовый код)
И еще, я, возможно, пропустил, но можно изменить состояние модалки через свойство / метод? Типо
modalController.state = .maxHeightилиmodalController.updateState(to: .maiHeight), что-то вот такое?