From b141dc5a45ddcd550cbffc111e3e26dce4e1818d Mon Sep 17 00:00:00 2001 From: Nikita Semenov Date: Mon, 12 Jun 2023 22:05:03 +0300 Subject: [PATCH 01/13] feat: pan modal changes --- .../BottomSheet/recup_dir.107/f9510598.gz | Bin 0 -> 4096 bytes .../PanModal/Animator/PanModalAnimator.swift | 40 + .../PanModalPresentationAnimator.swift | 172 ++++ .../PanModalPresentationController.swift | 881 ++++++++++++++++++ .../PanModalPresentationDelegate.swift | 81 ++ TIBottomSheet/Sources/PanModal/LICENSE | 19 + TIBottomSheet/Sources/PanModal/PanModal.h | 19 + .../PanModal/Presentable/PanModalHeight.swift | 44 + .../PanModalPresentable+Defaults.swift | 128 +++ .../PanModalPresentable+LayoutHelpers.swift | 126 +++ ...PanModalPresentable+UIViewController.swift | 63 ++ .../Presentable/PanModalPresentable.swift | 231 +++++ .../Presenter/PanModalPresenter.swift | 38 + .../UIViewController+PanModalPresenter.swift | 66 ++ .../Sources/PanModal/View/DimmedView.swift | 131 +++ .../PanModal/View/PanContainerView.swift | 44 + .../Sources/Appearance/UIView+Layout.swift | 8 + ...uttonStyle.swift => BaseButtonStyle.swift} | 2 +- .../StatefulButton+ApplyStyle.swift | 8 + 19 files changed, 2100 insertions(+), 1 deletion(-) create mode 100644 TIBottomSheet/Sources/BottomSheet/recup_dir.107/f9510598.gz create mode 100644 TIBottomSheet/Sources/PanModal/Animator/PanModalAnimator.swift create mode 100644 TIBottomSheet/Sources/PanModal/Animator/PanModalPresentationAnimator.swift create mode 100644 TIBottomSheet/Sources/PanModal/Controller/PanModalPresentationController.swift create mode 100644 TIBottomSheet/Sources/PanModal/Delegate/PanModalPresentationDelegate.swift create mode 100644 TIBottomSheet/Sources/PanModal/LICENSE create mode 100644 TIBottomSheet/Sources/PanModal/PanModal.h create mode 100644 TIBottomSheet/Sources/PanModal/Presentable/PanModalHeight.swift create mode 100644 TIBottomSheet/Sources/PanModal/Presentable/PanModalPresentable+Defaults.swift create mode 100644 TIBottomSheet/Sources/PanModal/Presentable/PanModalPresentable+LayoutHelpers.swift create mode 100644 TIBottomSheet/Sources/PanModal/Presentable/PanModalPresentable+UIViewController.swift create mode 100644 TIBottomSheet/Sources/PanModal/Presentable/PanModalPresentable.swift create mode 100644 TIBottomSheet/Sources/PanModal/Presenter/PanModalPresenter.swift create mode 100644 TIBottomSheet/Sources/PanModal/Presenter/UIViewController+PanModalPresenter.swift create mode 100644 TIBottomSheet/Sources/PanModal/View/DimmedView.swift create mode 100644 TIBottomSheet/Sources/PanModal/View/PanContainerView.swift create mode 100644 TIUIElements/Sources/Appearance/UIView+Layout.swift rename TIUIElements/Sources/Views/Placeholder/Styles/{PlaceholderButtonStyle.swift => BaseButtonStyle.swift} (98%) create mode 100644 TIUIElements/Sources/Views/StatefulButton/StatefulButton+ApplyStyle.swift diff --git a/TIBottomSheet/Sources/BottomSheet/recup_dir.107/f9510598.gz b/TIBottomSheet/Sources/BottomSheet/recup_dir.107/f9510598.gz new file mode 100644 index 0000000000000000000000000000000000000000..94e0ad63e497fc23325d9257fb66539e0f245090 GIT binary patch literal 4096 zcmb2|=3oE=;kRK2^Da9GsCqhvc|~7gV3$8IqbZ(O{vet5ee*N5UWg#vO)`iH9ibQFYl3>>`X;GQHfwm5o=xm4mR5K)wVQE@pcUJl zNsPYLscQ<#g#4bDKdRB0@WlK{&0Rgmef}Hz86Hj)DfM?Vee*gJ^pe%AW#-p_gMYdie+ ze=NLp{)f}wd+i-RmS5f PanModalPresentable.LayoutType? { + switch transitionStyle { + case .presentation: + return context.viewController(forKey: .to) as? PanModalPresentable.LayoutType + case .dismissal: + return context.viewController(forKey: .from) as? PanModalPresentable.LayoutType + } + } + +} + +// MARK: - UIViewControllerAnimatedTransitioning Delegate + +extension PanModalPresentationAnimator: UIViewControllerAnimatedTransitioning { + + /** + Returns the transition duration + */ + public func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval { + + guard + let context = transitionContext, + let presentable = panModalLayoutType(from: context) + else { return PanModalAnimator.Constants.defaultTransitionDuration } + + return presentable.transitionDuration + } + + /** + Performs the appropriate animation based on the transition style + */ + public func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { + switch transitionStyle { + case .presentation: + animatePresentation(transitionContext: transitionContext) + case .dismissal: + animateDismissal(transitionContext: transitionContext) + } + } + +} +#endif diff --git a/TIBottomSheet/Sources/PanModal/Controller/PanModalPresentationController.swift b/TIBottomSheet/Sources/PanModal/Controller/PanModalPresentationController.swift new file mode 100644 index 00000000..bf1dab90 --- /dev/null +++ b/TIBottomSheet/Sources/PanModal/Controller/PanModalPresentationController.swift @@ -0,0 +1,881 @@ +// +// PanModalPresentationController.swift +// PanModal +// +// Copyright © 2019 Tiny Speck, Inc. All rights reserved. +// + +#if os(iOS) +import TIUIKitCore +import UIKit + +/** + The PanModalPresentationController is the middle layer between the presentingViewController + and the presentedViewController. + + It controls the coordination between the individual transition classes as well as + provides an abstraction over how the presented view is presented & displayed. + + For example, we add a drag indicator view above the presented view and + a background overlay between the presenting & presented view. + + The presented view's layout configuration & presentation is defined using the PanModalPresentable. + + By conforming to the PanModalPresentable protocol & overriding values + the presented view can define its layout configuration & presentation. + */ +open class PanModalPresentationController: UIPresentationController { + + /** + Enum representing the possible presentation states + */ + public enum PresentationState { + case shortForm + case mediumForm + case longForm + } + + /** + Constants + */ + struct Constants { + static let indicatorYOffset = CGFloat(8.0) + static let snapMovementSensitivity = CGFloat(0.7) + static let dragIndicatorSize = CGSize(width: 36.0, height: 5.0) + } + + // MARK: - Properties + + /** + A flag to track if the presented view is animating + */ + private var isPresentedViewAnimating = false + + /** + A flag to determine if scrolling should seamlessly transition + from the pan modal container view to the scroll view + once the scroll limit has been reached. + */ + private var extendsPanScrolling = true + + /** + A flag to determine if scrolling should be limited to the longFormHeight. + Return false to cap scrolling at .max height. + */ + private var anchorModalToLongForm = true + + /** + The y content offset value of the embedded scroll view + */ + private var scrollViewYOffset: CGFloat = 0.0 + + /** + An observer for the scroll view content offset + */ + private var scrollObserver: NSKeyValueObservation? + + // store the y positions so we don't have to keep re-calculating + + /** + The y value for the short form presentation state + */ + private var shortFormYPosition: CGFloat = 0 + + private var mediumFormYPosition: CGFloat = 0 + + /** + The y value for the long form presentation state + */ + private var longFormYPosition: CGFloat = 0 + + private var allowsDragToDismiss: Bool { + presentable?.onDragToDismiss != nil + } + + /** + Determine anchored Y postion based on the `anchorModalToLongForm` flag + */ + private var anchoredYPosition: CGFloat { + let defaultTopOffset = presentable?.topOffset ?? 0 + return anchorModalToLongForm ? longFormYPosition : defaultTopOffset + } + + /** + Configuration object for PanModalPresentationController + */ + private var presentable: PanModalPresentable? { + return presentedViewController as? PanModalPresentable + } + + // MARK: - Views + + /** + Background view used as an overlay over the presenting view + */ + private lazy var backgroundView: DimmedView = { + let view: DimmedView + let type = presentable?.dimmedViewType ?? .opaque + + if let color = presentable?.panModalBackgroundColor { + view = DimmedView(presentingController: presentingViewController, dimColor: color, appearanceType: type) + } else { + view = DimmedView(presentingController: presentingViewController, appearanceType: type) + } + + view.didTap = { [weak self] in + self?.presentable?.onTapToDismiss?() + } + + return view + }() + + /** + A wrapper around the presented view so that we can modify + the presented view apperance without changing + the presented view's properties + */ + private lazy var panContainerView: PanContainerView = { + let frame = containerView?.frame ?? .zero + return PanContainerView(presentedView: presentedViewController.view, frame: frame) + }() + + /** + Override presented view to return the pan container wrapper + */ + public override var presentedView: UIView { + return panContainerView + } + + // MARK: - Gesture Recognizers + + /** + Gesture recognizer to detect & track pan gestures + */ + private lazy var panGestureRecognizer: UIPanGestureRecognizer = { + let gesture = UIPanGestureRecognizer(target: self, action: #selector(didPanOnPresentedView(_ :))) + gesture.minimumNumberOfTouches = 1 + gesture.maximumNumberOfTouches = 1 + gesture.delegate = self + return gesture + }() + + // MARK: - Deinitializers + + deinit { + scrollObserver?.invalidate() + } + + // MARK: - Lifecycle + + override public func containerViewWillLayoutSubviews() { + super.containerViewWillLayoutSubviews() + configureViewLayout() + } + + override public func presentationTransitionWillBegin() { + + guard let containerView = containerView + else { return } + + layoutBackgroundView(in: containerView) + layoutPresentedView(in: containerView) + configureScrollViewInsets() + configureShadowIfNeeded() + + guard let coordinator = presentedViewController.transitionCoordinator else { + backgroundView.dimState = .max + return + } + + coordinator.animate(alongsideTransition: { [weak self] _ in + if let yPos = self?.shortFormYPosition { + self?.adjust(toYPosition: yPos) + } + self?.presentedViewController.setNeedsStatusBarAppearanceUpdate() + }) + } + + override public func presentationTransitionDidEnd(_ completed: Bool) { + if completed { return } + + backgroundView.removeFromSuperview() + } + + override public func dismissalTransitionWillBegin() { + presentable?.panModalWillDismiss() + + guard let coordinator = presentedViewController.transitionCoordinator else { + backgroundView.dimState = .off + return + } + + /** + Drag indicator is drawn outside of view bounds + so hiding it on view dismiss means avoiding visual bugs + */ + coordinator.animate(alongsideTransition: { [weak self] _ in + self?.backgroundView.dimState = .off + self?.presentingViewController.setNeedsStatusBarAppearanceUpdate() + }) + } + + override public func dismissalTransitionDidEnd(_ completed: Bool) { + if !completed { return } + + presentable?.panModalDidDismiss() + } + + /** + Update presented view size in response to size class changes + */ + override public func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { + super.viewWillTransition(to: size, with: coordinator) + + coordinator.animate(alongsideTransition: { [weak self] _ in + guard + let self = self, + let presentable = self.presentable + else { return } + + self.adjustPresentedViewFrame() + if presentable.shouldRoundTopCorners { + self.addRoundedCorners(to: self.presentedView) + } + }) + } + +} + +// MARK: - Public Methods + +public extension PanModalPresentationController { + + /** + Transition the PanModalPresentationController + to the given presentation state + */ + func transition(to state: PresentationState) { + + guard presentable?.shouldTransition(to: state) == true + else { return } + + presentable?.willTransition(to: state) + + switch state { + case .shortForm: + snap(toYPosition: shortFormYPosition) + + case .mediumForm: + snap(toYPosition: mediumFormYPosition) + + case .longForm: + snap(toYPosition: longFormYPosition) + } + } + + /** + Operations on the scroll view, such as content height changes, + or when inserting/deleting rows can cause the pan modal to jump, + caused by the pan modal responding to content offset changes. + + To avoid this, you can call this method to perform scroll view updates, + with scroll observation temporarily disabled. + */ + func performUpdates(_ updates: () -> Void) { + + guard let scrollView = presentable?.panScrollable + else { return } + + // Pause scroll observer + scrollObserver?.invalidate() + scrollObserver = nil + + // Perform updates + updates() + + // Resume scroll observer + trackScrolling(scrollView) + observe(scrollView: scrollView) + } + + /** + Updates the PanModalPresentationController layout + based on values in the PanModalPresentable + + - Note: This should be called whenever any + pan modal presentable value changes after the initial presentation + */ + func setNeedsLayoutUpdate() { + configureViewLayout() + adjustPresentedViewFrame() + observe(scrollView: presentable?.panScrollable) + configureScrollViewInsets() + } + +} + +// MARK: - Presented View Layout Configuration + +private extension PanModalPresentationController { + + /** + Boolean flag to determine if the presented view is anchored + */ + var isPresentedViewAnchored: Bool { + if !isPresentedViewAnimating + && extendsPanScrolling + && presentedView.frame.minY.rounded() <= anchoredYPosition.rounded() { + return true + } + + return false + } + + /** + Adds the presented view to the given container view + & configures the view elements such as drag indicator, rounded corners + based on the pan modal presentable. + */ + func layoutPresentedView(in containerView: UIView) { + + /** + If the presented view controller does not conform to pan modal presentable + don't configure + */ + guard let presentable = presentable + else { return } + + /** + ⚠️ If this class is NOT used in conjunction with the PanModalPresentationAnimator + & PanModalPresentable, the presented view should be added to the container view + in the presentation animator instead of here + */ + containerView.addSubview(presentedView) + containerView.addGestureRecognizer(panGestureRecognizer) + + if presentable.shouldRoundTopCorners { + addRoundedCorners(to: presentedView) + } + + setNeedsLayoutUpdate() + adjustPanContainerBackgroundColor() + } + + /** + Reduce height of presentedView so that it sits at the bottom of the screen + */ + func adjustPresentedViewFrame() { + + guard let frame = containerView?.frame + else { return } + + let adjustedSize = CGSize(width: frame.size.width, height: frame.size.height - anchoredYPosition) + let panFrame = panContainerView.frame + panContainerView.frame.size = frame.size + + if ![shortFormYPosition, mediumFormYPosition, longFormYPosition].contains(panFrame.origin.y) { + // if the container is already in the correct position, no need to adjust positioning + // (rotations & size changes cause positioning to be out of sync) + let yPosition = panFrame.origin.y - panFrame.height + frame.height + presentedView.frame.origin.y = max(yPosition, anchoredYPosition) + } + panContainerView.frame.origin.x = frame.origin.x + presentedViewController.view.frame = CGRect(origin: .zero, size: adjustedSize) + } + + /** + Adds a background color to the pan container view + in order to avoid a gap at the bottom + during initial view presentation in longForm (when view bounces) + */ + func adjustPanContainerBackgroundColor() { + panContainerView.backgroundColor = presentedViewController.view.backgroundColor + ?? presentable?.panScrollable?.backgroundColor + } + + /** + Adds the background view to the view hierarchy + & configures its layout constraints. + */ + func layoutBackgroundView(in containerView: UIView) { + containerView.addSubview(backgroundView) + backgroundView.translatesAutoresizingMaskIntoConstraints = false + backgroundView.topAnchor.constraint(equalTo: containerView.topAnchor).isActive = true + backgroundView.leadingAnchor.constraint(equalTo: containerView.leadingAnchor).isActive = true + backgroundView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor).isActive = true + backgroundView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor).isActive = true + } + + /** + Calculates & stores the layout anchor points & options + */ + func configureViewLayout() { + + guard let layoutPresentable = presentedViewController as? PanModalPresentable.LayoutType + else { return } + + shortFormYPosition = layoutPresentable.shortFormYPos + mediumFormYPosition = layoutPresentable.mediumFormYPos + longFormYPosition = layoutPresentable.longFormYPos + anchorModalToLongForm = layoutPresentable.anchorModalToLongForm + extendsPanScrolling = layoutPresentable.allowsExtendedPanScrolling + + containerView?.isUserInteractionEnabled = layoutPresentable.isUserInteractionEnabled + } + + /** + Configures the scroll view insets + */ + func configureScrollViewInsets() { + + guard + let scrollView = presentable?.panScrollable, + !scrollView.isScrolling + else { return } + + /** + Disable vertical scroll indicator until we start to scroll + to avoid visual bugs + */ + scrollView.showsVerticalScrollIndicator = false + scrollView.scrollIndicatorInsets = presentable?.scrollIndicatorInsets ?? .zero + + /** + Set the appropriate contentInset as the configuration within this class + offsets it + */ + scrollView.contentInset.bottom = presentingViewController.bottomLayoutGuide.length + + /** + As we adjust the bounds during `handleScrollViewTopBounce` + we should assume that contentInsetAdjustmentBehavior will not be correct + */ + if #available(iOS 11.0, *) { + scrollView.contentInsetAdjustmentBehavior = .never + } + } + + func configureShadowIfNeeded() { + let type = presentable?.dimmedViewType ?? .opaque + + if case let .transparentWithShadow(shadow) = type { + containerView?.configureUIView(appearance: UIView.DefaultAppearance(shadow: shadow)) + } + } +} + +// MARK: - Pan Gesture Event Handler + +private extension PanModalPresentationController { + + /** + The designated function for handling pan gesture events + */ + @objc func didPanOnPresentedView(_ recognizer: UIPanGestureRecognizer) { + + guard + shouldRespond(to: recognizer), + let containerView = containerView + else { + recognizer.setTranslation(.zero, in: recognizer.view) + return + } + + switch recognizer.state { + case .began, .changed: + + /** + Respond accordingly to pan gesture translation + */ + respond(to: recognizer) + + /** + If presentedView is translated above the longForm threshold, treat as transition + */ + if presentedView.frame.origin.y == anchoredYPosition && extendsPanScrolling { + presentable?.willTransition(to: .longForm) + } + + default: + + /** + Use velocity sensitivity value to restrict snapping + */ + let velocity = recognizer.velocity(in: presentedView) + + if isVelocityWithinSensitivityRange(velocity.y) { + + /** + If velocity is within the sensitivity range, + transition to a presentation state or dismiss entirely. + + This allows the user to dismiss directly from long form + instead of going to the short form state first. + */ + if velocity.y < 0 { + transition(to: .longForm) + + } else if nearest(to: presentedView.frame.minY, inValues: [mediumFormYPosition, containerView.bounds.height]) == mediumFormYPosition + && presentedView.frame.minY < mediumFormYPosition { + transition(to: .mediumForm) + + } else if (nearest(to: presentedView.frame.minY, inValues: [longFormYPosition, containerView.bounds.height]) == longFormYPosition + && presentedView.frame.minY < shortFormYPosition) || allowsDragToDismiss == false { + transition(to: .shortForm) + + } else { + presentable?.onDragToDismiss?() + } + + } else { + + /** + The `containerView.bounds.height` is used to determine + how close the presented view is to the bottom of the screen + */ + let position = nearest(to: presentedView.frame.minY, inValues: [containerView.bounds.height, shortFormYPosition, mediumFormYPosition, longFormYPosition]) + + if position == longFormYPosition { + transition(to: .longForm) + + } else if position == mediumFormYPosition { + transition(to: .mediumForm) + + } else if position == shortFormYPosition || allowsDragToDismiss == false { + transition(to: .shortForm) + + } else { + presentable?.onDragToDismiss?() + } + } + } + } + + /** + Determine if the pan modal should respond to the gesture recognizer. + + If the pan modal is already being dragged & the delegate returns false, ignore until + the recognizer is back to it's original state (.began) + + ⚠️ This is the only time we should be cancelling the pan modal gesture recognizer + */ + func shouldRespond(to panGestureRecognizer: UIPanGestureRecognizer) -> Bool { + guard + presentable?.shouldRespond(to: panGestureRecognizer) == true || + !(panGestureRecognizer.state == .began || panGestureRecognizer.state == .cancelled) + else { + panGestureRecognizer.isEnabled = false + panGestureRecognizer.isEnabled = true + return false + } + return !shouldFail(panGestureRecognizer: panGestureRecognizer) + } + + /** + Communicate intentions to presentable and adjust subviews in containerView + */ + func respond(to panGestureRecognizer: UIPanGestureRecognizer) { + presentable?.willRespond(to: panGestureRecognizer) + + var yDisplacement = panGestureRecognizer.translation(in: presentedView).y + + /** + If the presentedView is not anchored to long form, reduce the rate of movement + above the threshold + */ + if presentedView.frame.origin.y < longFormYPosition { + yDisplacement /= 2.0 + } + adjust(toYPosition: presentedView.frame.origin.y + yDisplacement) + + panGestureRecognizer.setTranslation(.zero, in: presentedView) + } + + /** + Determines if we should fail the gesture recognizer based on certain conditions + + We fail the presented view's pan gesture recognizer if we are actively scrolling on the scroll view. + This allows the user to drag whole view controller from outside scrollView touch area. + + Unfortunately, cancelling a gestureRecognizer means that we lose the effect of transition scrolling + from one view to another in the same pan gesture so don't cancel + */ + func shouldFail(panGestureRecognizer: UIPanGestureRecognizer) -> Bool { + + /** + Allow api consumers to override the internal conditions & + decide if the pan gesture recognizer should be prioritized. + + ⚠️ This is the only time we should be cancelling the panScrollable recognizer, + for the purpose of ensuring we're no longer tracking the scrollView + */ + guard !shouldPrioritize(panGestureRecognizer: panGestureRecognizer) else { + presentable?.panScrollable?.panGestureRecognizer.isEnabled = false + presentable?.panScrollable?.panGestureRecognizer.isEnabled = true + return false + } + + guard + isPresentedViewAnchored, + let scrollView = presentable?.panScrollable, + scrollView.contentOffset.y > 0 + else { + return false + } + + let loc = panGestureRecognizer.location(in: presentedView) + return (scrollView.frame.contains(loc) || scrollView.isScrolling) + } + + /** + Determine if the presented view's panGestureRecognizer should be prioritized over + embedded scrollView's panGestureRecognizer. + */ + func shouldPrioritize(panGestureRecognizer: UIPanGestureRecognizer) -> Bool { + return panGestureRecognizer.state == .began && + presentable?.shouldPrioritize(panModalGestureRecognizer: panGestureRecognizer) == true + } + + /** + Check if the given velocity is within the sensitivity range + */ + func isVelocityWithinSensitivityRange(_ velocity: CGFloat) -> Bool { + return (abs(velocity) - (1000 * (1 - Constants.snapMovementSensitivity))) > 0 + } + + func snap(toYPosition yPos: CGFloat) { + PanModalAnimator.animate({ [weak self] in + self?.adjust(toYPosition: yPos) + self?.isPresentedViewAnimating = true + }, config: presentable) { [weak self] didComplete in + self?.isPresentedViewAnimating = !didComplete + } + } + + /** + Sets the y position of the presentedView & adjusts the backgroundView. + */ + func adjust(toYPosition yPos: CGFloat) { + presentedView.frame.origin.y = max(yPos, anchoredYPosition) + + let maxHeight = UIScreen.main.bounds.height - longFormYPosition + + backgroundView.dimState = .percent(1 - presentedView.frame.origin.y / maxHeight) + } + + /** + Finds the nearest value to a given number out of a given array of float values + + - Parameters: + - number: reference float we are trying to find the closest value to + - values: array of floats we would like to compare against + */ + func nearest(to number: CGFloat, inValues values: [CGFloat]) -> CGFloat { + guard let nearestVal = values.min(by: { abs(number - $0) < abs(number - $1) }) + else { return number } + return nearestVal + } +} + +// MARK: - UIScrollView Observer + +private extension PanModalPresentationController { + + /** + Creates & stores an observer on the given scroll view's content offset. + This allows us to track scrolling without overriding the scrollView delegate + */ + func observe(scrollView: UIScrollView?) { + scrollObserver?.invalidate() + scrollObserver = scrollView?.observe(\.contentOffset, options: .old) { [weak self] scrollView, change in + + /** + Incase we have a situation where we have two containerViews in the same presentation + */ + guard self?.containerView != nil + else { return } + + self?.didPanOnScrollView(scrollView, change: change) + } + } + + /** + Scroll view content offset change event handler + + Also when scrollView is scrolled to the top, we disable the scroll indicator + otherwise glitchy behaviour occurs + + This is also shown in Apple Maps (reverse engineering) + which allows us to seamlessly transition scrolling from the panContainerView to the scrollView + */ + func didPanOnScrollView(_ scrollView: UIScrollView, change: NSKeyValueObservedChange) { + + guard + !presentedViewController.isBeingDismissed, + !presentedViewController.isBeingPresented + else { return } + + if !isPresentedViewAnchored && scrollView.contentOffset.y > 0 { + + /** + Hold the scrollView in place if we're actively scrolling and not handling top bounce + */ + haltScrolling(scrollView) + + } else if scrollView.isScrolling || isPresentedViewAnimating { + + if isPresentedViewAnchored { + /** + While we're scrolling upwards on the scrollView, + store the last content offset position + */ + trackScrolling(scrollView) + } else { + /** + Keep scroll view in place while we're panning on main view + */ + haltScrolling(scrollView) + } + + } else if presentedViewController.view.isKind(of: UIScrollView.self) + && !isPresentedViewAnimating && scrollView.contentOffset.y <= 0 { + + /** + In the case where we drag down quickly on the scroll view and let go, + `handleScrollViewTopBounce` adds a nice elegant touch. + */ + handleScrollViewTopBounce(scrollView: scrollView, change: change) + } else { + trackScrolling(scrollView) + } + } + + /** + Halts the scroll of a given scroll view & anchors it at the `scrollViewYOffset` + */ + func haltScrolling(_ scrollView: UIScrollView) { + scrollView.setContentOffset(CGPoint(x: 0, y: scrollViewYOffset), animated: false) + scrollView.showsVerticalScrollIndicator = false + } + + /** + As the user scrolls, track & save the scroll view y offset. + This helps halt scrolling when we want to hold the scroll view in place. + */ + func trackScrolling(_ scrollView: UIScrollView) { + scrollViewYOffset = max(scrollView.contentOffset.y, 0) + scrollView.showsVerticalScrollIndicator = true + } + + /** + To ensure that the scroll transition between the scrollView & the modal + is completely seamless, we need to handle the case where content offset is negative. + + In this case, we follow the curve of the decelerating scroll view. + This gives the effect that the modal view and the scroll view are one view entirely. + + - Note: This works best where the view behind view controller is a UIScrollView. + So, for example, a UITableViewController. + */ + func handleScrollViewTopBounce(scrollView: UIScrollView, change: NSKeyValueObservedChange) { + + guard let oldYValue = change.oldValue?.y, scrollView.isDecelerating + else { return } + + let yOffset = scrollView.contentOffset.y + let presentedSize = containerView?.frame.size ?? .zero + + /** + Decrease the view bounds by the y offset so the scroll view stays in place + and we can still get updates on its content offset + */ + presentedView.bounds.size = CGSize(width: presentedSize.width, height: presentedSize.height + yOffset) + + if oldYValue > yOffset { + /** + Move the view in the opposite direction to the decreasing bounds + until half way through the deceleration so that it appears + as if we're transferring the scrollView drag momentum to the entire view + */ + presentedView.frame.origin.y = longFormYPosition - yOffset + } else { + scrollViewYOffset = 0 + snap(toYPosition: longFormYPosition) + } + + scrollView.showsVerticalScrollIndicator = false + } +} + +// MARK: - UIGestureRecognizerDelegate + +extension PanModalPresentationController: UIGestureRecognizerDelegate { + + /** + Do not require any other gesture recognizers to fail + */ + public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool { + return false + } + + /** + Allow simultaneous gesture recognizers only when the other gesture recognizer's view + is the pan scrollable view + */ + public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { + return otherGestureRecognizer.view == presentable?.panScrollable + } +} + +// MARK: - UIBezierPath + +private extension PanModalPresentationController { + + /** + Draws top rounded corners on a given view + We have to set a custom path for corner rounding + because we render the dragIndicator outside of view bounds + */ + func addRoundedCorners(to view: UIView) { + let radius = presentable?.cornerRadius ?? 0 + let path = UIBezierPath(roundedRect: view.bounds, + byRoundingCorners: [.topLeft, .topRight], + cornerRadii: CGSize(width: radius, height: radius)) + + // Set path as a mask to display optional drag indicator view & rounded corners + let mask = CAShapeLayer() + mask.path = path.cgPath + view.layer.mask = mask + + // Improve performance by rasterizing the layer + view.layer.shouldRasterize = true + view.layer.rasterizationScale = UIScreen.main.scale + } + + /** + Draws a path around the drag indicator view + */ + func drawAroundDragIndicator(currentPath path: UIBezierPath, indicatorLeftEdgeXPos: CGFloat) { + + let totalIndicatorOffset = Constants.indicatorYOffset + Constants.dragIndicatorSize.height + + // Draw around drag indicator starting from the left + path.addLine(to: CGPoint(x: indicatorLeftEdgeXPos, y: path.currentPoint.y)) + path.addLine(to: CGPoint(x: path.currentPoint.x, y: path.currentPoint.y - totalIndicatorOffset)) + path.addLine(to: CGPoint(x: path.currentPoint.x + Constants.dragIndicatorSize.width, y: path.currentPoint.y)) + path.addLine(to: CGPoint(x: path.currentPoint.x, y: path.currentPoint.y + totalIndicatorOffset)) + } +} + +// MARK: - Helper Extensions + +private extension UIScrollView { + + /** + A flag to determine if a scroll view is scrolling + */ + var isScrolling: Bool { + return isDragging && !isDecelerating || isTracking + } +} +#endif diff --git a/TIBottomSheet/Sources/PanModal/Delegate/PanModalPresentationDelegate.swift b/TIBottomSheet/Sources/PanModal/Delegate/PanModalPresentationDelegate.swift new file mode 100644 index 00000000..24264b74 --- /dev/null +++ b/TIBottomSheet/Sources/PanModal/Delegate/PanModalPresentationDelegate.swift @@ -0,0 +1,81 @@ +// +// PanModalPresentationDelegate.swift +// PanModal +// +// Copyright © 2019 Tiny Speck, Inc. All rights reserved. +// + +#if os(iOS) +import UIKit + +/** + The PanModalPresentationDelegate conforms to the various transition delegates + and vends the appropriate object for each transition controller requested. + + Usage: + ``` + viewController.modalPresentationStyle = .custom + viewController.transitioningDelegate = PanModalPresentationDelegate.default + ``` + */ +public class PanModalPresentationDelegate: NSObject { + + /** + Returns an instance of the delegate, retained for the duration of presentation + */ + public static var `default`: PanModalPresentationDelegate = { + return PanModalPresentationDelegate() + }() + +} + +extension PanModalPresentationDelegate: UIViewControllerTransitioningDelegate { + + /** + Returns a modal presentation animator configured for the presenting state + */ + public func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? { + return PanModalPresentationAnimator(transitionStyle: .presentation) + } + + /** + Returns a modal presentation animator configured for the dismissing state + */ + public func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { + return PanModalPresentationAnimator(transitionStyle: .dismissal) + } + + /** + Returns a modal presentation controller to coordinate the transition from the presenting + view controller to the presented view controller. + + Changes in size class during presentation are handled via the adaptive presentation delegate + */ + public func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? { + let controller = PanModalPresentationController(presentedViewController: presented, presenting: presenting) + controller.delegate = self + return controller + } + +} + +extension PanModalPresentationDelegate: UIAdaptivePresentationControllerDelegate, UIPopoverPresentationControllerDelegate { + + /** + - Note: We do not adapt to size classes due to the introduction of the UIPresentationController + & deprecation of UIPopoverController (iOS 9), there is no way to have more than one + presentation controller in use during the same presentation + + This is essential when transitioning from .popover to .custom on iPad split view... unless a custom popover view is also implemented + (popover uses UIPopoverPresentationController & we use PanModalPresentationController) + */ + + /** + Dismisses the presented view controller + */ + public func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle { + return .none + } + +} +#endif diff --git a/TIBottomSheet/Sources/PanModal/LICENSE b/TIBottomSheet/Sources/PanModal/LICENSE new file mode 100644 index 00000000..02bc46f1 --- /dev/null +++ b/TIBottomSheet/Sources/PanModal/LICENSE @@ -0,0 +1,19 @@ +Copyright © 2018 Tiny Speck, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/TIBottomSheet/Sources/PanModal/PanModal.h b/TIBottomSheet/Sources/PanModal/PanModal.h new file mode 100644 index 00000000..01451f52 --- /dev/null +++ b/TIBottomSheet/Sources/PanModal/PanModal.h @@ -0,0 +1,19 @@ +// +// PanModal.h +// PanModal +// +// Created by Tosin A on 3/13/19. +// Copyright © 2019 Detail. All rights reserved. +// + +#import + +//! Project version number for PanModal. +FOUNDATION_EXPORT double PanModalVersionNumber; + +//! Project version string for PanModal. +FOUNDATION_EXPORT const unsigned char PanModalVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/TIBottomSheet/Sources/PanModal/Presentable/PanModalHeight.swift b/TIBottomSheet/Sources/PanModal/Presentable/PanModalHeight.swift new file mode 100644 index 00000000..00654f4e --- /dev/null +++ b/TIBottomSheet/Sources/PanModal/Presentable/PanModalHeight.swift @@ -0,0 +1,44 @@ +// +// PanModalHeight.swift +// PanModal +// +// Copyright © 2019 Tiny Speck, Inc. All rights reserved. +// + +#if os(iOS) +import UIKit + +/** + An enum that defines the possible states of the height of a pan modal container view + for a given presentation state (shortForm, longForm) + */ +public enum PanModalHeight: Equatable { + + /** + Sets the height to be the maximum height (+ topOffset) + */ + case maxHeight + + /** + Sets the height to be the max height with a specified top inset. + - Note: A value of 0 is equivalent to .maxHeight + */ + case maxHeightWithTopInset(CGFloat) + + /** + Sets the height to be the specified content height + */ + case contentHeight(CGFloat) + + /** + Sets the height to be the specified content height + & also ignores the bottomSafeAreaInset + */ + case contentHeightIgnoringSafeArea(CGFloat) + + /** + Sets the height to be the intrinsic content height + */ + case intrinsicHeight +} +#endif diff --git a/TIBottomSheet/Sources/PanModal/Presentable/PanModalPresentable+Defaults.swift b/TIBottomSheet/Sources/PanModal/Presentable/PanModalPresentable+Defaults.swift new file mode 100644 index 00000000..fc9edfa1 --- /dev/null +++ b/TIBottomSheet/Sources/PanModal/Presentable/PanModalPresentable+Defaults.swift @@ -0,0 +1,128 @@ +// +// PanModalPresentable+Defaults.swift +// PanModal +// +// Copyright © 2018 Tiny Speck, Inc. All rights reserved. +// + +#if os(iOS) +import UIKit + +/** + Default values for the PanModalPresentable. + */ +public extension PanModalPresentable where Self: UIViewController { + + var topOffset: CGFloat { + topLayoutOffset + } + + var shortFormHeight: PanModalHeight { + return longFormHeight + } + + var mediumFormHeight: PanModalHeight { + longFormHeight + } + + var longFormHeight: PanModalHeight { + + guard let scrollView = panScrollable + else { return .maxHeight } + + // called once during presentation and stored + scrollView.layoutIfNeeded() + return .contentHeight(scrollView.contentSize.height) + } + + var presentationDetents: [ModalViewPresentationDetent] { + [] + } + + var cornerRadius: CGFloat { + return 8.0 + } + + var springDamping: CGFloat { + return 0.8 + } + + var transitionDuration: Double { + return PanModalAnimator.Constants.defaultTransitionDuration + } + + var transitionAnimationOptions: UIView.AnimationOptions { + return [.curveEaseInOut, .allowUserInteraction, .beginFromCurrentState] + } + + var panModalBackgroundColor: UIColor { + return UIColor.black.withAlphaComponent(0.7) + } + + var scrollIndicatorInsets: UIEdgeInsets { + let top = shouldRoundTopCorners ? cornerRadius : 0 + return UIEdgeInsets(top: CGFloat(top), left: 0, bottom: bottomLayoutOffset, right: 0) + } + + var anchorModalToLongForm: Bool { + return true + } + + var allowsExtendedPanScrolling: Bool { + + guard let scrollView = panScrollable + else { return false } + + scrollView.layoutIfNeeded() + return scrollView.contentSize.height > (scrollView.frame.height - bottomLayoutOffset) + } + + var allowsDragToDismiss: Bool { + return true + } + + var allowsTapToDismiss: Bool { + return true + } + + var isUserInteractionEnabled: Bool { + return true + } + + var isHapticFeedbackEnabled: Bool { + return true + } + + var shouldRoundTopCorners: Bool { + return isPanModalPresented + } + + func shouldRespond(to panModalGestureRecognizer: UIPanGestureRecognizer) -> Bool { + return true + } + + func willRespond(to panModalGestureRecognizer: UIPanGestureRecognizer) { + + } + + func shouldTransition(to state: PanModalPresentationController.PresentationState) -> Bool { + return true + } + + func shouldPrioritize(panModalGestureRecognizer: UIPanGestureRecognizer) -> Bool { + return false + } + + func willTransition(to state: PanModalPresentationController.PresentationState) { + + } + + func panModalWillDismiss() { + + } + + func panModalDidDismiss() { + + } +} +#endif diff --git a/TIBottomSheet/Sources/PanModal/Presentable/PanModalPresentable+LayoutHelpers.swift b/TIBottomSheet/Sources/PanModal/Presentable/PanModalPresentable+LayoutHelpers.swift new file mode 100644 index 00000000..0e93abe6 --- /dev/null +++ b/TIBottomSheet/Sources/PanModal/Presentable/PanModalPresentable+LayoutHelpers.swift @@ -0,0 +1,126 @@ +// +// PanModalPresentable+LayoutHelpers.swift +// PanModal +// +// Copyright © 2018 Tiny Speck, Inc. All rights reserved. +// + +#if os(iOS) +import UIKit + +/** + ⚠️ [Internal Only] ⚠️ + Helper extensions that handle layout in the PanModalPresentationController + */ +extension PanModalPresentable where Self: UIViewController { + + /** + Cast the presentation controller to PanModalPresentationController + so we can access PanModalPresentationController properties and methods + */ + var presentedVC: PanModalPresentationController? { + return presentationController as? PanModalPresentationController + } + + /** + Length of the top layout guide of the presenting view controller. + Gives us the safe area inset from the top. + */ + var topLayoutOffset: CGFloat { + + guard let rootVC = rootViewController + else { return 0} + + if #available(iOS 11.0, *) { return rootVC.view.safeAreaInsets.top } else { return rootVC.topLayoutGuide.length } + } + + /** + Length of the bottom layout guide of the presenting view controller. + Gives us the safe area inset from the bottom. + */ + var bottomLayoutOffset: CGFloat { + + guard let rootVC = rootViewController + else { return 0} + + if #available(iOS 11.0, *) { return rootVC.view.safeAreaInsets.bottom } else { return rootVC.bottomLayoutGuide.length } + } + + /** + Returns the short form Y position + + - Note: If voiceover is on, the `longFormYPos` is returned. + We do not support short form when voiceover is on as it would make it difficult for user to navigate. + */ + var shortFormYPos: CGFloat { + + guard !UIAccessibility.isVoiceOverRunning + else { return longFormYPos } + + let shortFormYPos = topMargin(from: shortFormHeight) + topOffset + + // shortForm shouldn't exceed longForm + return max(shortFormYPos, longFormYPos) + } + + var mediumFormYPos: CGFloat { + let mediumFormYPos = topMargin(from: mediumFormHeight) + + return max(mediumFormYPos, longFormYPos) + } + + /** + Returns the long form Y position + + - Note: We cap this value to the max possible height + to ensure content is not rendered outside of the view bounds + */ + var longFormYPos: CGFloat { + return max(topMargin(from: longFormHeight), topMargin(from: .maxHeight)) + topOffset + } + + /** + Use the container view for relative positioning as this view's frame + is adjusted in PanModalPresentationController + */ + var bottomYPos: CGFloat { + + guard let container = presentedVC?.containerView + else { return view.bounds.height } + + return container.bounds.size.height - topOffset + } + + /** + Converts a given pan modal height value into a y position value + calculated from top of view + */ + func topMargin(from: PanModalHeight) -> CGFloat { + switch from { + case .maxHeight: + return 0.0 + case .maxHeightWithTopInset(let inset): + return inset + case .contentHeight(let height): + return bottomYPos - (height + bottomLayoutOffset) + case .contentHeightIgnoringSafeArea(let height): + return bottomYPos - height + case .intrinsicHeight: + view.layoutIfNeeded() + let targetSize = CGSize(width: (presentedVC?.containerView?.bounds ?? UIScreen.main.bounds).width, + height: UIView.layoutFittingCompressedSize.height) + let intrinsicHeight = view.systemLayoutSizeFitting(targetSize).height + return bottomYPos - (intrinsicHeight + bottomLayoutOffset) + } + } + + private var rootViewController: UIViewController? { + + guard let application = UIApplication.value(forKeyPath: #keyPath(UIApplication.shared)) as? UIApplication + else { return nil } + + return application.keyWindow?.rootViewController + } + +} +#endif diff --git a/TIBottomSheet/Sources/PanModal/Presentable/PanModalPresentable+UIViewController.swift b/TIBottomSheet/Sources/PanModal/Presentable/PanModalPresentable+UIViewController.swift new file mode 100644 index 00000000..8de82fd5 --- /dev/null +++ b/TIBottomSheet/Sources/PanModal/Presentable/PanModalPresentable+UIViewController.swift @@ -0,0 +1,63 @@ +// +// PanModalPresentable+UIViewController.swift +// PanModal +// +// Copyright © 2018 Tiny Speck, Inc. All rights reserved. +// + +#if os(iOS) +import UIKit + +/** + Extends PanModalPresentable with helper methods + when the conforming object is a UIViewController + */ +public extension PanModalPresentable where Self: UIViewController { + + typealias AnimationBlockType = () -> Void + typealias AnimationCompletionType = (Bool) -> Void + + /** + For Presentation, the object must be a UIViewController & confrom to the PanModalPresentable protocol. + */ + typealias LayoutType = UIViewController & PanModalPresentable + + /** + A function wrapper over the `transition(to state: PanModalPresentationController.PresentationState)` + function in the PanModalPresentationController. + */ + func panModalTransition(to state: PanModalPresentationController.PresentationState) { + presentedVC?.transition(to: state) + } + + /** + A function wrapper over the `setNeedsLayoutUpdate()` + function in the PanModalPresentationController. + + - Note: This should be called whenever any of the values for the PanModalPresentable protocol are changed. + */ + func panModalSetNeedsLayoutUpdate() { + presentedVC?.setNeedsLayoutUpdate() + } + + /** + Operations on the scroll view, such as content height changes, or when inserting/deleting rows can cause the pan modal to jump, + caused by the pan modal responding to content offset changes. + + To avoid this, you can call this method to perform scroll view updates, with scroll observation temporarily disabled. + */ + func panModalPerformUpdates(_ updates: () -> Void) { + presentedVC?.performUpdates(updates) + } + + /** + A function wrapper over the animate function in PanModalAnimator. + + This can be used for animation consistency on views within the presented view controller. + */ + func panModalAnimate(_ animationBlock: @escaping AnimationBlockType, _ completion: AnimationCompletionType? = nil) { + PanModalAnimator.animate(animationBlock, config: self, completion) + } + +} +#endif diff --git a/TIBottomSheet/Sources/PanModal/Presentable/PanModalPresentable.swift b/TIBottomSheet/Sources/PanModal/Presentable/PanModalPresentable.swift new file mode 100644 index 00000000..aa008aed --- /dev/null +++ b/TIBottomSheet/Sources/PanModal/Presentable/PanModalPresentable.swift @@ -0,0 +1,231 @@ +// +// PanModalPresentable.swift +// PanModal +// +// Copyright © 2017 Tiny Speck, Inc. All rights reserved. +// + +#if os(iOS) +import TISwiftUtils +import UIKit + +/** + This is the configuration object for a view controller + that will be presented using the PanModal transition. + + Usage: + ``` + extension YourViewController: PanModalPresentable { + func shouldRoundTopCorners: Bool { return false } + } + ``` + */ +public protocol PanModalPresentable: AnyObject { + + /** + The scroll view embedded in the view controller. + Setting this value allows for seamless transition scrolling between the embedded scroll view + and the pan modal container view. + */ + var panScrollable: UIScrollView? { get } + + /** + The offset between the top of the screen and the top of the pan modal container view. + + Default value is the topLayoutGuide.length + 21.0. + */ + var topOffset: CGFloat { get } + + /** + The height of the pan modal container view + when in the shortForm presentation state. + + This value is capped to .max, if provided value exceeds the space available. + + Default value is the longFormHeight. + */ + var shortFormHeight: PanModalHeight { get } + + var mediumFormHeight: PanModalHeight { get } + + /** + The height of the pan modal container view + when in the longForm presentation state. + + This value is capped to .max, if provided value exceeds the space available. + + Default value is .max. + */ + var longFormHeight: PanModalHeight { get } + + var presentationDetents: [ModalViewPresentationDetent] { get } + + var dimmedViewType: DimmedView.AppearanceType { get } + /** + The corner radius used when `shouldRoundTopCorners` is enabled. + + Default Value is 8.0. + */ + var cornerRadius: CGFloat { get } + + /** + The springDamping value used to determine the amount of 'bounce' + seen when transitioning to short/long form. + + Default Value is 0.8. + */ + var springDamping: CGFloat { get } + + /** + The transitionDuration value is used to set the speed of animation during a transition, + including initial presentation. + + Default value is 0.5. + */ + var transitionDuration: Double { get } + + /** + The animation options used when performing animations on the PanModal, utilized mostly + during a transition. + + Default value is [.curveEaseInOut, .allowUserInteraction, .beginFromCurrentState]. + */ + var transitionAnimationOptions: UIView.AnimationOptions { get } + + /** + The background view color. + + - Note: This is only utilized at the very start of the transition. + + Default Value is black with alpha component 0.7. + */ + var panModalBackgroundColor: UIColor { get } + + /** + We configure the panScrollable's scrollIndicatorInsets interally so override this value + to set custom insets. + + - Note: Use `panModalSetNeedsLayoutUpdate()` when updating insets. + */ + var scrollIndicatorInsets: UIEdgeInsets { get } + + /** + A flag to determine if scrolling should be limited to the longFormHeight. + Return false to cap scrolling at .max height. + + Default value is true. + */ + var anchorModalToLongForm: Bool { get } + + /** + A flag to determine if scrolling should seamlessly transition from the pan modal container view to + the embedded scroll view once the scroll limit has been reached. + + Default value is false. Unless a scrollView is provided and the content height exceeds the longForm height. + */ + var allowsExtendedPanScrolling: Bool { get } + + /** + A flag to determine if dismissal should be initiated when swiping down on the presented view. + + Return false to fallback to the short form state instead of dismissing. + + Default value is true. + */ + var allowsDragToDismiss: Bool { get } + var onTapToDismiss: VoidClosure? { get } + var onDragToDismiss: VoidClosure? { get } + + /** + A flag to determine if dismissal should be initiated when tapping on the dimmed background view. + + Default value is true. + */ + var allowsTapToDismiss: Bool { get } + + /** + A flag to toggle user interactions on the container view. + + - Note: Return false to forward touches to the presentingViewController. + + Default is true. + */ + var isUserInteractionEnabled: Bool { get } + + /** + A flag to determine if haptic feedback should be enabled during presentation. + + Default value is true. + */ + var isHapticFeedbackEnabled: Bool { get } + + /** + A flag to determine if the top corners should be rounded. + + Default value is true. + */ + var shouldRoundTopCorners: Bool { get } + + + /** + Asks the delegate if the pan modal should respond to the pan modal gesture recognizer. + + Return false to disable movement on the pan modal but maintain gestures on the presented view. + + Default value is true. + */ + func shouldRespond(to panModalGestureRecognizer: UIPanGestureRecognizer) -> Bool + + /** + Notifies the delegate when the pan modal gesture recognizer state is either + `began` or `changed`. This method gives the delegate a chance to prepare + for the gesture recognizer state change. + + For example, when the pan modal view is about to scroll. + + Default value is an empty implementation. + */ + func willRespond(to panModalGestureRecognizer: UIPanGestureRecognizer) + + /** + Asks the delegate if the pan modal gesture recognizer should be prioritized. + + For example, you can use this to define a region + where you would like to restrict where the pan gesture can start. + + If false, then we rely solely on the internal conditions of when a pan gesture + should succeed or fail, such as, if we're actively scrolling on the scrollView. + + Default return value is false. + */ + func shouldPrioritize(panModalGestureRecognizer: UIPanGestureRecognizer) -> Bool + + /** + Asks the delegate if the pan modal should transition to a new state. + + Default value is true. + */ + func shouldTransition(to state: PanModalPresentationController.PresentationState) -> Bool + + /** + Notifies the delegate that the pan modal is about to transition to a new state. + + Default value is an empty implementation. + */ + func willTransition(to state: PanModalPresentationController.PresentationState) + + /** + Notifies the delegate that the pan modal is about to be dismissed. + + Default value is an empty implementation. + */ + func panModalWillDismiss() + + /** + Notifies the delegate after the pan modal is dismissed. + + Default value is an empty implementation. + */ + func panModalDidDismiss() +} +#endif diff --git a/TIBottomSheet/Sources/PanModal/Presenter/PanModalPresenter.swift b/TIBottomSheet/Sources/PanModal/Presenter/PanModalPresenter.swift new file mode 100644 index 00000000..8763fdac --- /dev/null +++ b/TIBottomSheet/Sources/PanModal/Presenter/PanModalPresenter.swift @@ -0,0 +1,38 @@ +// +// PanModalPresenter.swift +// PanModal +// +// Copyright © 2019 Tiny Speck, Inc. All rights reserved. +// + +#if os(iOS) +import UIKit + +/** + A protocol for objects that will present a view controller as a PanModal + + - Usage: + ``` + viewController.presentPanModal(viewControllerToPresent: presentingVC, + sourceView: presentingVC.view, + sourceRect: .zero) + ``` + */ +protocol PanModalPresenter: AnyObject { + + /** + A flag that returns true if the current presented view controller + is using the PanModalPresentationDelegate + */ + var isPanModalPresented: Bool { get } + + /** + Presents a view controller that conforms to the PanModalPresentable protocol + */ + func presentPanModal(_ viewControllerToPresent: PanModalPresentable.LayoutType, + sourceView: UIView?, + sourceRect: CGRect, + completion: (() -> Void)?) + +} +#endif diff --git a/TIBottomSheet/Sources/PanModal/Presenter/UIViewController+PanModalPresenter.swift b/TIBottomSheet/Sources/PanModal/Presenter/UIViewController+PanModalPresenter.swift new file mode 100644 index 00000000..b252d8f7 --- /dev/null +++ b/TIBottomSheet/Sources/PanModal/Presenter/UIViewController+PanModalPresenter.swift @@ -0,0 +1,66 @@ +// +// UIViewController+PanModalPresenterProtocol.swift +// PanModal +// +// Copyright © 2019 Tiny Speck, Inc. All rights reserved. +// + +#if os(iOS) +import UIKit + +/** + Extends the UIViewController to conform to the PanModalPresenter protocol + */ +extension UIViewController: PanModalPresenter { + + /** + A flag that returns true if the topmost view controller in the navigation stack + was presented using the custom PanModal transition + + - Warning: ⚠️ Calling `presentationController` in this function may cause a memory leak. ⚠️ + + In most cases, this check will be used early in the view lifecycle and unfortunately, + there's an Apple bug that causes multiple presentationControllers to be created if + the presentationController is referenced here and called too early resulting in + a strong reference to this view controller and in turn, creating a memory leak. + */ + public var isPanModalPresented: Bool { + return (transitioningDelegate as? PanModalPresentationDelegate) != nil + } + + /** + Configures a view controller for presentation using the PanModal transition + + - Parameters: + - viewControllerToPresent: The view controller to be presented + - sourceView: The view containing the anchor rectangle for the popover. + - sourceRect: The rectangle in the specified view in which to anchor the popover. + - completion: The block to execute after the presentation finishes. You may specify nil for this parameter. + + - Note: sourceView & sourceRect are only required for presentation on an iPad. + */ + public func presentPanModal(_ viewControllerToPresent: PanModalPresentable.LayoutType, + sourceView: UIView? = nil, + sourceRect: CGRect = .zero, + completion: (() -> Void)? = nil) { + + /** + Here, we deliberately do not check for size classes. More info in `PanModalPresentationDelegate` + */ + + if UIDevice.current.userInterfaceIdiom == .pad { + viewControllerToPresent.modalPresentationStyle = .popover + viewControllerToPresent.popoverPresentationController?.sourceRect = sourceRect + viewControllerToPresent.popoverPresentationController?.sourceView = sourceView ?? view + viewControllerToPresent.popoverPresentationController?.delegate = PanModalPresentationDelegate.default + } else { + viewControllerToPresent.modalPresentationStyle = .custom + viewControllerToPresent.modalPresentationCapturesStatusBarAppearance = true + viewControllerToPresent.transitioningDelegate = PanModalPresentationDelegate.default + } + + present(viewControllerToPresent, animated: true, completion: completion) + } + +} +#endif diff --git a/TIBottomSheet/Sources/PanModal/View/DimmedView.swift b/TIBottomSheet/Sources/PanModal/View/DimmedView.swift new file mode 100644 index 00000000..8ca838d2 --- /dev/null +++ b/TIBottomSheet/Sources/PanModal/View/DimmedView.swift @@ -0,0 +1,131 @@ +// +// DimmedView.swift +// PanModal +// +// Copyright © 2017 Tiny Speck, Inc. All rights reserved. +// + +#if os(iOS) +import TISwiftUtils +import TIUIKitCore +import TIUIElements +import UIKit + +/** + A dim view for use as an overlay over content you want dimmed. + */ +public class DimmedView: BaseInitializableView { + + public enum AppearanceType { + + case transparent + case transparentWithShadow(UIViewShadow) + case opaque + + var isTransparent: Bool { + switch self { + case .transparent, .transparentWithShadow: + return true + + default: + return false + } + } + } + + /** + Represents the possible states of the dimmed view. + max, off or a percentage of dimAlpha. + */ + enum DimState { + case max + case off + case percent(CGFloat) + } + + // MARK: - Properties + + /** + The state of the dimmed view + */ + var dimState: DimState = .off { + didSet { + guard !appearanceType.isTransparent else { + alpha = .zero + return + } + + switch dimState { + case .max: + alpha = 1.0 + case .off: + alpha = 0.0 + case .percent(let percentage): + alpha = max(0.0, min(1.0, percentage)) + } + } + } + + weak var presentingController: UIViewController? + var appearanceType: AppearanceType + + /** + The closure to be executed when a tap occurs + */ + var didTap: VoidClosure? + + // MARK: - Initializers + + init(presentingController: UIViewController? = nil, + dimColor: UIColor = UIColor.black.withAlphaComponent(0.7), + appearanceType: AppearanceType) { + + self.presentingController = presentingController + self.appearanceType = appearanceType + + super.init(frame: .zero) + + alpha = 0.0 + backgroundColor = dimColor + } + + required public init?(coder aDecoder: NSCoder) { + fatalError() + } + + // MARK: - BaseInitializableView + + public override func bindViews() { + super.bindViews() + + let tapGesture = UITapGestureRecognizer(target: self, action: #selector(didTapView)) + addGestureRecognizer(tapGesture) + } + + // MARK: - Overrides + + public override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { + if appearanceType.isTransparent { + let subviews = presentingController?.view.subviews.reversed() ?? [] + + for subview in subviews { + if let hittedView = subview.hitTest(point, with: event) { + return hittedView + } + } + } + + return super.hitTest(point, with: event) + } + + public override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { + !appearanceType.isTransparent + } + + // MARK: - Event Handlers + + @objc private func didTapView() { + didTap?() + } +} +#endif diff --git a/TIBottomSheet/Sources/PanModal/View/PanContainerView.swift b/TIBottomSheet/Sources/PanModal/View/PanContainerView.swift new file mode 100644 index 00000000..f5c2892b --- /dev/null +++ b/TIBottomSheet/Sources/PanModal/View/PanContainerView.swift @@ -0,0 +1,44 @@ +// +// PanContainerView.swift +// PanModal +// +// Copyright © 2018 Tiny Speck, Inc. All rights reserved. +// + +#if os(iOS) +import UIKit + +/** + A view wrapper around the presented view in a PanModal transition. + + This allows us to make modifications to the presented view without + having to do those changes directly on the view + */ +class PanContainerView: UIView { + + init(presentedView: UIView, frame: CGRect) { + super.init(frame: frame) + addSubview(presentedView) + } + + @available(*, unavailable) + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +extension UIView { + + /** + Convenience property for retrieving a PanContainerView instance + from the view hierachy + */ + var panContainerView: PanContainerView? { + return subviews.first(where: { view -> Bool in + view is PanContainerView + }) as? PanContainerView + } + +} +#endif diff --git a/TIUIElements/Sources/Appearance/UIView+Layout.swift b/TIUIElements/Sources/Appearance/UIView+Layout.swift new file mode 100644 index 00000000..e3ae3027 --- /dev/null +++ b/TIUIElements/Sources/Appearance/UIView+Layout.swift @@ -0,0 +1,8 @@ +// +// File.swift +// +// +// Created by Nikita Semenov on 08.06.2023. +// + +import Foundation diff --git a/TIUIElements/Sources/Views/Placeholder/Styles/PlaceholderButtonStyle.swift b/TIUIElements/Sources/Views/Placeholder/Styles/BaseButtonStyle.swift similarity index 98% rename from TIUIElements/Sources/Views/Placeholder/Styles/PlaceholderButtonStyle.swift rename to TIUIElements/Sources/Views/Placeholder/Styles/BaseButtonStyle.swift index ea9e1fdb..7d9b3cc4 100644 --- a/TIUIElements/Sources/Views/Placeholder/Styles/PlaceholderButtonStyle.swift +++ b/TIUIElements/Sources/Views/Placeholder/Styles/BaseButtonStyle.swift @@ -24,7 +24,7 @@ import TIUIKitCore import UIKit -open class PlaceholderButtonStyle { +open class BaseButtonStyle { public var titles: UIControl.StateTitles public var images: UIControl.StateImages diff --git a/TIUIElements/Sources/Views/StatefulButton/StatefulButton+ApplyStyle.swift b/TIUIElements/Sources/Views/StatefulButton/StatefulButton+ApplyStyle.swift new file mode 100644 index 00000000..e3ae3027 --- /dev/null +++ b/TIUIElements/Sources/Views/StatefulButton/StatefulButton+ApplyStyle.swift @@ -0,0 +1,8 @@ +// +// File.swift +// +// +// Created by Nikita Semenov on 08.06.2023. +// + +import Foundation -- 2.40.1 From c06bb56964dca15ffabed7a873a8a8ffd23df7fc Mon Sep 17 00:00:00 2001 From: Nikita Semenov Date: Tue, 13 Jun 2023 05:59:22 +0300 Subject: [PATCH 02/13] fix: remove unused file --- .../BottomSheet/recup_dir.107/f9510598.gz | Bin 4096 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 TIBottomSheet/Sources/BottomSheet/recup_dir.107/f9510598.gz diff --git a/TIBottomSheet/Sources/BottomSheet/recup_dir.107/f9510598.gz b/TIBottomSheet/Sources/BottomSheet/recup_dir.107/f9510598.gz deleted file mode 100644 index 94e0ad63e497fc23325d9257fb66539e0f245090..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmb2|=3oE=;kRK2^Da9GsCqhvc|~7gV3$8IqbZ(O{vet5ee*N5UWg#vO)`iH9ibQFYl3>>`X;GQHfwm5o=xm4mR5K)wVQE@pcUJl zNsPYLscQ<#g#4bDKdRB0@WlK{&0Rgmef}Hz86Hj)DfM?Vee*gJ^pe%AW#-p_gMYdie+ ze=NLp{)f}wd+i-RmS5f Date: Tue, 13 Jun 2023 09:29:53 +0300 Subject: [PATCH 03/13] feat: completed bottom sheet api --- CHANGELOG.md | 5 + Package.swift | 7 +- TIAppleMapUtils/TIAppleMapUtils.podspec | 2 +- TIAuth/TIAuth.podspec | 2 +- .../BaseModalViewController+Appearance.swift | 50 +++ .../BottomSheet/BaseModalViewController.swift | 349 ++++++++++++++++++ .../Extension/UIViewShadow+ModalView.swift | 34 ++ .../Models/ModalViewPresentationDetent.swift | 66 ++++ .../Sources/BottomSheet/Views/DragView.swift | 74 ++++ .../BottomSheet/Views/ModalFooterView.swift | 43 +++ .../BottomSheet/Views/ModalHeaderView.swift | 181 +++++++++ .../PanModalPresentable+Defaults.swift | 17 + TIBottomSheet/TIBottomSheet.podspec | 17 + TIDeeplink/TIDeeplink.podspec | 2 +- TIDeveloperUtils/TIDeveloperUtils.podspec | 2 +- TIEcommerce/TIEcommerce.podspec | 2 +- TIFoundationUtils/TIFoundationUtils.podspec | 2 +- TIGoogleMapUtils/TIGoogleMapUtils.podspec | 2 +- TIKeychainUtils/TIKeychainUtils.podspec | 2 +- TILogging/TILogging.podspec | 2 +- TIMapUtils/TIMapUtils.podspec | 2 +- TIMoyaNetworking/TIMoyaNetworking.podspec | 2 +- TINetworking/TINetworking.podspec | 2 +- TINetworkingCache/TINetworkingCache.podspec | 2 +- TIPagination/TIPagination.podspec | 2 +- TISwiftUICore/TISwiftUICore.podspec | 2 +- .../Extensions/Array/Array+Uniqued.swift | 27 ++ TISwiftUtils/TISwiftUtils.podspec | 2 +- TITableKitUtils/TITableKitUtils.podspec | 2 +- TITextProcessing/TITextProcessing.podspec | 2 +- .../Sources/Helpers/SubviewConstraints.swift | 24 ++ .../Views/Helpers/UIView+ApplyLayout.swift | 38 ++ .../Helpers/WrappedViewLayout+Helpers.swift | 2 +- .../Styles/BasePlaceholderStyle.swift | 4 +- .../Styles/DefaultPlaceholderStyle.swift | 2 +- .../Placeholder/Styles/PlaceholderStyle.swift | 10 +- .../Views/BasePlaceholderImageView.swift | 5 +- .../Views/BasePlaceholderView.swift | 26 +- .../StatefulButton+ApplyStyle.swift | 33 +- .../Containers/ScrollViewWrapper.swift | 52 +++ TIUIElements/TIUIElements.podspec | 2 +- .../UIKit/UIEdgeInsets+Extensions.swift | 10 + TIUIKitCore/TIUIKitCore.podspec | 2 +- TIWebView/TIWebView.podspec | 2 +- TIYandexMapUtils/TIYandexMapUtils.podspec | 2 +- 45 files changed, 1061 insertions(+), 59 deletions(-) create mode 100644 TIBottomSheet/Sources/BottomSheet/BaseModalViewController+Appearance.swift create mode 100644 TIBottomSheet/Sources/BottomSheet/BaseModalViewController.swift create mode 100644 TIBottomSheet/Sources/BottomSheet/Extension/UIViewShadow+ModalView.swift create mode 100644 TIBottomSheet/Sources/BottomSheet/Models/ModalViewPresentationDetent.swift create mode 100644 TIBottomSheet/Sources/BottomSheet/Views/DragView.swift create mode 100644 TIBottomSheet/Sources/BottomSheet/Views/ModalFooterView.swift create mode 100644 TIBottomSheet/Sources/BottomSheet/Views/ModalHeaderView.swift create mode 100644 TIBottomSheet/TIBottomSheet.podspec create mode 100644 TISwiftUtils/Sources/Extensions/Array/Array+Uniqued.swift create mode 100644 TIUIElements/Sources/Views/Helpers/UIView+ApplyLayout.swift create mode 100644 TIUIElements/Sources/Wrappers/Containers/ScrollViewWrapper.swift diff --git a/CHANGELOG.md b/CHANGELOG.md index 91b67ce3..3cf83c94 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +### 1.46.0 + +- **Added**: `BaseModalViewController` implementing `PanModalPresentable` with additional functionality +- **Updated**: Helper methods for `WrappedLayout` and `UIEdgeInsets` + ### 1.45.0 - **Added**: `SingleValueStorage` implementations + `AppInstallLifetimeSingleValueStorage` for automatically removing keychain items on app reinstall. diff --git a/Package.swift b/Package.swift index 18d25962..942e3c42 100644 --- a/Package.swift +++ b/Package.swift @@ -15,6 +15,7 @@ let package = Package( .library(name: "TIUIKitCore", targets: ["TIUIKitCore"]), .library(name: "TIUIElements", targets: ["TIUIElements"]), .library(name: "TIWebView", targets: ["TIWebView"]), + .library(name: "TIBottomSheet", targets: ["TIBottomSheet"]), // MARK: - SwiftUI .library(name: "TISwiftUICore", targets: ["TISwiftUICore"]), @@ -61,9 +62,13 @@ let package = Package( .target(name: "TIUIKitCore", dependencies: ["TISwiftUtils"], path: "TIUIKitCore/Sources"), .target(name: "TIUIElements", dependencies: ["TIUIKitCore", "TISwiftUtils"], path: "TIUIElements/Sources"), .target(name: "TIWebView", dependencies: ["TIUIKitCore", "TISwiftUtils"], path: "TIWebView/Sources"), + .target(name: "TIBottomSheet", dependencies: ["TIUIElements", "TIUIKitCore", "TISwiftUtils"], path: "TIBottomSheet/Sources"), // MARK: - SwiftUI - .target(name: "TISwiftUICore", dependencies: ["TIUIKitCore", "TISwiftUtils"], path: "TISwiftUICore/Sources"), + .target(name: "TISwiftUICore", + dependencies: ["TIUIKitCore", "TISwiftUtils"], + path: "TISwiftUICore/Sources", + plugins: [.plugin(name: "TISwiftLintPlugin")]), // MARK: - Utils diff --git a/TIAppleMapUtils/TIAppleMapUtils.podspec b/TIAppleMapUtils/TIAppleMapUtils.podspec index 6b1c6fc1..b8434269 100644 --- a/TIAppleMapUtils/TIAppleMapUtils.podspec +++ b/TIAppleMapUtils/TIAppleMapUtils.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TIAppleMapUtils' - s.version = '1.45.0' + s.version = '1.46.0' s.summary = 'Set of helpers for map objects clustering and interacting using Apple MapKit.' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TIAuth/TIAuth.podspec b/TIAuth/TIAuth.podspec index d9783051..be7cf4ad 100644 --- a/TIAuth/TIAuth.podspec +++ b/TIAuth/TIAuth.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TIAuth' - s.version = '1.45.0' + s.version = '1.46.0' s.summary = 'Login, registration, confirmation and other related actions' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TIBottomSheet/Sources/BottomSheet/BaseModalViewController+Appearance.swift b/TIBottomSheet/Sources/BottomSheet/BaseModalViewController+Appearance.swift new file mode 100644 index 00000000..53d66d0e --- /dev/null +++ b/TIBottomSheet/Sources/BottomSheet/BaseModalViewController+Appearance.swift @@ -0,0 +1,50 @@ +// +// Copyright (c) 2023 Touch Instinct +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the Software), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import TIUIElements +import TIUIKitCore +import UIKit + +extension BaseModalViewController { + + open class BaseAppearance: UIView.BaseAppearance { + + public var dragViewState: DragView.State + public var headerViewState: ModalHeaderView.State + public var footerViewState: ModalFooterView.State + + public init(layout: UIView.DefaultWrappedLayout = .defaultLayout, + backgroundColor: UIColor = .clear, + border: UIViewBorder = .init(), + shadow: UIViewShadow? = nil, + dragViewState: DragView.State = .hidden, + headerViewState: ModalHeaderView.State = .hidden, + footerViewState: ModalFooterView.State = .hidden) { + + self.dragViewState = dragViewState + self.headerViewState = headerViewState + self.footerViewState = footerViewState + + super.init(layout: layout, backgroundColor: backgroundColor, border: border, shadow: shadow) + } + } +} diff --git a/TIBottomSheet/Sources/BottomSheet/BaseModalViewController.swift b/TIBottomSheet/Sources/BottomSheet/BaseModalViewController.swift new file mode 100644 index 00000000..c30201d7 --- /dev/null +++ b/TIBottomSheet/Sources/BottomSheet/BaseModalViewController.swift @@ -0,0 +1,349 @@ +// +// Copyright (c) 2023 Touch Instinct +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the Software), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import TISwiftUtils +import TIUIElements +import TIUIKitCore +import UIKit + +open class BaseModalViewController: BaseInitializableViewController, PanModalPresentable { + + // MARK: - Public Properties + + public let dragView = DragView() + public let headerView = ModalHeaderView() + private(set) public lazy var contentView = createContentView() + private(set) public lazy var footerView = createFooterView() + + public var dragViewConstraints: SubviewConstraints? + public var headerViewConstraints: SubviewConstraints? + public var contentViewConstraints: SubviewConstraints? + public var footerViewConstraints: SubviewConstraints? + + public var keyboardDidShownObserver: NSObjectProtocol? + public var keyboardDidHiddenObserver: NSObjectProtocol? + + // MARK: - Modal View Controller Configuration + + open var viewControllerAppearance: BaseAppearance { + .init(backgroundColor: .white) + } + + open var panScrollable: UIScrollView? { + contentView as? UIScrollView + } + + open var presentationDetents: [ModalViewPresentationDetent] { + [.maxHeight] + } + + open var headerViewHeight: CGFloat { + let dragViewHeight = getHeight(of: dragView) + let headerViewHeight = getHeight(of: headerView) + let dragViewVerticalInsets = getDragViewVerticalInsets() + let headerViewVerticalInsets = getHeaderViewVerticalInsets() + + return dragViewHeight + headerViewHeight + dragViewVerticalInsets + headerViewVerticalInsets + } + + open var longFormHeight: PanModalHeight { + let detents = getSortedDetents() + + return detents.max()?.panModalHeight(headerHeight: headerViewHeight) ?? .maxHeight + } + + open var mediumFormHeight: PanModalHeight { + let detents = getSortedDetents() + + if detents.count > 1 { + return detents[1].panModalHeight(headerHeight: headerViewHeight) + } + + return detents.first?.panModalHeight(headerHeight: headerViewHeight) ?? .maxHeight + } + + open var shortFormHeight: PanModalHeight { + let detents = getSortedDetents() + + return detents.min()?.panModalHeight(headerHeight: headerViewHeight) ?? .maxHeight + } + + // MARK: - Life Cycle + + deinit { + if let keyboardDidShownObserver { + NotificationCenter.default.removeObserver(keyboardDidShownObserver) + } + + if let keyboardDidHiddenObserver { + NotificationCenter.default.removeObserver(keyboardDidHiddenObserver) + } + } + + open override func viewDidLayoutSubviews() { + super.viewDidLayoutSubviews() + + adjustScrollViewIfNeeded() + } + + // MARK: - BaseInitializableViewController + + open override func addViews() { + super.addViews() + + view.addSubviews(dragView, headerView, contentView, footerView) + } + + open override func configureLayout() { + super.configureLayout() + + configureDragViewLayout() + configureHeaderViewLayout() + configureContentViewLayout() + configureFooterViewLayout() + } + + open override func bindViews() { + super.bindViews() + + keyboardDidShownObserver = NotificationCenter.default + .addObserver(forName: UIResponder.keyboardDidShowNotification, + object: nil, + queue: .main) { [weak self] notification in + self?.configureLayoutForKeyboard(notification, isKeyboardHidden: false) + } + + keyboardDidHiddenObserver = NotificationCenter.default + .addObserver(forName: UIResponder.keyboardDidHideNotification, + object: nil, + queue: .main) { [weak self] notification in + self?.configureLayoutForKeyboard(notification, isKeyboardHidden: true) + } + } + + open override func configureAppearance() { + super.configureAppearance() + + view.configureUIView(appearance: viewControllerAppearance) + configureDragViewAppearance() + configureHeaderViewAppearance() + configureFooterViewAppearance() + } + + // MARK: - Open Methods + + open func createContentView() -> ContentView { + ContentView() + } + + open func createFooterView() -> ModalFooterView { + ModalFooterView() + } + + open func configureLayoutForKeyboard(_ notification: Notification, isKeyboardHidden: Bool) { + guard let height = getKeyboardHeight(notification) else { + return + } + + if let panScrollable { + if isKeyboardHidden { + adjustScrollViewIfNeeded() + } else { + panScrollable.contentInset = .vertical(bottom: height) + } + + } else { + contentViewConstraints?.bottomConstraint?.constant = isKeyboardHidden ? .zero : height + } + } + + open func adjustScrollViewIfNeeded() { + guard let panScrollable, case let .presented(appearance) = viewControllerAppearance.footerViewState else { + return + } + + let verticalInsets = appearance.layout.insets.vertical + let subviewVerticalInsets = appearance.subviewAppearance.layout.insets.vertical + let totalHeight = getHeight(of: footerView) + verticalInsets + subviewVerticalInsets + + panScrollable.contentInset = .vertical(bottom: totalHeight) + } + + // MARK: - Private Methods + + private func configureDragViewLayout() { + guard case let .presented(appearance) = viewControllerAppearance.dragViewState else { + return + } + + dragView.translatesAutoresizingMaskIntoConstraints = false + + let dragViewConstraints = SubviewConstraints( + centerXConstraint: dragView.centerXAnchor.constraint(equalTo: view.centerXAnchor), + topConstraint: dragView.topAnchor.constraint(equalTo: view.topAnchor), + widthConstraint: dragView.widthAnchor.constraint(equalToConstant: .zero), + heightConstraint: dragView.heightAnchor.constraint(equalToConstant: .zero)) + self.dragViewConstraints = dragViewConstraints + + + UIView.configure(layout: appearance.layout, constraints: dragViewConstraints) + NSLayoutConstraint.activate(dragViewConstraints.centerConstraints) + } + + private func configureHeaderViewLayout() { + guard case let .presented(appearance) = viewControllerAppearance.headerViewState else { + return + } + + headerView.translatesAutoresizingMaskIntoConstraints = false + + let isTopView = dragViewConstraints == nil + let headerViewConstraints = SubviewConstraints( + leadingConstraint: headerView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + topConstraint: headerView.topAnchor.constraint(equalTo: isTopView ? view.topAnchor : dragView.bottomAnchor), + trailingConstraint: headerView.trailingAnchor.constraint(equalTo: view.trailingAnchor), + widthConstraint: headerView.widthAnchor.constraint(equalToConstant: .zero), + heightConstraint: headerView.heightAnchor.constraint(equalToConstant: .zero)) + self.headerViewConstraints = headerViewConstraints + + UIView.configure(layout: appearance.layout, constraints: headerViewConstraints) + } + + private func configureContentViewLayout() { + contentView.translatesAutoresizingMaskIntoConstraints = false + + var topView: UIView + + if headerViewConstraints == nil { + if dragViewConstraints == nil { + topView = view + } else { + topView = dragView + } + + } else { + topView = headerView + } + + let contentViewConstraints = SubviewConstraints( + leadingConstraint: contentView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + topConstraint: contentView.topAnchor.constraint(equalTo: topView.bottomAnchor), + trailingConstraint: contentView.trailingAnchor.constraint(equalTo: view.trailingAnchor), + bottomConstraint: contentView.bottomAnchor.constraint(equalTo: view.bottomAnchor)) + self.contentViewConstraints = contentViewConstraints + + NSLayoutConstraint.activate(contentViewConstraints.constraints) + } + + private func configureFooterViewLayout() { + guard case let .presented(appearance) = viewControllerAppearance.footerViewState else { + return + } + + footerView.translatesAutoresizingMaskIntoConstraints = false + + let footerViewConstraints = SubviewConstraints( + leadingConstraint: footerView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + trailingConstraint: footerView.trailingAnchor.constraint(equalTo: view.trailingAnchor), + bottomConstraint: footerView.bottomAnchor.constraint(equalTo: view.bottomAnchor), + widthConstraint: footerView.widthAnchor.constraint(equalToConstant: .zero), + heightConstraint: footerView.heightAnchor.constraint(equalToConstant: .zero)) + self.footerViewConstraints = footerViewConstraints + + NSLayoutConstraint.deactivate(footerViewConstraints.sizeConstraints) + UIView.configure(layout: appearance.layout, constraints: footerViewConstraints) + } + + private func configureDragViewAppearance() { + switch viewControllerAppearance.dragViewState { + case .hidden: + dragView.isHidden = true + + case let .presented(appearance): + dragView.configure(appearance: appearance) + } + } + + private func configureHeaderViewAppearance() { + switch viewControllerAppearance.headerViewState { + case .hidden: + headerView.isHidden = true + + case let .presented(appearance): + headerView.configure(appearance: appearance) + } + } + + private func configureFooterViewAppearance() { + switch viewControllerAppearance.footerViewState { + case .hidden: + footerView.isHidden = true + + case let .presented(appearance): + footerView.configureAppearance(appearance: appearance) + } + } + + private func getSortedDetents() -> [ModalViewPresentationDetent] { + presentationDetents.uniqued().sorted() + } + + private func getHeight(of view: UIView) -> CGFloat { + guard !view.isHidden else { + return .zero + } + + return getFittingSize(forView: view).height + } + + private func getDragViewVerticalInsets() -> CGFloat { + guard case let .presented(appearance) = viewControllerAppearance.dragViewState else { + return .zero + } + + return appearance.layout.insets.vertical + } + + private func getHeaderViewVerticalInsets() -> CGFloat { + guard case let .presented(appearance) = viewControllerAppearance.headerViewState else { + return .zero + } + + return appearance.layout.insets.vertical + } + + private func getFittingSize(forView view: UIView) -> CGSize { + let targetSize = CGSize(width: UIScreen.main.bounds.width, + height: UIView.layoutFittingCompressedSize.height) + + return view.systemLayoutSizeFitting(targetSize) + } + + private func getKeyboardHeight(_ notification: Notification) -> CGFloat? { + guard let userInfo = notification.userInfo else { + return nil + } + + return (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect)?.height + } +} diff --git a/TIBottomSheet/Sources/BottomSheet/Extension/UIViewShadow+ModalView.swift b/TIBottomSheet/Sources/BottomSheet/Extension/UIViewShadow+ModalView.swift new file mode 100644 index 00000000..611798c5 --- /dev/null +++ b/TIBottomSheet/Sources/BottomSheet/Extension/UIViewShadow+ModalView.swift @@ -0,0 +1,34 @@ +// +// Copyright (c) 2023 Touch Instinct +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the Software), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import TIUIKitCore + +extension UIViewShadow { + public static var defaultModalViewShadow: Self { + .init { + Color(.black) + Opacity(0.5) + Offset(0, -5) + Radius(10) + } + } +} diff --git a/TIBottomSheet/Sources/BottomSheet/Models/ModalViewPresentationDetent.swift b/TIBottomSheet/Sources/BottomSheet/Models/ModalViewPresentationDetent.swift new file mode 100644 index 00000000..c01ad4b9 --- /dev/null +++ b/TIBottomSheet/Sources/BottomSheet/Models/ModalViewPresentationDetent.swift @@ -0,0 +1,66 @@ +// +// Copyright (c) 2022 Touch Instinct +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the Software), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +public struct ModalViewPresentationDetent: Hashable { + + // MARK: - Default Values + + public static var headerOnly: ModalViewPresentationDetent { + ModalViewPresentationDetent(height: CGFloat(Int.min)) + } + + public static func height(_ height: CGFloat) -> ModalViewPresentationDetent { + ModalViewPresentationDetent(height: height) + } + + public static var maxHeight: ModalViewPresentationDetent { + ModalViewPresentationDetent(height: CGFloat(Int.max)) + } + + // MARK: - Public Properties + + public var height: CGFloat + + // MARK: - Internal Methods + + func panModalHeight(headerHeight: CGFloat = .zero) -> PanModalHeight { + if self == .headerOnly { + return .contentHeight(headerHeight) + } + + if self == .maxHeight { + return .maxHeight + } + + return .contentHeight(height) + } +} + +// MARK: - Comparable + +extension ModalViewPresentationDetent: Comparable { + public static func < (lhs: ModalViewPresentationDetent, rhs: ModalViewPresentationDetent) -> Bool { + lhs.height < rhs.height + } +} diff --git a/TIBottomSheet/Sources/BottomSheet/Views/DragView.swift b/TIBottomSheet/Sources/BottomSheet/Views/DragView.swift new file mode 100644 index 00000000..1f05d400 --- /dev/null +++ b/TIBottomSheet/Sources/BottomSheet/Views/DragView.swift @@ -0,0 +1,74 @@ +// +// Copyright (c) 2023 Touch Instinct +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the Software), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import TIUIElements +import TIUIKitCore +import UIKit + +public final class DragView: BaseInitializableView, AppearanceConfigurable { + + // MARK: - Nested Types + + private enum Constants { + static var dragViewTopInset: CGFloat { + 8 + } + + static var dragViewBorder: UIViewBorder { + UIViewBorder(cornerRadius: dragViewSize.height / 2, roundedCorners: .allCorners) + } + + static var dragViewBackgroundColor: UIColor { + .lightGray + } + + static var dragViewSize: CGSize { + CGSize(width: 52, height: 7) + } + } + + public enum State { + case hidden + case presented(Appearance) + } + + public final class Appearance: UIView.BaseWrappedAppearance, WrappedViewAppearance { + + public static var defaultAppearance: Appearance { + Self().update { dragView in + dragView.backgroundColor = Constants.dragViewBackgroundColor + dragView.border = Constants.dragViewBorder + + dragView.layout { layout in + layout.size = Constants.dragViewSize + layout.insets = .vertical(top: Constants.dragViewTopInset) + } + } + } + } + + // MARK: - AppearanceConfigurable + + public func configure(appearance: Appearance) { + configureUIView(appearance: appearance) + } +} diff --git a/TIBottomSheet/Sources/BottomSheet/Views/ModalFooterView.swift b/TIBottomSheet/Sources/BottomSheet/Views/ModalFooterView.swift new file mode 100644 index 00000000..d1f00499 --- /dev/null +++ b/TIBottomSheet/Sources/BottomSheet/Views/ModalFooterView.swift @@ -0,0 +1,43 @@ +// +// Copyright (c) 2023 Touch Instinct +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the Software), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import TIUIElements +import TIUIKitCore +import UIKit + +public typealias ModalFooterView = ContainerView + +public extension ModalFooterView { + + // MARK: - Nested Types + + enum State { + case hidden + case presented(UIView.BaseWrappedViewHolderAppearance) + } + + func configureAppearance(appearance: UIView.BaseWrappedViewHolderAppearance) { + wrappedView.configureUIView(appearance: appearance.subviewAppearance) + configureUIView(appearance: appearance) + contentInsets = appearance.subviewAppearance.layout.insets + } +} diff --git a/TIBottomSheet/Sources/BottomSheet/Views/ModalHeaderView.swift b/TIBottomSheet/Sources/BottomSheet/Views/ModalHeaderView.swift new file mode 100644 index 00000000..4383b8ef --- /dev/null +++ b/TIBottomSheet/Sources/BottomSheet/Views/ModalHeaderView.swift @@ -0,0 +1,181 @@ +// +// Copyright (c) 2023 Touch Instinct +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the Software), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import TIUIElements +import TIUIKitCore +import UIKit + +open class ModalHeaderView: BaseInitializableView, AppearanceConfigurable { + + // MARK: - Nested Types + + public enum State { + case hidden + case presented(Appearance) + } + + public enum ContentViewState { + case none + case buttonLeft(BaseButtonStyle) + case buttonRight(BaseButtonStyle) + case buttons(left: BaseButtonStyle, right: BaseButtonStyle) + case custom(view: UIView, appearance: UIView.BaseWrappedAppearance) + } + + // MARK: - Public properties + + public let leftButton = StatefulButton() + public let rightButton = StatefulButton() + + public var leftButtonConstraints: SubviewConstraints? + public var rightButtonConstraints: SubviewConstraints? + public var customViewConstraints: SubviewConstraints? + + // MARK: - BaseInitializableView + + open override func addViews() { + super.addViews() + + addSubviews(leftButton, rightButton) + } + + open override func configureLayout() { + super.configureLayout() + + [leftButton, rightButton] + .forEach { $0.translatesAutoresizingMaskIntoConstraints = false } + + let leftButtonConstraints = SubviewConstraints( + centerYConstraint: leftButton.centerYAnchor.constraint(equalTo: centerYAnchor), + leadingConstraint: leftButton.leadingAnchor.constraint(equalTo: leadingAnchor), + topConstraint: leftButton.topAnchor.constraint(equalTo: topAnchor), + bottomConstraint: leftButton.bottomAnchor.constraint(equalTo: bottomAnchor)) + + let rightButtonConstraints = SubviewConstraints( + centerYConstraint: rightButton.centerYAnchor.constraint(equalTo: centerYAnchor), + topConstraint: rightButton.topAnchor.constraint(equalTo: topAnchor), + trailingConstraint: rightButton.trailingAnchor.constraint(equalTo: trailingAnchor), + bottomConstraint: rightButton.bottomAnchor.constraint(equalTo: bottomAnchor)) + self.leftButtonConstraints = leftButtonConstraints + self.rightButtonConstraints = rightButtonConstraints + + NSLayoutConstraint.activate(leftButtonConstraints.constraints + rightButtonConstraints.constraints) + } + + // MARK: - AppearanceConfigurable + + open func configure(appearance: Appearance) { + configureUIView(appearance: appearance) + + configureContentView(state: appearance.contentViewState) + } + + open func configureContentView(state: ContentViewState) { + var leftButtonStyle: BaseButtonStyle? + var rightButtonStyle: BaseButtonStyle? + + switch state { + case let .buttonLeft(style): + leftButtonStyle = style + + case let .buttonRight(style): + rightButtonStyle = style + + case let .buttons(left, right): + leftButtonStyle = left + rightButtonStyle = right + + case let .custom(view, appearance): + configureCustomView(view, withLayout: appearance.layout) + view.configureUIView(appearance: appearance) + + default: + break + } + + configure(buttonStyle: leftButtonStyle, forButton: leftButton, constraints: leftButtonConstraints) + configure(buttonStyle: rightButtonStyle, forButton: rightButton, constraints: rightButtonConstraints) + } + + // MARK: - Private methods + + private func configureCustomView(_ view: UIView, withLayout layout: WrappedViewLayout) { + addSubview(view) + + view.translatesAutoresizingMaskIntoConstraints = false + + let customViewConstraints = SubviewConstraints( + centerXConstraint: view.centerXAnchor.constraint(equalTo: centerXAnchor), + centerYConstraint: view.centerYAnchor.constraint(equalTo: centerYAnchor), + leadingConstraint: view.leadingAnchor.constraint(equalTo: leadingAnchor), + topConstraint: view.topAnchor.constraint(equalTo: topAnchor), + trailingConstraint: view.trailingAnchor.constraint(equalTo: trailingAnchor), + bottomConstraint: view.bottomAnchor.constraint(equalTo: bottomAnchor)) + self.customViewConstraints = customViewConstraints + + NSLayoutConstraint.deactivate(customViewConstraints.centerConstraints) + + Self.configure(layout: layout, constraints: customViewConstraints) + } + + private func configure(buttonStyle: BaseButtonStyle?, + forButton button: StatefulButton, + constraints: SubviewConstraints?) { + + guard let buttonStyle else { + button.isHidden = true + return + } + + button.isHidden = false + + if let layout = buttonStyle.appearance[.normal]?.layout, let constraints { + UIView.configure(layout: layout, constraints: constraints) + } + + button.apply(style: buttonStyle) + } +} + +// MARK: - Appearance + +extension ModalHeaderView { + + public final class Appearance: UIView.BaseWrappedAppearance, WrappedViewAppearance { + public static var defaultAppearance: Self { + .init() + } + + public var contentViewState: ContentViewState + + public init(layout: UIView.DefaultWrappedLayout = .defaultLayout, + backgroundColor: UIColor = .clear, + border: UIViewBorder = .init(), + shadow: UIViewShadow? = nil, + contentViewState: ContentViewState = .none) { + + self.contentViewState = contentViewState + + super.init(layout: layout, backgroundColor: backgroundColor, border: border, shadow: shadow) + } + } +} diff --git a/TIBottomSheet/Sources/PanModal/Presentable/PanModalPresentable+Defaults.swift b/TIBottomSheet/Sources/PanModal/Presentable/PanModalPresentable+Defaults.swift index fc9edfa1..d6c7dcd4 100644 --- a/TIBottomSheet/Sources/PanModal/Presentable/PanModalPresentable+Defaults.swift +++ b/TIBottomSheet/Sources/PanModal/Presentable/PanModalPresentable+Defaults.swift @@ -6,6 +6,7 @@ // #if os(iOS) +import TISwiftUtils import UIKit /** @@ -13,6 +14,18 @@ import UIKit */ public extension PanModalPresentable where Self: UIViewController { + var onTapToDismiss: VoidClosure? { + { [weak self] in + self?.dismiss(animated: true) + } + } + + var onDragToDismiss: VoidClosure? { + { [weak self] in + self?.dismiss(animated: true) + } + } + var topOffset: CGFloat { topLayoutOffset } @@ -35,6 +48,10 @@ public extension PanModalPresentable where Self: UIViewController { return .contentHeight(scrollView.contentSize.height) } + var dimmedViewType: DimmedView.AppearanceType { + .opaque + } + var presentationDetents: [ModalViewPresentationDetent] { [] } diff --git a/TIBottomSheet/TIBottomSheet.podspec b/TIBottomSheet/TIBottomSheet.podspec new file mode 100644 index 00000000..473f1079 --- /dev/null +++ b/TIBottomSheet/TIBottomSheet.podspec @@ -0,0 +1,17 @@ +Pod::Spec.new do |s| + s.name = 'TIBottomSheet' + s.version = '1.45.0' + s.summary = 'Base models for creating bottom sheet view controllers' + s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name + s.license = { :type => 'MIT', :file => 'LICENSE' } + s.author = { 'castlele' => 'nikita.semenov@touchin.ru', + 'petropavel13' => 'ivan.smolin@touchin.ru'} + s.source = { :git => 'https://git.svc.touchin.ru/TouchInstinct/LeadKit.git', :tag => s.version.to_s } + + s.ios.deployment_target = '11.0' + s.swift_versions = ['5.7'] + + s.source_files = s.name + '/Sources/**/*' + +end + diff --git a/TIDeeplink/TIDeeplink.podspec b/TIDeeplink/TIDeeplink.podspec index 2584a307..14e443fe 100644 --- a/TIDeeplink/TIDeeplink.podspec +++ b/TIDeeplink/TIDeeplink.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TIDeeplink' - s.version = '1.45.0' + s.version = '1.46.0' s.summary = 'Deeplink service API' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TIDeveloperUtils/TIDeveloperUtils.podspec b/TIDeveloperUtils/TIDeveloperUtils.podspec index 688d67f9..67319403 100644 --- a/TIDeveloperUtils/TIDeveloperUtils.podspec +++ b/TIDeveloperUtils/TIDeveloperUtils.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TIDeveloperUtils' - s.version = '1.45.0' + s.version = '1.46.0' s.summary = 'Universal web view API' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TIEcommerce/TIEcommerce.podspec b/TIEcommerce/TIEcommerce.podspec index d843966c..a4726845 100644 --- a/TIEcommerce/TIEcommerce.podspec +++ b/TIEcommerce/TIEcommerce.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TIEcommerce' - s.version = '1.45.0' + s.version = '1.46.0' s.summary = 'Cart, products, promocodes, bonuses and other related actions' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TIFoundationUtils/TIFoundationUtils.podspec b/TIFoundationUtils/TIFoundationUtils.podspec index 3be78475..d70cc0cb 100644 --- a/TIFoundationUtils/TIFoundationUtils.podspec +++ b/TIFoundationUtils/TIFoundationUtils.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TIFoundationUtils' - s.version = '1.45.0' + s.version = '1.46.0' s.summary = 'Set of helpers for Foundation framework classes.' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TIGoogleMapUtils/TIGoogleMapUtils.podspec b/TIGoogleMapUtils/TIGoogleMapUtils.podspec index a5e1af69..9b82172a 100644 --- a/TIGoogleMapUtils/TIGoogleMapUtils.podspec +++ b/TIGoogleMapUtils/TIGoogleMapUtils.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TIGoogleMapUtils' - s.version = '1.45.0' + s.version = '1.46.0' s.summary = 'Set of helpers for map objects clustering and interacting using Google Maps SDK.' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TIKeychainUtils/TIKeychainUtils.podspec b/TIKeychainUtils/TIKeychainUtils.podspec index 0b37df22..d4c542f1 100644 --- a/TIKeychainUtils/TIKeychainUtils.podspec +++ b/TIKeychainUtils/TIKeychainUtils.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TIKeychainUtils' - s.version = '1.45.0' + s.version = '1.46.0' s.summary = 'Set of helpers for Keychain classes.' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TILogging/TILogging.podspec b/TILogging/TILogging.podspec index d47e273a..b6aac309 100644 --- a/TILogging/TILogging.podspec +++ b/TILogging/TILogging.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TILogging' - s.version = '1.45.0' + s.version = '1.46.0' s.summary = 'Logging for TI libraries.' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TIMapUtils/TIMapUtils.podspec b/TIMapUtils/TIMapUtils.podspec index 2ce197c2..7290e8cb 100644 --- a/TIMapUtils/TIMapUtils.podspec +++ b/TIMapUtils/TIMapUtils.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TIMapUtils' - s.version = '1.45.0' + s.version = '1.46.0' s.summary = 'Set of helpers for map objects clustering and interacting.' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TIMoyaNetworking/TIMoyaNetworking.podspec b/TIMoyaNetworking/TIMoyaNetworking.podspec index 7c885bdd..b4e1ae17 100644 --- a/TIMoyaNetworking/TIMoyaNetworking.podspec +++ b/TIMoyaNetworking/TIMoyaNetworking.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TIMoyaNetworking' - s.version = '1.45.0' + s.version = '1.46.0' s.summary = 'Moya + Swagger network service.' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TINetworking/TINetworking.podspec b/TINetworking/TINetworking.podspec index b00f90fd..d46d7558 100644 --- a/TINetworking/TINetworking.podspec +++ b/TINetworking/TINetworking.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TINetworking' - s.version = '1.45.0' + s.version = '1.46.0' s.summary = 'Swagger-frendly networking layer helpers.' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TINetworkingCache/TINetworkingCache.podspec b/TINetworkingCache/TINetworkingCache.podspec index a66652cc..4e18213c 100644 --- a/TINetworkingCache/TINetworkingCache.podspec +++ b/TINetworkingCache/TINetworkingCache.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TINetworkingCache' - s.version = '1.45.0' + s.version = '1.46.0' s.summary = 'Caching results of EndpointRequests.' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TIPagination/TIPagination.podspec b/TIPagination/TIPagination.podspec index 180d8c99..685cf69c 100644 --- a/TIPagination/TIPagination.podspec +++ b/TIPagination/TIPagination.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TIPagination' - s.version = '1.45.0' + s.version = '1.46.0' s.summary = 'Generic pagination component.' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TISwiftUICore/TISwiftUICore.podspec b/TISwiftUICore/TISwiftUICore.podspec index 32478aa0..193415fb 100644 --- a/TISwiftUICore/TISwiftUICore.podspec +++ b/TISwiftUICore/TISwiftUICore.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TISwiftUICore' - s.version = '1.45.0' + s.version = '1.46.0' s.summary = 'Core UI elements: protocols, views and helpers.' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TISwiftUtils/Sources/Extensions/Array/Array+Uniqued.swift b/TISwiftUtils/Sources/Extensions/Array/Array+Uniqued.swift new file mode 100644 index 00000000..a22227ff --- /dev/null +++ b/TISwiftUtils/Sources/Extensions/Array/Array+Uniqued.swift @@ -0,0 +1,27 @@ +// +// Copyright (c) 2023 Touch Instinct +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the Software), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +extension Array where Element: Hashable { + public func uniqued() -> [Element] { + Array(Set(self)) + } +} diff --git a/TISwiftUtils/TISwiftUtils.podspec b/TISwiftUtils/TISwiftUtils.podspec index a8c15a3c..de1784b6 100644 --- a/TISwiftUtils/TISwiftUtils.podspec +++ b/TISwiftUtils/TISwiftUtils.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TISwiftUtils' - s.version = '1.45.0' + s.version = '1.46.0' s.summary = 'Bunch of useful helpers for Swift development.' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TITableKitUtils/TITableKitUtils.podspec b/TITableKitUtils/TITableKitUtils.podspec index 8b3eee32..250c7a03 100644 --- a/TITableKitUtils/TITableKitUtils.podspec +++ b/TITableKitUtils/TITableKitUtils.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TITableKitUtils' - s.version = '1.45.0' + s.version = '1.46.0' s.summary = 'Set of helpers for TableKit classes.' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TITextProcessing/TITextProcessing.podspec b/TITextProcessing/TITextProcessing.podspec index 2ed02fb1..b75e409e 100644 --- a/TITextProcessing/TITextProcessing.podspec +++ b/TITextProcessing/TITextProcessing.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TITextProcessing' - s.version = '1.45.0' + s.version = '1.46.0' s.summary = 'A text processing service helping to get a text mask and a placeholder from incoming regex.' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TIUIElements/Sources/Helpers/SubviewConstraints.swift b/TIUIElements/Sources/Helpers/SubviewConstraints.swift index b02f1e4f..4699cd58 100644 --- a/TIUIElements/Sources/Helpers/SubviewConstraints.swift +++ b/TIUIElements/Sources/Helpers/SubviewConstraints.swift @@ -32,6 +32,25 @@ public struct SubviewConstraints { public var widthConstraint: NSLayoutConstraint? public var heightConstraint: NSLayoutConstraint? + public init(centerXConstraint: NSLayoutConstraint? = nil, + centerYConstraint: NSLayoutConstraint? = nil, + leadingConstraint: NSLayoutConstraint? = nil, + topConstraint: NSLayoutConstraint? = nil, + trailingConstraint: NSLayoutConstraint? = nil, + bottomConstraint: NSLayoutConstraint? = nil, + widthConstraint: NSLayoutConstraint? = nil, + heightConstraint: NSLayoutConstraint? = nil) { + + self.centerXConstraint = centerXConstraint + self.centerYConstraint = centerYConstraint + self.leadingConstraint = leadingConstraint + self.topConstraint = topConstraint + self.trailingConstraint = trailingConstraint + self.bottomConstraint = bottomConstraint + self.widthConstraint = widthConstraint + self.heightConstraint = heightConstraint + } + public var constraints: [NSLayoutConstraint] { [ centerXConstraint, @@ -49,4 +68,9 @@ public struct SubviewConstraints { [widthConstraint, heightConstraint] .compactMap { $0 } } + + public var centerConstraints: [NSLayoutConstraint] { + [centerXConstraint, centerYConstraint] + .compactMap { $0 } + } } diff --git a/TIUIElements/Sources/Views/Helpers/UIView+ApplyLayout.swift b/TIUIElements/Sources/Views/Helpers/UIView+ApplyLayout.swift new file mode 100644 index 00000000..ad0a8bb3 --- /dev/null +++ b/TIUIElements/Sources/Views/Helpers/UIView+ApplyLayout.swift @@ -0,0 +1,38 @@ +// +// Copyright (c) 2023 Touch Instinct +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the Software), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import TIUIKitCore +import UIKit + +extension UIView { + public static func configure(layout: WrappedViewLayout, constraints: SubviewConstraints) { + layout.setupCenterYOffset(centerYConstraint: constraints.centerYConstraint, + topConstraint: constraints.topConstraint, + bottomConstraint: constraints.bottomConstraint) + + layout.setupCenterXOffset(centerXConstraint: constraints.centerXConstraint, + leadingConstraint: constraints.leadingConstraint, + trailingConstraint: constraints.trailingConstraint) + + layout.setupSize(widthConstraint: constraints.widthConstraint, heightConstraint: constraints.heightConstraint) + } +} diff --git a/TIUIElements/Sources/Views/Helpers/WrappedViewLayout+Helpers.swift b/TIUIElements/Sources/Views/Helpers/WrappedViewLayout+Helpers.swift index e9881d1b..acc74976 100644 --- a/TIUIElements/Sources/Views/Helpers/WrappedViewLayout+Helpers.swift +++ b/TIUIElements/Sources/Views/Helpers/WrappedViewLayout+Helpers.swift @@ -23,7 +23,7 @@ import TIUIKitCore import UIKit -extension WrappedViewLayout { +public extension WrappedViewLayout { func setupSize(widthConstraint: NSLayoutConstraint?, heightConstraint: NSLayoutConstraint?) { diff --git a/TIUIElements/Sources/Views/Placeholder/Styles/BasePlaceholderStyle.swift b/TIUIElements/Sources/Views/Placeholder/Styles/BasePlaceholderStyle.swift index a4a052b7..50f56c7c 100644 --- a/TIUIElements/Sources/Views/Placeholder/Styles/BasePlaceholderStyle.swift +++ b/TIUIElements/Sources/Views/Placeholder/Styles/BasePlaceholderStyle.swift @@ -28,12 +28,12 @@ open class BasePlaceholderStyle { public var titleSubtitle: DefaultTitleSubtitleViewModel public var controlsViewAxis: NSLayoutConstraint.Axis public var appearance: Appearance - public var buttonsStyles: [PlaceholderButtonStyle] + public var buttonsStyles: [BaseButtonStyle] public init(titleSubtitle: DefaultTitleSubtitleViewModel = .init(), appearance: Appearance = .defaultAppearance, controlsViewAxis: NSLayoutConstraint.Axis = .vertical, - buttonsStyles: [PlaceholderButtonStyle] = []) { + buttonsStyles: [BaseButtonStyle] = []) { self.titleSubtitle = titleSubtitle self.appearance = appearance diff --git a/TIUIElements/Sources/Views/Placeholder/Styles/DefaultPlaceholderStyle.swift b/TIUIElements/Sources/Views/Placeholder/Styles/DefaultPlaceholderStyle.swift index 6e1f9cb0..1aa7b2b5 100644 --- a/TIUIElements/Sources/Views/Placeholder/Styles/DefaultPlaceholderStyle.swift +++ b/TIUIElements/Sources/Views/Placeholder/Styles/DefaultPlaceholderStyle.swift @@ -36,7 +36,7 @@ public final class DefaultPlaceholderStyle: BasePlaceholderStyle) -> Self { - let buttonStyle = PlaceholderButtonStyle() + func withButton(_ builder: ParameterClosure) -> Self { + let buttonStyle = BaseButtonStyle() builder(buttonStyle) buttonsStyles.append(buttonStyle) @@ -74,7 +74,7 @@ public extension PlaceholderStyle { func withButtons(_ amount: Int, axis: NSLayoutConstraint.Axis, - _ builder: (Int, PlaceholderButtonStyle) -> Void) -> Self { + _ builder: (Int, BaseButtonStyle) -> Void) -> Self { controlsViewAxis = axis @@ -83,7 +83,7 @@ public extension PlaceholderStyle { builder(index, buttonStyle) } else { - let buttonStyle = PlaceholderButtonStyle() + let buttonStyle = BaseButtonStyle() builder(index, buttonStyle) buttonsStyles.append(buttonStyle) diff --git a/TIUIElements/Sources/Views/Placeholder/Views/BasePlaceholderImageView.swift b/TIUIElements/Sources/Views/Placeholder/Views/BasePlaceholderImageView.swift index 40346aae..dc1b94e4 100644 --- a/TIUIElements/Sources/Views/Placeholder/Views/BasePlaceholderImageView.swift +++ b/TIUIElements/Sources/Views/Placeholder/Views/BasePlaceholderImageView.swift @@ -104,7 +104,10 @@ open class BasePlaceholderImageView: UIImageView, configureUIView(appearance: appearance) placeholderView.configureUIView(appearance: appearance.subviewAppearance) - configurePlaceholderLayout(layout: appearance.subviewAppearance.layout) + + if let placeholderConstraints { + UIView.configure(layout: appearance.subviewAppearance.layout, constraints: placeholderConstraints) + } } // MARK: - Private methods diff --git a/TIUIElements/Sources/Views/Placeholder/Views/BasePlaceholderView.swift b/TIUIElements/Sources/Views/Placeholder/Views/BasePlaceholderView.swift index 55663664..dd2083e8 100644 --- a/TIUIElements/Sources/Views/Placeholder/Views/BasePlaceholderView.swift +++ b/TIUIElements/Sources/Views/Placeholder/Views/BasePlaceholderView.swift @@ -143,13 +143,7 @@ open class BasePlaceholderView: BaseInitializableView { style.buttonsStyles.forEach { let button = StatefulButton(type: .custom) - button.set(titles: $0.titles) - button.set(images: $0.images) - button.set(appearance: $0.appearance) - - if let action = $0.action { - button.addTarget(action.target, action: action.action, for: action.event) - } + button.apply(style: $0) controlsStackView.addArrangedSubview(button) } @@ -191,7 +185,7 @@ open class BasePlaceholderView: BaseInitializableView { return } - configureLayout(layout: layout, constraints: imageViewConstraints) + UIView.configure(layout: layout, constraints: imageViewConstraints) } private func configureTextViewLayout(layout: WrappedViewLayout) { @@ -206,7 +200,7 @@ open class BasePlaceholderView: BaseInitializableView { } if let textViewConstraints = textViewConstraints { - configureLayout(layout: layout, constraints: textViewConstraints) + UIView.configure(layout: layout, constraints: textViewConstraints) } } @@ -216,22 +210,10 @@ open class BasePlaceholderView: BaseInitializableView { return } - configureLayout(layout: layout, constraints: controlsViewConstraints) + UIView.configure(layout: layout, constraints: controlsViewConstraints) controlsStackView.spacing = layout.spacing } - private func configureLayout(layout: WrappedViewLayout, constraints: SubviewConstraints) { - layout.setupSize(widthConstraint: constraints.widthConstraint, heightConstraint: constraints.heightConstraint) - - layout.setupCenterYOffset(centerYConstraint: constraints.centerYConstraint, - topConstraint: constraints.topConstraint, - bottomConstraint: constraints.bottomConstraint) - - layout.setupCenterXOffset(centerXConstraint: constraints.centerXConstraint, - leadingConstraint: constraints.leadingConstraint, - trailingConstraint: constraints.trailingConstraint) - } - private func getKeyboardHeight(_ notification: Notification) -> CGFloat? { guard let userInfo = notification.userInfo else { return nil diff --git a/TIUIElements/Sources/Views/StatefulButton/StatefulButton+ApplyStyle.swift b/TIUIElements/Sources/Views/StatefulButton/StatefulButton+ApplyStyle.swift index e3ae3027..da7b1f67 100644 --- a/TIUIElements/Sources/Views/StatefulButton/StatefulButton+ApplyStyle.swift +++ b/TIUIElements/Sources/Views/StatefulButton/StatefulButton+ApplyStyle.swift @@ -1,8 +1,33 @@ // -// File.swift -// +// Copyright (c) 2023 Touch Instinct // -// Created by Nikita Semenov on 08.06.2023. +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the Software), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. // -import Foundation +extension StatefulButton { + public func apply(style: BaseButtonStyle) { + set(titles: style.titles) + set(images: style.images) + set(appearance: style.appearance) + + if let action = style.action { + addTarget(action.target, action: action.action, for: action.event) + } + } +} diff --git a/TIUIElements/Sources/Wrappers/Containers/ScrollViewWrapper.swift b/TIUIElements/Sources/Wrappers/Containers/ScrollViewWrapper.swift new file mode 100644 index 00000000..d9672ca4 --- /dev/null +++ b/TIUIElements/Sources/Wrappers/Containers/ScrollViewWrapper.swift @@ -0,0 +1,52 @@ +// +// Copyright (c) 2023 Touch Instinct +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the Software), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import TIUIElements +import UIKit + +public final class ScrollViewWrapper: UIScrollView { + + private let contentView: ContentView + + public override init(frame: CGRect) { + self.contentView = ContentView() + + super.init(frame: .zero) + + addSubview(contentView) + contentView.translatesAutoresizingMaskIntoConstraints = false + + NSLayoutConstraint.activate([ + contentView.leadingAnchor.constraint(equalTo: leadingAnchor), + contentView.trailingAnchor.constraint(equalTo: trailingAnchor), + contentView.topAnchor.constraint(equalTo: topAnchor), + contentView.bottomAnchor.constraint(equalTo: bottomAnchor), + contentView.widthAnchor.constraint(equalTo: widthAnchor) + ]) + } + + required init?(coder: NSCoder) { + contentView = ContentView() + + super.init(coder: coder) + } +} diff --git a/TIUIElements/TIUIElements.podspec b/TIUIElements/TIUIElements.podspec index 7866a8e6..efc65250 100644 --- a/TIUIElements/TIUIElements.podspec +++ b/TIUIElements/TIUIElements.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TIUIElements' - s.version = '1.45.0' + s.version = '1.46.0' s.summary = 'Bunch of useful protocols and views.' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TIUIKitCore/Sources/Extensions/UIKit/UIEdgeInsets+Extensions.swift b/TIUIKitCore/Sources/Extensions/UIKit/UIEdgeInsets+Extensions.swift index 8eb4257c..41d9af39 100644 --- a/TIUIKitCore/Sources/Extensions/UIKit/UIEdgeInsets+Extensions.swift +++ b/TIUIKitCore/Sources/Extensions/UIKit/UIEdgeInsets+Extensions.swift @@ -46,6 +46,16 @@ public extension UIEdgeInsets { .init(top: top, left: .zero, bottom: bottom, right: .zero) } + // MARK: - Computed Properties + + var vertical: CGFloat { + top + bottom + } + + var horizontal: CGFloat { + left + right + } + // MARK: - Instance methods func horizontal(_ insets: CGFloat) -> UIEdgeInsets { diff --git a/TIUIKitCore/TIUIKitCore.podspec b/TIUIKitCore/TIUIKitCore.podspec index dbe86d0c..4dd44d2c 100644 --- a/TIUIKitCore/TIUIKitCore.podspec +++ b/TIUIKitCore/TIUIKitCore.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TIUIKitCore' - s.version = '1.45.0' + s.version = '1.46.0' s.summary = 'Core UI elements: protocols, views and helpers.' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TIWebView/TIWebView.podspec b/TIWebView/TIWebView.podspec index c6a1fb90..35a86c34 100644 --- a/TIWebView/TIWebView.podspec +++ b/TIWebView/TIWebView.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TIWebView' - s.version = '1.45.0' + s.version = '1.46.0' s.summary = 'Universal web view API' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TIYandexMapUtils/TIYandexMapUtils.podspec b/TIYandexMapUtils/TIYandexMapUtils.podspec index 757a8b3c..fd9f99bc 100644 --- a/TIYandexMapUtils/TIYandexMapUtils.podspec +++ b/TIYandexMapUtils/TIYandexMapUtils.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TIYandexMapUtils' - s.version = '1.45.0' + s.version = '1.46.0' s.summary = 'Set of helpers for map objects clustering and interacting using Yandex Maps SDK.' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } -- 2.40.1 From 86fddafcdfbc47e9321abe326487cc9ddbb92881 Mon Sep 17 00:00:00 2001 From: Nikita Semenov Date: Tue, 13 Jun 2023 10:33:20 +0300 Subject: [PATCH 04/13] docs: added playground for bottom sheet --- Package.swift | 9 +- README.md | 1 + TIBottomSheet/PlaygroundPodfile | 10 + TIBottomSheet/TIBottomSheet.app/.gitignore | 4 + .../TIBottomSheet.app/Contents/Info.plist | 28 ++ .../Contents/MacOS/.gitignore | 26 ++ .../TIBottomSheet.app/Contents/MacOS/Podfile | 10 + .../Contents.swift | 94 +++++ .../Sources/NefPlaygroundSupport.swift | 30 ++ .../contents.xcplayground | 2 + .../TIBottomSheet.xcodeproj/project.pbxproj | 340 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcschemes/TIBottomSheet.xcscheme | 76 ++++ .../Contents/MacOS/TIBottomSheet/Info.plist | 24 ++ .../TIBottomSheet.app/Contents/MacOS/launcher | 6 + .../Contents/Resources/AppIcon.icns | Bin 0 -> 37251 bytes .../Contents/Resources/Assets.car | Bin 0 -> 627568 bytes TIBottomSheet/TIBottomSheet.playground | 1 + TIBottomSheet/TIBottomSheet.podspec | 13 +- project-scripts/ordered_modules_list.txt | 3 +- 20 files changed, 679 insertions(+), 5 deletions(-) create mode 100644 TIBottomSheet/PlaygroundPodfile create mode 100644 TIBottomSheet/TIBottomSheet.app/.gitignore create mode 100644 TIBottomSheet/TIBottomSheet.app/Contents/Info.plist create mode 100644 TIBottomSheet/TIBottomSheet.app/Contents/MacOS/.gitignore create mode 100644 TIBottomSheet/TIBottomSheet.app/Contents/MacOS/Podfile create mode 100644 TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/Pages/TIBottomSheet.xcplaygroundpage/Contents.swift create mode 100644 TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/Sources/NefPlaygroundSupport.swift create mode 100644 TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/contents.xcplayground create mode 100644 TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.xcodeproj/project.pbxproj create mode 100644 TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.xcodeproj/xcshareddata/xcschemes/TIBottomSheet.xcscheme create mode 100644 TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet/Info.plist create mode 100755 TIBottomSheet/TIBottomSheet.app/Contents/MacOS/launcher create mode 100644 TIBottomSheet/TIBottomSheet.app/Contents/Resources/AppIcon.icns create mode 100644 TIBottomSheet/TIBottomSheet.app/Contents/Resources/Assets.car create mode 120000 TIBottomSheet/TIBottomSheet.playground diff --git a/Package.swift b/Package.swift index 942e3c42..4470d532 100644 --- a/Package.swift +++ b/Package.swift @@ -62,13 +62,16 @@ let package = Package( .target(name: "TIUIKitCore", dependencies: ["TISwiftUtils"], path: "TIUIKitCore/Sources"), .target(name: "TIUIElements", dependencies: ["TIUIKitCore", "TISwiftUtils"], path: "TIUIElements/Sources"), .target(name: "TIWebView", dependencies: ["TIUIKitCore", "TISwiftUtils"], path: "TIWebView/Sources"), - .target(name: "TIBottomSheet", dependencies: ["TIUIElements", "TIUIKitCore", "TISwiftUtils"], path: "TIBottomSheet/Sources"), + .target(name: "TIBottomSheet", + dependencies: ["TIUIElements", "TIUIKitCore", "TISwiftUtils"], + path: "TIBottomSheet/Sources", + exclude: ["TIBottomSheet.app"], + plugins: [.plugin(name: "TISwiftLintPlugin")]), // MARK: - SwiftUI .target(name: "TISwiftUICore", dependencies: ["TIUIKitCore", "TISwiftUtils"], - path: "TISwiftUICore/Sources", - plugins: [.plugin(name: "TISwiftLintPlugin")]), + path: "TISwiftUICore/Sources"), // MARK: - Utils diff --git a/README.md b/README.md index 9b4f48f6..8734f712 100644 --- a/README.md +++ b/README.md @@ -96,6 +96,7 @@ LICENSE - [TITextProcessing](docs/titextprocessing) * [TITextProcessing](docs/titextprocessing/titextprocessing.md) - [TIDeeplink](docs/tideeplink/deeplinks.md) +- [TIBottomSheet](docs/tibottomsheet/tibottomsheet.md) - [Semantic Commit Messages](docs/semantic-commit-messages.md) - commit message codestyle. - [Snippets](docs/snippets.md) - useful commands and scripts for development. diff --git a/TIBottomSheet/PlaygroundPodfile b/TIBottomSheet/PlaygroundPodfile new file mode 100644 index 00000000..ed76571e --- /dev/null +++ b/TIBottomSheet/PlaygroundPodfile @@ -0,0 +1,10 @@ +ENV["DEVELOPMENT_INSTALL"] = "true" + +target 'TIBottomSheet' do + platform :ios, 11 + use_frameworks! + + pod 'TIUIElements', :path => '../../../../TIUIElements/TIUIElements.podspec' + pod 'TIUIKitCore', :path => '../../../../TIUIKitCore/TIUIKitCore.podspec' + pod 'TISwiftUtils', :path => '../../../../TISwiftUtils/TISwiftUtils.podspec' +end diff --git a/TIBottomSheet/TIBottomSheet.app/.gitignore b/TIBottomSheet/TIBottomSheet.app/.gitignore new file mode 100644 index 00000000..44a647a9 --- /dev/null +++ b/TIBottomSheet/TIBottomSheet.app/.gitignore @@ -0,0 +1,4 @@ +# gitignore nef files +**/build/ +**/nef/ +LICENSE diff --git a/TIBottomSheet/TIBottomSheet.app/Contents/Info.plist b/TIBottomSheet/TIBottomSheet.app/Contents/Info.plist new file mode 100644 index 00000000..831ea97a --- /dev/null +++ b/TIBottomSheet/TIBottomSheet.app/Contents/Info.plist @@ -0,0 +1,28 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + launcher + CFBundleIconFile + AppIcon + CFBundleIconName + AppIcon + CFBundleIdentifier + com.fortysevendeg.nef + CFBundleInfoDictionaryVersion + 6.0 + CFBundleSupportedPlatforms + + MacOSX + + LSApplicationCategoryType + public.app-category.developer-tools + LSMinimumSystemVersion + 10.14 + NSHumanReadableCopyright + Copyright © 2019 The nef Authors. All rights reserved. + + diff --git a/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/.gitignore b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/.gitignore new file mode 100644 index 00000000..18bd1f3b --- /dev/null +++ b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/.gitignore @@ -0,0 +1,26 @@ +## gitignore nef files +**/build/ +**/nef/ +LICENSE + +## User data +**/xcuserdata/ +podfile.lock +**.DS_Store + +## Obj-C/Swift specific +*.hmap +*.ipa +*.dSYM.zip +*.dSYM + +## CocoaPods +**Pods** + +## Carthage +**Carthage** + +## SPM +.build +.swiftpm +swiftpm diff --git a/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/Podfile b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/Podfile new file mode 100644 index 00000000..ed76571e --- /dev/null +++ b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/Podfile @@ -0,0 +1,10 @@ +ENV["DEVELOPMENT_INSTALL"] = "true" + +target 'TIBottomSheet' do + platform :ios, 11 + use_frameworks! + + pod 'TIUIElements', :path => '../../../../TIUIElements/TIUIElements.podspec' + pod 'TIUIKitCore', :path => '../../../../TIUIKitCore/TIUIKitCore.podspec' + pod 'TISwiftUtils', :path => '../../../../TISwiftUtils/TISwiftUtils.podspec' +end diff --git a/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/Pages/TIBottomSheet.xcplaygroundpage/Contents.swift b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/Pages/TIBottomSheet.xcplaygroundpage/Contents.swift new file mode 100644 index 00000000..2329df12 --- /dev/null +++ b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/Pages/TIBottomSheet.xcplaygroundpage/Contents.swift @@ -0,0 +1,94 @@ +/*: + # TIBottomSheet + + TIBottomSheet содержить базовую реализацию модального котроллера и немного видоизмененную библиотеку PanModal. + + # Базовый контроллер + + Для создания модального котроллера можно унаследоваться от `BaseModalViewController`. Данный клас принимает два generic типа: тип основного контента, тип контента футера. + */ +import TIBottomSheet +import UIKit + +class EmptyViewController: BaseModalViewController { } + +/*: + ## Контент модального контроллера + + Модальный котроллер может содержать следующие элементы: `DragView`, `HeaderView`, `FooterView`. Каждый из них является опциональным и без дополнительных настроек не будет показываться. + + DragView - небольшая view, за которую пользователь "держит" модальный контроллер + HeaderView - контейнер, содержащий в себе кнопки назад/закрыть или какие-то другие элементы управления + FooterView - view, располагающаяся внизу контроллера, поверх всего контента (модальный контроллер уже настроен так, чтобы при скролле в самый низ, футер не перекрывал последнюю ячейку) + + Для настройки каждого у котроллера есть свойство `viewControllerAppearance`. Через него будет настраиваться весь контроллер. Однако стоит заметить, что котроллер не будет настраивать передаваимую вью, содержащую основной контент. Стандартно котроллер будет пытаться расположить контент так, чтобы он заполнил все пространство. + + Вот пример настройки внешнего вида так, чтобы был видет dragView и headerView с левой кнопкой: + */ +class CustomViewController: BaseModalViewController { + override var viewControllerAppearance: BaseAppearance { + let appearance = super.viewControllerAppearance + + appearance.dragViewState = .presented(.defaultAppearance) + appearance.headerViewState = .presented(.make { + $0.backgroundColor = .white + $0.contentViewState = .buttonLeft(.init(titles: [.normal: "Close"], + appearance: [.normal: .init(backgroundColor: .white)])) + }) + + return appearance + } +} + +/*: + ## "Якори" контроллера + + Раньше для настройки высоты контроллера необходимо было пользоваться свойствами `longFormHeight`, `shortFormHeight`. В базовом контроллере можно лишь передать список точек на которых контроллер должен будет задержаться: + */ +class DetentsViewController: BaseModalViewController { + override var presentationDetents: [ModalViewPresentationDetent] { + [.headerOnly, .height(300), .maxHeight] + } +} +/*: + - headerOnly будет сам пытаться вычеслить высоту хедера и dragView, показывая только их + - height(_) будет показывать контроллер на переданной высоте + - maxHeight - вся высота экрана (до safeArea) + + В данный массив не рекомендуется передавать больше 3 значений, т.к. модальное окно все равно сможет занять только 3 положения на экране. + + ## DimmedView + + Для контроля `DimmedView` (затемняющей view) есть отдельное свойство `dimmedViewType`. Это перечисление, содержащие следующие кейсы: + + - opaque: dimmedView не прозрачен и чем выше будет подниматься, тем больше будет затемнение. В shortFormHeight прозрачность равна 0.0, в longFormHeight - 1.0. + - transparent: dimmedView полностью прозрачен и будет пропускать все жесты на нижний (показывающий) контроллер + - transparentWithShadow(_) dimmedView полностью прозрачен, однако модальное окно будет отбразывать тень на нижний контроллер. Все жесты так же проходят + + > `UIViewShadow` получил статичное свойство для быстрой настройки тени котроллера + */ +class ShadowViewController: BaseModalViewController { + var dimmedViewType: DimmedView.AppearanceType { + .transparentWithShadow(.defaultModalViewShadow) + } +} + +/*: + ## Контроль закрытия + + `PanModalPresentable` не умеет в настройку закрытия контроллера, делая это самостоятельно через `dismiss(animated:completion:)`. Теперь можно настроить закрытие самостоятельно через свойства: `onTapToDismiss` и `onDragToDismiss`. + + # Взаимедействие с PanModal + + Если нет необходимости или возможности использовать `BaseModalViewController`, вы все так же можете пользоваться протоколом `PanModalRepresentable`. Вот список изменений протокола: + + - `DragView` больше не добавляется самостоятельно автоматически. Однако теперь к нему есть доступ, так что его даже можно как угодно настроить + - Открытие/закрытие модального окна теперь можно настроить с помощью свойств `onTapToDismiss` и `onDragToDismiss` + - Больше нет свойст отвечающих за разрешение закрыть модалку тапом или свайпом. Если какое-то из этих действий необходимо запретить, объявите соответствующее действие (`onTapToDismiss` и `onDragToDismiss`) с nil + - Можно настроить промежуточное состояние модального окна с `mediumFormHeight` + - `DimmedView` остается настраиваемым с помощью `dimmedViewType` свойства + + Через протокол `PanModalPresentable` у вас остается доступ к `presentationDetents`. Однако его установка никак не повлияет на настройку высоты и положений модального окна. + + > Для `BaseModalViewController` все свойства из `PanModalPresentable` все также работают, т.е. вы можете их переопределять, добавлять и изменять по необходимости. + */ diff --git a/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/Sources/NefPlaygroundSupport.swift b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/Sources/NefPlaygroundSupport.swift new file mode 100644 index 00000000..2ffea80a --- /dev/null +++ b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/Sources/NefPlaygroundSupport.swift @@ -0,0 +1,30 @@ +import UIKit + +public protocol NefPlaygroundLiveViewable {} +extension UIView: NefPlaygroundLiveViewable {} +extension UIViewController: NefPlaygroundLiveViewable {} + +#if NOT_IN_PLAYGROUND +public enum Nef { + public enum Playground { + public static func liveView(_ view: NefPlaygroundLiveViewable) {} + public static func needsIndefiniteExecution(_ state: Bool) {} + } +} + +#else +import PlaygroundSupport + +public enum Nef { + public enum Playground { + public static func liveView(_ view: NefPlaygroundLiveViewable) { + PlaygroundPage.current.liveView = (view as! PlaygroundLiveViewable) + } + + public static func needsIndefiniteExecution(_ state: Bool) { + PlaygroundPage.current.needsIndefiniteExecution = state + } + } +} + +#endif diff --git a/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/contents.xcplayground b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/contents.xcplayground new file mode 100644 index 00000000..3debe4b3 --- /dev/null +++ b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/contents.xcplayground @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.xcodeproj/project.pbxproj b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.xcodeproj/project.pbxproj new file mode 100644 index 00000000..180386ce --- /dev/null +++ b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.xcodeproj/project.pbxproj @@ -0,0 +1,340 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXFileReference section */ + 8BACBE8322576CAD00266845 /* TIBottomSheet.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TIBottomSheet.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8BACBE8622576CAD00266845 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8BACBE8022576CAD00266845 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 8B39A26221D40F8700DE2643 = { + isa = PBXGroup; + children = ( + 8BACBE8422576CAD00266845 /* TIBottomSheet */, + 8B39A26C21D40F8700DE2643 /* Products */, + ); + sourceTree = ""; + }; + 8B39A26C21D40F8700DE2643 /* Products */ = { + isa = PBXGroup; + children = ( + 8BACBE8322576CAD00266845 /* TIBottomSheet.framework */, + ); + name = Products; + sourceTree = ""; + }; + 8BACBE8422576CAD00266845 /* TIBottomSheet */ = { + isa = PBXGroup; + children = ( + 8BACBE8622576CAD00266845 /* Info.plist */, + ); + path = TIBottomSheet; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 8BACBE7E22576CAD00266845 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 8BACBE8222576CAD00266845 /* TIBottomSheet */ = { + isa = PBXNativeTarget; + buildConfigurationList = 8BACBE8A22576CAD00266845 /* Build configuration list for PBXNativeTarget "TIBottomSheet" */; + buildPhases = ( + 8BACBE7E22576CAD00266845 /* Headers */, + 8BACBE7F22576CAD00266845 /* Sources */, + 8BACBE8022576CAD00266845 /* Frameworks */, + 8BACBE8122576CAD00266845 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = TIBottomSheet; + productName = TIBottomSheet2; + productReference = 8BACBE8322576CAD00266845 /* TIBottomSheet.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 8B39A26321D40F8700DE2643 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1010; + LastUpgradeCheck = 1200; + ORGANIZATIONNAME = "47 Degrees"; + TargetAttributes = { + 8BACBE8222576CAD00266845 = { + CreatedOnToolsVersion = 10.1; + }; + }; + }; + buildConfigurationList = 8B39A26621D40F8700DE2643 /* Build configuration list for PBXProject "TIBottomSheet" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 8B39A26221D40F8700DE2643; + productRefGroup = 8B39A26C21D40F8700DE2643 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8BACBE8222576CAD00266845 /* TIBottomSheet */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 8BACBE8122576CAD00266845 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 8BACBE7F22576CAD00266845 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 8B39A27721D40F8800DE2643 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_TESTING_SEARCH_PATHS = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 8B39A27821D40F8800DE2643 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTING_SEARCH_PATHS = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 8BACBE8822576CAD00266845 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Manual; + CURRENT_TIBottomSheet_VERSION = 1; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "$(SRCROOT)/TIBottomSheet/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.47deg.ios.TIBottomSheet; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_VERSION = 5; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 8BACBE8922576CAD00266845 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Manual; + CURRENT_TIBottomSheet_VERSION = 1; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "$(SRCROOT)/TIBottomSheet/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.47deg.ios.TIBottomSheet; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_VERSION = 5; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 8B39A26621D40F8700DE2643 /* Build configuration list for PBXProject "TIBottomSheet" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 8B39A27721D40F8800DE2643 /* Debug */, + 8B39A27821D40F8800DE2643 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 8BACBE8A22576CAD00266845 /* Build configuration list for PBXNativeTarget "TIBottomSheet" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 8BACBE8822576CAD00266845 /* Debug */, + 8BACBE8922576CAD00266845 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 8B39A26321D40F8700DE2643 /* Project object */; +} diff --git a/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..bb29c43f --- /dev/null +++ b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.xcodeproj/xcshareddata/xcschemes/TIBottomSheet.xcscheme b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.xcodeproj/xcshareddata/xcschemes/TIBottomSheet.xcscheme new file mode 100644 index 00000000..575e67ee --- /dev/null +++ b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.xcodeproj/xcshareddata/xcschemes/TIBottomSheet.xcscheme @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet/Info.plist b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet/Info.plist new file mode 100644 index 00000000..98d14f60 --- /dev/null +++ b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1.0 + NSHumanReadableCopyright + Copyright © 2019. The nef authors. + + diff --git a/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/launcher b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/launcher new file mode 100755 index 00000000..7451a86d --- /dev/null +++ b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/launcher @@ -0,0 +1,6 @@ +#!/bin/bash + +workspace="TIBottomSheet.xcworkspace" +workspacePath=$(echo "$0" | rev | cut -f2- -d '/' | rev) + +open "`pwd`/$workspacePath/$workspace" diff --git a/TIBottomSheet/TIBottomSheet.app/Contents/Resources/AppIcon.icns b/TIBottomSheet/TIBottomSheet.app/Contents/Resources/AppIcon.icns new file mode 100644 index 0000000000000000000000000000000000000000..32814f1ca17fa4db0700645dcc6235c2112faaf6 GIT binary patch literal 37251 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 literal 0 HcmV?d00001 diff --git a/TIBottomSheet/TIBottomSheet.app/Contents/Resources/Assets.car b/TIBottomSheet/TIBottomSheet.app/Contents/Resources/Assets.car new file mode 100644 index 0000000000000000000000000000000000000000..79d9ea89bf566962afa18f3554de50ad28a82f71 GIT binary patch literal 627568 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

yaud=Tdqkm#7g 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%0AuEF_i9+mYRAhCQX=U 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

aYRq~XGYua!h{<4*4NkZ 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

D@2_>gH0AjyYy$@N(CBa%mY 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%0AA(-JTHOnoYR4Gcgz5O#(_L(?c5TBrps( zIsrlL4|u|F<>jb;BRyR=$owWR+nXnw^P0crS&bHvKQMM+UDOLZLjD! zzjU8hd71{@iw=jOmvK|&&!a}RLb?_s1*jk5Fry?qk4DnH1&CXyh0bv*9a5R2Ooq8L zB6I|Me;JPiZA71&U=6xk#J6F@Gnb6qHs*2P4xF

l7iY%P%i3iH5WzCu!Y0LRSaxJ_Wz?FaB1_+j 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�c*lgO&pPI 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ýl!gY=Ks_F&jj|aWMJ(iDge}fK7eHD787we< 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�yAXDBmDi+xS)QIm`|kDS3G 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 !j=InMI_E?y0=I6NxB{vJ3 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 u(@s1rpn)Peth_VY<2jq) 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 SAHOF+$^<7t6 + s.source_files = sources + s.exclude_files = s.name + '.app' + else + s.source_files = s.name + sources + s.exclude_files = s.name + '/*.app' + end + + s.dependency 'TIUIElements', s.version.to_s + s.dependency 'TIUIKitCore', s.version.to_s + s.dependency 'TISwiftUtils', s.version.to_s end diff --git a/project-scripts/ordered_modules_list.txt b/project-scripts/ordered_modules_list.txt index 49d3f59c..1545b17c 100644 --- a/project-scripts/ordered_modules_list.txt +++ b/project-scripts/ordered_modules_list.txt @@ -19,4 +19,5 @@ TIEcommerce TIWebView TIDeveloperUtils TIDeeplink -TITextProcessing \ No newline at end of file +TITextProcessing +TIBottomSheet -- 2.40.1 From 808d40eca5b2fd3e5b637ff253c636ebaa46bdf8 Mon Sep 17 00:00:00 2001 From: Nikita Semenov Date: Mon, 3 Jul 2023 01:47:52 +0300 Subject: [PATCH 05/13] feat: added bodal wrapper view controller --- CHANGELOG.md | 3 +- Package.swift | 2 +- .../BaseModalWrapperViewController.swift | 42 ++++++ TIBottomSheet/TIBottomSheet.app/.gitignore | 1 - .../Contents.swift | 24 +++- .../Sources/NefTest.swift | 47 +++++++ .../contents.xcplayground | 2 +- .../TIBottomSheet.xcodeproj/project.pbxproj | 56 ++++++++ .../contents.xcworkspacedata | 11 ++ .../BaseViewSkeletonsConfiguration.swift | 1 + .../TextSkeletonsConfiguration.swift | 1 + .../Containers/ScrollViewWrapper.swift | 1 - TIUIElements/TIUIElements.podspec | 2 +- docs/tibottomsheet/tibottomsheet.md | 120 ++++++++++++++++++ 14 files changed, 306 insertions(+), 7 deletions(-) create mode 100644 TIBottomSheet/Sources/BottomSheet/BaseModalWrapperViewController.swift create mode 100644 TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/Sources/NefTest.swift create mode 100644 TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.xcworkspace/contents.xcworkspacedata create mode 100644 docs/tibottomsheet/tibottomsheet.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 3cf83c94..7c3c6353 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,9 @@ # Changelog -### 1.46.0 +### 1.50.0 - **Added**: `BaseModalViewController` implementing `PanModalPresentable` with additional functionality +- **Added**: `BaseModalWrapperViewController` for wrapping `UIViewController`s with `BaseModalViewController` functionality - **Updated**: Helper methods for `WrappedLayout` and `UIEdgeInsets` ### 1.45.0 diff --git a/Package.swift b/Package.swift index 4470d532..c0b55ed1 100644 --- a/Package.swift +++ b/Package.swift @@ -65,7 +65,7 @@ let package = Package( .target(name: "TIBottomSheet", dependencies: ["TIUIElements", "TIUIKitCore", "TISwiftUtils"], path: "TIBottomSheet/Sources", - exclude: ["TIBottomSheet.app"], + exclude: ["../TIBottomSheet.app"], plugins: [.plugin(name: "TISwiftLintPlugin")]), // MARK: - SwiftUI diff --git a/TIBottomSheet/Sources/BottomSheet/BaseModalWrapperViewController.swift b/TIBottomSheet/Sources/BottomSheet/BaseModalWrapperViewController.swift new file mode 100644 index 00000000..5992d04b --- /dev/null +++ b/TIBottomSheet/Sources/BottomSheet/BaseModalWrapperViewController.swift @@ -0,0 +1,42 @@ +// +// Copyright (c) 2023 Touch Instinct +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the Software), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import UIKit + +open class BaseModalWrapperViewController: BaseModalViewController +where ContentViewController: UIViewController { + + private(set) public lazy var contentViewController = createContentViewController() + + + // MARK: - BaseModalViewController + + open override func createContentView() -> UIView { + contentViewController.view + } + + // MARK: - Open methods + + open func createContentViewController() -> ContentViewController { + ContentViewController() + } +} diff --git a/TIBottomSheet/TIBottomSheet.app/.gitignore b/TIBottomSheet/TIBottomSheet.app/.gitignore index 44a647a9..2784c2d1 100644 --- a/TIBottomSheet/TIBottomSheet.app/.gitignore +++ b/TIBottomSheet/TIBottomSheet.app/.gitignore @@ -1,4 +1,3 @@ -# gitignore nef files **/build/ **/nef/ LICENSE diff --git a/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/Pages/TIBottomSheet.xcplaygroundpage/Contents.swift b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/Pages/TIBottomSheet.xcplaygroundpage/Contents.swift index 2329df12..99f12ee4 100644 --- a/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/Pages/TIBottomSheet.xcplaygroundpage/Contents.swift +++ b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/Pages/TIBottomSheet.xcplaygroundpage/Contents.swift @@ -3,7 +3,7 @@ TIBottomSheet содержить базовую реализацию модального котроллера и немного видоизмененную библиотеку PanModal. - # Базовый контроллер + ## Базовый контроллер Для создания модального котроллера можно унаследоваться от `BaseModalViewController`. Данный клас принимает два generic типа: тип основного контента, тип контента футера. */ @@ -12,6 +12,28 @@ import UIKit class EmptyViewController: BaseModalViewController { } +/*: + ## Обертка вокруг существующего контроллера + + Может быть такое, что из уже существующего контроллера нужно сделать модальное окно. С этим может помочь обертка `BaseModalWrapperViewController`. Данный контроллер является наследником BaseModalViewController, что позволяет его настраивать так же, как и базовый модальный котроллер + */ + +import TIUIKitCore + +final class OldMassiveViewController: BaseInitializableViewController { + // some implementation +} + +typealias ModalOldMassiveViewController = BaseModalWrapperViewController + +class PresentingViewController: BaseInitializableViewController { + // some implementation + + @objc private func onButtonTapped() { + presentPanModal(ModalOldMassiveViewController()) + } +} + /*: ## Контент модального контроллера diff --git a/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/Sources/NefTest.swift b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/Sources/NefTest.swift new file mode 100644 index 00000000..fe15078e --- /dev/null +++ b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/Sources/NefTest.swift @@ -0,0 +1,47 @@ +import Foundation +import XCTest + +public extension Nef { + + static func run(testCase class: T.Type) { + startTestObserver() + T.defaultTestSuite.run() + } + + static private func startTestObserver() { + _ = testObserverInstalled + } + + static private var testObserverInstalled = { () -> NefTestFailObserver in + let testObserver = NefTestFailObserver() + XCTestObservationCenter.shared.addTestObserver(testObserver) + return testObserver + }() +} + +// MARK: enrich the output for XCTest +fileprivate class NefTestFailObserver: NSObject, XCTestObservation { + + private var numberOfFailedTests = 0 + + func testSuiteWillStart(_ testSuite: XCTestSuite) { + numberOfFailedTests = 0 + } + + func testSuiteDidFinish(_ testSuite: XCTestSuite) { + if numberOfFailedTests > 0 { + print("💢 Test Suite '\(testSuite.name)' finished with \(numberOfFailedTests) failed \(numberOfFailedTests > 1 ? "tests" : "test").") + } else { + print("🔅 Test Suite '\(testSuite.name)' finished successfully.") + } + } + + func testCase(_ testCase: XCTestCase, + didFailWithDescription description: String, + inFile filePath: String?, + atLine lineNumber: Int) { + + numberOfFailedTests += 1 + print("❗️Test Fail '\(testCase.name)':\(UInt(lineNumber)): \(description.description)") + } +} diff --git a/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/contents.xcplayground b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/contents.xcplayground index 3debe4b3..00daa653 100644 --- a/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/contents.xcplayground +++ b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/contents.xcplayground @@ -1,2 +1,2 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.xcodeproj/project.pbxproj b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.xcodeproj/project.pbxproj index 180386ce..c7711f67 100644 --- a/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.xcodeproj/project.pbxproj +++ b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.xcodeproj/project.pbxproj @@ -6,9 +6,16 @@ objectVersion = 50; objects = { +/* Begin PBXBuildFile section */ + 83C08983988F66570478C40D /* Pods_TIBottomSheet.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8EF3488B86B483233C2CC631 /* Pods_TIBottomSheet.framework */; }; +/* End PBXBuildFile section */ + /* Begin PBXFileReference section */ + 7B6955D74676A5427AC42234 /* Pods-TIBottomSheet.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TIBottomSheet.debug.xcconfig"; path = "Target Support Files/Pods-TIBottomSheet/Pods-TIBottomSheet.debug.xcconfig"; sourceTree = ""; }; 8BACBE8322576CAD00266845 /* TIBottomSheet.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TIBottomSheet.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 8BACBE8622576CAD00266845 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 8EF3488B86B483233C2CC631 /* Pods_TIBottomSheet.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_TIBottomSheet.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + AA57D8210790AD14BCC54A7E /* Pods-TIBottomSheet.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TIBottomSheet.release.xcconfig"; path = "Target Support Files/Pods-TIBottomSheet/Pods-TIBottomSheet.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -16,17 +23,38 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 83C08983988F66570478C40D /* Pods_TIBottomSheet.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 11F06D2789C6CF40767861CF /* Frameworks */ = { + isa = PBXGroup; + children = ( + 8EF3488B86B483233C2CC631 /* Pods_TIBottomSheet.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 1F7782E3A7AD7291B7C09F56 /* Pods */ = { + isa = PBXGroup; + children = ( + 7B6955D74676A5427AC42234 /* Pods-TIBottomSheet.debug.xcconfig */, + AA57D8210790AD14BCC54A7E /* Pods-TIBottomSheet.release.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; 8B39A26221D40F8700DE2643 = { isa = PBXGroup; children = ( 8BACBE8422576CAD00266845 /* TIBottomSheet */, 8B39A26C21D40F8700DE2643 /* Products */, + 1F7782E3A7AD7291B7C09F56 /* Pods */, + 11F06D2789C6CF40767861CF /* Frameworks */, ); sourceTree = ""; }; @@ -63,6 +91,7 @@ isa = PBXNativeTarget; buildConfigurationList = 8BACBE8A22576CAD00266845 /* Build configuration list for PBXNativeTarget "TIBottomSheet" */; buildPhases = ( + 4E98D4C60DCD00EB801E579E /* [CP] Check Pods Manifest.lock */, 8BACBE7E22576CAD00266845 /* Headers */, 8BACBE7F22576CAD00266845 /* Sources */, 8BACBE8022576CAD00266845 /* Frameworks */, @@ -120,6 +149,31 @@ }; /* End PBXResourcesBuildPhase section */ +/* Begin PBXShellScriptBuildPhase section */ + 4E98D4C60DCD00EB801E579E /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-TIBottomSheet-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + /* Begin PBXSourcesBuildPhase section */ 8BACBE7F22576CAD00266845 /* Sources */ = { isa = PBXSourcesBuildPhase; @@ -254,6 +308,7 @@ }; 8BACBE8822576CAD00266845 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 7B6955D74676A5427AC42234 /* Pods-TIBottomSheet.debug.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Manual; @@ -284,6 +339,7 @@ }; 8BACBE8922576CAD00266845 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = AA57D8210790AD14BCC54A7E /* Pods-TIBottomSheet.release.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Manual; diff --git a/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.xcworkspace/contents.xcworkspacedata b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..6389ec4c --- /dev/null +++ b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/TIUIElements/Sources/Views/Skeletons/Configuration/BaseViewSkeletonsConfiguration.swift b/TIUIElements/Sources/Views/Skeletons/Configuration/BaseViewSkeletonsConfiguration.swift index 5ad77c0e..82c65412 100644 --- a/TIUIElements/Sources/Views/Skeletons/Configuration/BaseViewSkeletonsConfiguration.swift +++ b/TIUIElements/Sources/Views/Skeletons/Configuration/BaseViewSkeletonsConfiguration.swift @@ -20,6 +20,7 @@ // THE SOFTWARE. // +import TIUIKitCore import UIKit open class BaseViewSkeletonsConfiguration { diff --git a/TIUIElements/Sources/Views/Skeletons/Configuration/TextSkeletonsConfiguration.swift b/TIUIElements/Sources/Views/Skeletons/Configuration/TextSkeletonsConfiguration.swift index ef68b06a..4819e742 100644 --- a/TIUIElements/Sources/Views/Skeletons/Configuration/TextSkeletonsConfiguration.swift +++ b/TIUIElements/Sources/Views/Skeletons/Configuration/TextSkeletonsConfiguration.swift @@ -21,6 +21,7 @@ // import TISwiftUtils +import TIUIKitCore import UIKit open class TextSkeletonsConfiguration: BaseViewSkeletonsConfiguration { diff --git a/TIUIElements/Sources/Wrappers/Containers/ScrollViewWrapper.swift b/TIUIElements/Sources/Wrappers/Containers/ScrollViewWrapper.swift index d9672ca4..3edaf125 100644 --- a/TIUIElements/Sources/Wrappers/Containers/ScrollViewWrapper.swift +++ b/TIUIElements/Sources/Wrappers/Containers/ScrollViewWrapper.swift @@ -20,7 +20,6 @@ // THE SOFTWARE. // -import TIUIElements import UIKit public final class ScrollViewWrapper: UIScrollView { diff --git a/TIUIElements/TIUIElements.podspec b/TIUIElements/TIUIElements.podspec index efc65250..8879a41a 100644 --- a/TIUIElements/TIUIElements.podspec +++ b/TIUIElements/TIUIElements.podspec @@ -11,7 +11,7 @@ Pod::Spec.new do |s| s.ios.deployment_target = '11.0' s.swift_versions = ['5.7'] - sources = '/Sources/**/*' + sources = 'Sources/**/*' if ENV["DEVELOPMENT_INSTALL"] # installing using :path => s.source_files = sources s.exclude_files = s.name + '.app' diff --git a/docs/tibottomsheet/tibottomsheet.md b/docs/tibottomsheet/tibottomsheet.md new file mode 100644 index 00000000..f04a13db --- /dev/null +++ b/docs/tibottomsheet/tibottomsheet.md @@ -0,0 +1,120 @@ + +# TIBottomSheet + + TIBottomSheet содержить базовую реализацию модального котроллера и немного видоизмененную библиотеку PanModal. + +## Базовый контроллер + + Для создания модального котроллера можно унаследоваться от `BaseModalViewController`. Данный клас принимает два generic типа: тип основного контента, тип контента футера. + +```swift +import TIBottomSheet +import UIKit + +class EmptyViewController: BaseModalViewController { } +``` + +## Обертка вокруг существующего контроллера + + Может быть такое, что из уже существующего контроллера нужно сделать модальное окно. С этим может помочь обертка `BaseModalWrapperViewController`. Данный контроллер является наследником BaseModalViewController, что позволяет его настраивать так же, как и базовый модальный котроллер + +```swift +import TIUIKitCore + +final class OldMassiveViewController: BaseInitializableViewController { + // some implementation +} + +typealias ModalOldMassiveViewController = BaseModalWrapperViewController + +class PresentingViewController: BaseInitializableViewController { + // some implementation + + @objc private func onButtonTapped() { + presentPanModal(ModalOldMassiveViewController()) + } +} +``` + +## Контент модального контроллера + + Модальный котроллер может содержать следующие элементы: `DragView`, `HeaderView`, `FooterView`. Каждый из них является опциональным и без дополнительных настроек не будет показываться. + + DragView - небольшая view, за которую пользователь "держит" модальный контроллер + HeaderView - контейнер, содержащий в себе кнопки назад/закрыть или какие-то другие элементы управления + FooterView - view, располагающаяся внизу контроллера, поверх всего контента (модальный контроллер уже настроен так, чтобы при скролле в самый низ, футер не перекрывал последнюю ячейку) + + Для настройки каждого у котроллера есть свойство `viewControllerAppearance`. Через него будет настраиваться весь контроллер. Однако стоит заметить, что котроллер не будет настраивать передаваимую вью, содержащую основной контент. Стандартно котроллер будет пытаться расположить контент так, чтобы он заполнил все пространство. + + Вот пример настройки внешнего вида так, чтобы был видет dragView и headerView с левой кнопкой: + +```swift +class CustomViewController: BaseModalViewController { + override var viewControllerAppearance: BaseAppearance { + let appearance = super.viewControllerAppearance + + appearance.dragViewState = .presented(.defaultAppearance) + appearance.headerViewState = .presented(.make { + $0.backgroundColor = .white + $0.contentViewState = .buttonLeft(.init(titles: [.normal: "Close"], + appearance: [.normal: .init(backgroundColor: .white)])) + }) + + return appearance + } +} +``` + +## "Якори" контроллера + + Раньше для настройки высоты контроллера необходимо было пользоваться свойствами `longFormHeight`, `shortFormHeight`. В базовом контроллере можно лишь передать список точек на которых контроллер должен будет задержаться: + +```swift +class DetentsViewController: BaseModalViewController { + override var presentationDetents: [ModalViewPresentationDetent] { + [.headerOnly, .height(300), .maxHeight] + } +} +``` + + - headerOnly будет сам пытаться вычеслить высоту хедера и dragView, показывая только их + - height(_) будет показывать контроллер на переданной высоте + - maxHeight - вся высота экрана (до safeArea) + + В данный массив не рекомендуется передавать больше 3 значений, т.к. модальное окно все равно сможет занять только 3 положения на экране. + +## DimmedView + + Для контроля `DimmedView` (затемняющей view) есть отдельное свойство `dimmedViewType`. Это перечисление, содержащие следующие кейсы: + + - opaque: dimmedView не прозрачен и чем выше будет подниматься, тем больше будет затемнение. В shortFormHeight прозрачность равна 0.0, в longFormHeight - 1.0. + - transparent: dimmedView полностью прозрачен и будет пропускать все жесты на нижний (показывающий) контроллер + - transparentWithShadow(_) dimmedView полностью прозрачен, однако модальное окно будет отбразывать тень на нижний контроллер. Все жесты так же проходят + + > `UIViewShadow` получил статичное свойство для быстрой настройки тени котроллера + +```swift +class ShadowViewController: BaseModalViewController { + var dimmedViewType: DimmedView.AppearanceType { + .transparentWithShadow(.defaultModalViewShadow) + } +} +``` + +## Контроль закрытия + + `PanModalPresentable` не умеет в настройку закрытия контроллера, делая это самостоятельно через `dismiss(animated:completion:)`. Теперь можно настроить закрытие самостоятельно через свойства: `onTapToDismiss` и `onDragToDismiss`. + +# Взаимедействие с PanModal + + Если нет необходимости или возможности использовать `BaseModalViewController`, вы все так же можете пользоваться протоколом `PanModalRepresentable`. Вот список изменений протокола: + + - `DragView` больше не добавляется самостоятельно автоматически. Однако теперь к нему есть доступ, так что его даже можно как угодно настроить + - Открытие/закрытие модального окна теперь можно настроить с помощью свойств `onTapToDismiss` и `onDragToDismiss` + - Больше нет свойст отвечающих за разрешение закрыть модалку тапом или свайпом. Если какое-то из этих действий необходимо запретить, объявите соответствующее действие (`onTapToDismiss` и `onDragToDismiss`) с nil + - Можно настроить промежуточное состояние модального окна с `mediumFormHeight` + - `DimmedView` остается настраиваемым с помощью `dimmedViewType` свойства + + Через протокол `PanModalPresentable` у вас остается доступ к `presentationDetents`. Однако его установка никак не повлияет на настройку высоты и положений модального окна. + + > Для `BaseModalViewController` все свойства из `PanModalPresentable` все также работают, т.е. вы можете их переопределять, добавлять и изменять по необходимости. -- 2.40.1 From 06a83190abe551e17791d3fae44e535b8404fda5 Mon Sep 17 00:00:00 2001 From: Nikita Semenov Date: Mon, 3 Jul 2023 08:46:16 +0300 Subject: [PATCH 06/13] fix: refactoring with new layout configuration api --- .../BottomSheet/BaseModalViewController.swift | 60 +++++++++++-------- .../BaseModalWrapperViewController.swift | 11 ++++ .../BottomSheet/Views/ModalHeaderView.swift | 57 ++++++++++-------- .../Sources/Appearance/UIView+Layout.swift | 8 --- .../Views/ListItemView/BaseListItemView.swift | 12 ++-- .../Views/BasePlaceholderView.swift | 6 +- .../Constraints/CenterConstraints.swift | 14 ++--- .../Constraints/EdgeConstraints.swift | 30 +++++----- .../Constraints/SizeConstraints.swift | 14 ++--- .../WrappedViewLayout+Constraints.swift} | 16 ++--- 10 files changed, 120 insertions(+), 108 deletions(-) delete mode 100644 TIUIElements/Sources/Appearance/UIView+Layout.swift rename TIUIElements/Sources/{Views/Helpers/UIView+ApplyLayout.swift => Wrappers/Extensions/WrappedViewLayout+Constraints.swift} (61%) diff --git a/TIBottomSheet/Sources/BottomSheet/BaseModalViewController.swift b/TIBottomSheet/Sources/BottomSheet/BaseModalViewController.swift index c30201d7..9514e417 100644 --- a/TIBottomSheet/Sources/BottomSheet/BaseModalViewController.swift +++ b/TIBottomSheet/Sources/BottomSheet/BaseModalViewController.swift @@ -173,7 +173,7 @@ open class BaseModalViewController UIView { diff --git a/TIBottomSheet/Sources/BottomSheet/Views/ModalHeaderView.swift b/TIBottomSheet/Sources/BottomSheet/Views/ModalHeaderView.swift index 4383b8ef..9cbcc555 100644 --- a/TIBottomSheet/Sources/BottomSheet/Views/ModalHeaderView.swift +++ b/TIBottomSheet/Sources/BottomSheet/Views/ModalHeaderView.swift @@ -46,8 +46,24 @@ open class ModalHeaderView: BaseInitializableView, AppearanceConfigurable { public let leftButton = StatefulButton() public let rightButton = StatefulButton() - public var leftButtonConstraints: SubviewConstraints? - public var rightButtonConstraints: SubviewConstraints? + public private(set) lazy var leftButtonConstraints: SubviewConstraints = { + SubviewConstraints( + edgeConstraints: .init( + leadingConstraint: leftButton.leadingAnchor.constraint(equalTo: leadingAnchor), + topConstraint: leftButton.topAnchor.constraint(equalTo: topAnchor), + bottomConstraint: leftButton.bottomAnchor.constraint(equalTo: bottomAnchor)), + centerConstraints: .init(centerYConstraint: leftButton.centerYAnchor.constraint(equalTo: centerYAnchor)), + sizeConstraints: .init()) + }() + public private(set) lazy var rightButtonConstraints: SubviewConstraints = { + SubviewConstraints( + edgeConstraints: .init( + trailingConstraint: rightButton.trailingAnchor.constraint(equalTo: trailingAnchor), + topConstraint: rightButton.topAnchor.constraint(equalTo: topAnchor), + bottomConstraint: rightButton.bottomAnchor.constraint(equalTo: bottomAnchor)), + centerConstraints: .init(centerYConstraint: rightButton.centerYAnchor.constraint(equalTo: centerYAnchor)), + sizeConstraints: .init()) + }() public var customViewConstraints: SubviewConstraints? // MARK: - BaseInitializableView @@ -64,21 +80,7 @@ open class ModalHeaderView: BaseInitializableView, AppearanceConfigurable { [leftButton, rightButton] .forEach { $0.translatesAutoresizingMaskIntoConstraints = false } - let leftButtonConstraints = SubviewConstraints( - centerYConstraint: leftButton.centerYAnchor.constraint(equalTo: centerYAnchor), - leadingConstraint: leftButton.leadingAnchor.constraint(equalTo: leadingAnchor), - topConstraint: leftButton.topAnchor.constraint(equalTo: topAnchor), - bottomConstraint: leftButton.bottomAnchor.constraint(equalTo: bottomAnchor)) - - let rightButtonConstraints = SubviewConstraints( - centerYConstraint: rightButton.centerYAnchor.constraint(equalTo: centerYAnchor), - topConstraint: rightButton.topAnchor.constraint(equalTo: topAnchor), - trailingConstraint: rightButton.trailingAnchor.constraint(equalTo: trailingAnchor), - bottomConstraint: rightButton.bottomAnchor.constraint(equalTo: bottomAnchor)) - self.leftButtonConstraints = leftButtonConstraints - self.rightButtonConstraints = rightButtonConstraints - - NSLayoutConstraint.activate(leftButtonConstraints.constraints + rightButtonConstraints.constraints) + NSLayoutConstraint.activate(leftButtonConstraints.allConstraints + rightButtonConstraints.allConstraints) } // MARK: - AppearanceConfigurable @@ -124,17 +126,20 @@ open class ModalHeaderView: BaseInitializableView, AppearanceConfigurable { view.translatesAutoresizingMaskIntoConstraints = false let customViewConstraints = SubviewConstraints( - centerXConstraint: view.centerXAnchor.constraint(equalTo: centerXAnchor), - centerYConstraint: view.centerYAnchor.constraint(equalTo: centerYAnchor), - leadingConstraint: view.leadingAnchor.constraint(equalTo: leadingAnchor), - topConstraint: view.topAnchor.constraint(equalTo: topAnchor), - trailingConstraint: view.trailingAnchor.constraint(equalTo: trailingAnchor), - bottomConstraint: view.bottomAnchor.constraint(equalTo: bottomAnchor)) + edgeConstraints: .init( + leadingConstraint: view.leadingAnchor.constraint(equalTo: leadingAnchor), + trailingConstraint: view.trailingAnchor.constraint(equalTo: trailingAnchor), + topConstraint: view.topAnchor.constraint(equalTo: topAnchor), + bottomConstraint: view.bottomAnchor.constraint(equalTo: bottomAnchor)), + centerConstraints: .init(centerXConstraint: view.centerXAnchor.constraint(equalTo: centerXAnchor), + centerYConstraint: view.centerYAnchor.constraint(equalTo: centerYAnchor)), + sizeConstraints: .init()) + self.customViewConstraints = customViewConstraints - NSLayoutConstraint.deactivate(customViewConstraints.centerConstraints) + NSLayoutConstraint.deactivate(customViewConstraints.centerConstraints.allConstraints) - Self.configure(layout: layout, constraints: customViewConstraints) + layout.update(constraints: customViewConstraints) } private func configure(buttonStyle: BaseButtonStyle?, @@ -149,7 +154,7 @@ open class ModalHeaderView: BaseInitializableView, AppearanceConfigurable { button.isHidden = false if let layout = buttonStyle.appearance[.normal]?.layout, let constraints { - UIView.configure(layout: layout, constraints: constraints) + layout.update(constraints: constraints) } button.apply(style: buttonStyle) diff --git a/TIUIElements/Sources/Appearance/UIView+Layout.swift b/TIUIElements/Sources/Appearance/UIView+Layout.swift deleted file mode 100644 index e3ae3027..00000000 --- a/TIUIElements/Sources/Appearance/UIView+Layout.swift +++ /dev/null @@ -1,8 +0,0 @@ -// -// File.swift -// -// -// Created by Nikita Semenov on 08.06.2023. -// - -import Foundation diff --git a/TIUIElements/Sources/Views/ListItemView/BaseListItemView.swift b/TIUIElements/Sources/Views/ListItemView/BaseListItemView.swift index e5a9aa5e..3c56c8dd 100644 --- a/TIUIElements/Sources/Views/ListItemView/BaseListItemView.swift +++ b/TIUIElements/Sources/Views/ListItemView/BaseListItemView.swift @@ -132,7 +132,7 @@ open class BaseListItemView: BaseInitializableView { let multiplier = isKeyboardHidden ? 1.0 : -1.0 if let height = getKeyboardHeight(notification) { - controlsViewConstraints.edgeConstraints.bottomConstraint.constant = multiplier * height / 2 + controlsViewConstraints.edgeConstraints.bottomConstraint?.constant = multiplier * height / 2 } } @@ -199,10 +199,10 @@ open class BasePlaceholderView: BaseInitializableView { } private func configureTextViewLayout(layout: WrappedViewLayout) { - textViewConstraints.edgeConstraints.topConstraint.isActive = !isImageViewHidden + textViewConstraints.edgeConstraints.topConstraint?.isActive = !isImageViewHidden textViewTopToSuperviewTopConstraint.isActive = isImageViewHidden - textViewConstraints.edgeConstraints.bottomConstraint.isActive = !isControlsViewHidden + textViewConstraints.edgeConstraints.bottomConstraint?.isActive = !isControlsViewHidden textViewBottomToSuperviewBottomConstraint.isActive = isControlsViewHidden textViewConstraints.update(from: layout) diff --git a/TIUIElements/Sources/Wrappers/Constraints/CenterConstraints.swift b/TIUIElements/Sources/Wrappers/Constraints/CenterConstraints.swift index 243778f4..7b107417 100644 --- a/TIUIElements/Sources/Wrappers/Constraints/CenterConstraints.swift +++ b/TIUIElements/Sources/Wrappers/Constraints/CenterConstraints.swift @@ -23,8 +23,8 @@ import UIKit public struct CenterConstraints: ConstraintsSet { - public let centerXConstraint: NSLayoutConstraint - public let centerYConstraint: NSLayoutConstraint + public let centerXConstraint: NSLayoutConstraint? + public let centerYConstraint: NSLayoutConstraint? // MARK: - ConstraintsSet @@ -32,19 +32,19 @@ public struct CenterConstraints: ConstraintsSet { [ centerXConstraint, centerYConstraint - ] + ].compactMap { $0 } } - public init(centerXConstraint: NSLayoutConstraint, - centerYConstraint: NSLayoutConstraint) { + public init(centerXConstraint: NSLayoutConstraint? = nil, + centerYConstraint: NSLayoutConstraint? = nil) { self.centerXConstraint = centerXConstraint self.centerYConstraint = centerYConstraint } public func update(offset: UIOffset) { - centerXConstraint.setActiveConstantOrDeactivate(constant: offset.horizontal) - centerYConstraint.setActiveConstantOrDeactivate(constant: offset.vertical) + centerXConstraint?.setActiveConstantOrDeactivate(constant: offset.horizontal) + centerYConstraint?.setActiveConstantOrDeactivate(constant: offset.vertical) } public var centerConstraints: [NSLayoutConstraint] { diff --git a/TIUIElements/Sources/Wrappers/Constraints/EdgeConstraints.swift b/TIUIElements/Sources/Wrappers/Constraints/EdgeConstraints.swift index d6278aa6..b25ea645 100644 --- a/TIUIElements/Sources/Wrappers/Constraints/EdgeConstraints.swift +++ b/TIUIElements/Sources/Wrappers/Constraints/EdgeConstraints.swift @@ -23,10 +23,10 @@ import UIKit public struct EdgeConstraints: ConstraintsSet { - public let leadingConstraint: NSLayoutConstraint - public let trailingConstraint: NSLayoutConstraint - public let topConstraint: NSLayoutConstraint - public let bottomConstraint: NSLayoutConstraint + public let leadingConstraint: NSLayoutConstraint? + public let trailingConstraint: NSLayoutConstraint? + public let topConstraint: NSLayoutConstraint? + public let bottomConstraint: NSLayoutConstraint? // MARK: - ConstraintsSet @@ -36,27 +36,27 @@ public struct EdgeConstraints: ConstraintsSet { trailingConstraint, topConstraint, bottomConstraint - ] + ].compactMap { $0 } } public var horizontal: [NSLayoutConstraint] { [ leadingConstraint, trailingConstraint - ] + ].compactMap { $0 } } public var vertical: [NSLayoutConstraint] { [ topConstraint, bottomConstraint - ] + ].compactMap { $0 } } - public init(leadingConstraint: NSLayoutConstraint, - trailingConstraint: NSLayoutConstraint, - topConstraint: NSLayoutConstraint, - bottomConstraint: NSLayoutConstraint) { + public init(leadingConstraint: NSLayoutConstraint? = nil, + trailingConstraint: NSLayoutConstraint? = nil, + topConstraint: NSLayoutConstraint? = nil, + bottomConstraint: NSLayoutConstraint? = nil) { self.leadingConstraint = leadingConstraint self.trailingConstraint = trailingConstraint @@ -65,9 +65,9 @@ public struct EdgeConstraints: ConstraintsSet { } public func update(from insets: UIEdgeInsets) { - leadingConstraint.setActiveConstantOrDeactivate(constant: insets.left) - trailingConstraint.setActiveConstantOrDeactivate(constant: -insets.right) - topConstraint.setActiveConstantOrDeactivate(constant: insets.top) - bottomConstraint.setActiveConstantOrDeactivate(constant: -insets.bottom) + leadingConstraint?.setActiveConstantOrDeactivate(constant: insets.left) + trailingConstraint?.setActiveConstantOrDeactivate(constant: -insets.right) + topConstraint?.setActiveConstantOrDeactivate(constant: insets.top) + bottomConstraint?.setActiveConstantOrDeactivate(constant: -insets.bottom) } } diff --git a/TIUIElements/Sources/Wrappers/Constraints/SizeConstraints.swift b/TIUIElements/Sources/Wrappers/Constraints/SizeConstraints.swift index d65caae7..b26d9288 100644 --- a/TIUIElements/Sources/Wrappers/Constraints/SizeConstraints.swift +++ b/TIUIElements/Sources/Wrappers/Constraints/SizeConstraints.swift @@ -23,8 +23,8 @@ import UIKit public struct SizeConstraints: ConstraintsSet { - public let widthConstraint: NSLayoutConstraint - public let heightConstraint: NSLayoutConstraint + public let widthConstraint: NSLayoutConstraint? + public let heightConstraint: NSLayoutConstraint? // MARK: - ConstraintsSet @@ -32,18 +32,18 @@ public struct SizeConstraints: ConstraintsSet { [ widthConstraint, heightConstraint - ] + ].compactMap { $0 } } - public init(widthConstraint: NSLayoutConstraint, - heightConstraint: NSLayoutConstraint) { + public init(widthConstraint: NSLayoutConstraint? = nil, + heightConstraint: NSLayoutConstraint? = nil) { self.widthConstraint = widthConstraint self.heightConstraint = heightConstraint } public func update(from size: CGSize) { - widthConstraint.setActiveConstantOrDeactivate(constant: size.width) - heightConstraint.setActiveConstantOrDeactivate(constant: size.height) + widthConstraint?.setActiveConstantOrDeactivate(constant: size.width) + heightConstraint?.setActiveConstantOrDeactivate(constant: size.height) } } diff --git a/TIUIElements/Sources/Views/Helpers/UIView+ApplyLayout.swift b/TIUIElements/Sources/Wrappers/Extensions/WrappedViewLayout+Constraints.swift similarity index 61% rename from TIUIElements/Sources/Views/Helpers/UIView+ApplyLayout.swift rename to TIUIElements/Sources/Wrappers/Extensions/WrappedViewLayout+Constraints.swift index ad0a8bb3..dfd1d949 100644 --- a/TIUIElements/Sources/Views/Helpers/UIView+ApplyLayout.swift +++ b/TIUIElements/Sources/Wrappers/Extensions/WrappedViewLayout+Constraints.swift @@ -23,16 +23,10 @@ import TIUIKitCore import UIKit -extension UIView { - public static func configure(layout: WrappedViewLayout, constraints: SubviewConstraints) { - layout.setupCenterYOffset(centerYConstraint: constraints.centerYConstraint, - topConstraint: constraints.topConstraint, - bottomConstraint: constraints.bottomConstraint) - - layout.setupCenterXOffset(centerXConstraint: constraints.centerXConstraint, - leadingConstraint: constraints.leadingConstraint, - trailingConstraint: constraints.trailingConstraint) - - layout.setupSize(widthConstraint: constraints.widthConstraint, heightConstraint: constraints.heightConstraint) +public extension WrappedViewLayout { + func update(constraints: SubviewConstraints) { + constraints.update(insets: insets, + size: size, + centerOffset: centerOffset) } } -- 2.40.1 From b97ea5bc8fad7a715fee7f028a5ee68e9204a03c Mon Sep 17 00:00:00 2001 From: Nikita Semenov Date: Mon, 3 Jul 2023 10:17:47 +0300 Subject: [PATCH 07/13] docs: update appearance of view controller in documentation --- .../BottomSheet/BaseModalViewController.swift | 5 +---- .../BottomSheet/BaseModalWrapperViewController.swift | 12 ------------ .../TIBottomSheet.xcplaygroundpage/Contents.swift | 3 ++- docs/tibottomsheet/tibottomsheet.md | 3 ++- 4 files changed, 5 insertions(+), 18 deletions(-) diff --git a/TIBottomSheet/Sources/BottomSheet/BaseModalViewController.swift b/TIBottomSheet/Sources/BottomSheet/BaseModalViewController.swift index 9514e417..aa71b815 100644 --- a/TIBottomSheet/Sources/BottomSheet/BaseModalViewController.swift +++ b/TIBottomSheet/Sources/BottomSheet/BaseModalViewController.swift @@ -198,11 +198,8 @@ open class BaseModalViewController UIView { diff --git a/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/Pages/TIBottomSheet.xcplaygroundpage/Contents.swift b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/Pages/TIBottomSheet.xcplaygroundpage/Contents.swift index 99f12ee4..ee0a5ab1 100644 --- a/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/Pages/TIBottomSheet.xcplaygroundpage/Contents.swift +++ b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/Pages/TIBottomSheet.xcplaygroundpage/Contents.swift @@ -53,9 +53,10 @@ class CustomViewController: BaseModalViewController { appearance.dragViewState = .presented(.defaultAppearance) appearance.headerViewState = .presented(.make { + $0.layout.size = .fixedHeight(52) $0.backgroundColor = .white $0.contentViewState = .buttonLeft(.init(titles: [.normal: "Close"], - appearance: [.normal: .init(backgroundColor: .white)])) + appearance: [.normal: .init(backgroundColor: .blue)])) }) return appearance diff --git a/docs/tibottomsheet/tibottomsheet.md b/docs/tibottomsheet/tibottomsheet.md index f04a13db..d8114635 100644 --- a/docs/tibottomsheet/tibottomsheet.md +++ b/docs/tibottomsheet/tibottomsheet.md @@ -55,9 +55,10 @@ class CustomViewController: BaseModalViewController { appearance.dragViewState = .presented(.defaultAppearance) appearance.headerViewState = .presented(.make { + $0.layout.size = .fixedHeight(52) $0.backgroundColor = .white $0.contentViewState = .buttonLeft(.init(titles: [.normal: "Close"], - appearance: [.normal: .init(backgroundColor: .white)])) + appearance: [.normal: .init(backgroundColor: .blue)])) }) return appearance -- 2.40.1 From 27d5a3a9cada92812c9da2e59fcabb66d3c55139 Mon Sep 17 00:00:00 2001 From: Ivan Smolin Date: Mon, 24 Jul 2023 20:15:06 +0300 Subject: [PATCH 08/13] fix: fix code review notes --- CHANGELOG.md | 1 - TIBottomSheet/PlaygroundPodfile | 1 + .../BottomSheet/BaseModalViewController.swift | 260 +++++++++++++----- .../Models/ModalViewPresentationDetent.swift | 12 +- .../BottomSheet/Views/ModalFooterView.swift | 8 +- .../BottomSheet/Views/ModalHeaderView.swift | 149 ++++++---- .../TIBottomSheet.app/Contents/MacOS/Podfile | 1 + .../Contents.swift | 4 +- TIBottomSheet/TIBottomSheet.podspec | 4 +- .../DefaultFilterTableViewCell.swift | 2 +- .../DefaultFilterCollectionCell.swift | 2 +- .../BaseInitializeableScrollView.swift} | 59 ++-- .../Views/ListItemView/BaseListItemView.swift | 132 +++++---- .../Views/BasePlaceholderImageView.swift | 10 +- .../Views/BasePlaceholderView.swift | 118 ++++---- .../Views/DefaultPlaceholderView.swift | 8 +- .../StatefulButton+ApplyStyle.swift | 6 +- .../Constraints/CenterConstraints.swift | 19 +- .../Constraints/EdgeConstraints.swift | 30 +- ...youtConstraint+SetActiveOrDeactivate.swift | 2 +- .../Constraints/SizeConstraints.swift | 14 +- .../Constraints/SubviewConstraints.swift | 9 +- .../Containers/CollectionTableViewCell.swift | 6 +- .../ContainerCollectionViewCell.swift | 10 +- .../Containers/ContainerScrollView.swift | 73 +++++ .../Containers/ContainerTableViewCell.swift | 22 +- .../Wrappers/Containers/ContainerView.swift | 10 +- .../ReusableCollectionContainerView.swift | 14 +- ...edViewHolder+AppearanceConfigurable.swift} | 22 +- .../Protocols/WrappedViewHolder.swift | 19 +- .../Contents.swift | 8 +- .../UIKit/UIEdgeInsets+Extensions.swift | 50 ++-- docs/tibottomsheet/tibottomsheet.md | 4 +- docs/tiuielements/placeholder.md | 8 +- 34 files changed, 709 insertions(+), 388 deletions(-) rename TIUIElements/Sources/{Wrappers/Containers/ScrollViewWrapper.swift => Views/BaseInitializeableViews/BaseInitializeableScrollView.swift} (57%) create mode 100644 TIUIElements/Sources/Wrappers/Containers/ContainerScrollView.swift rename TIUIElements/Sources/Wrappers/Extensions/{WrappedViewLayout+Constraints.swift => WrappedViewHolder+AppearanceConfigurable.swift} (57%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f3950e6..9516a9d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,7 +15,6 @@ ### 1.49.0 - **Added**: `BaseMigratingSingleValueKeychainStorage` and `BaseMigratingSingleValueDefaultsStorage` implementations for migrating keys from one storage to another. ->>>>>>> master ### 1.48.0 diff --git a/TIBottomSheet/PlaygroundPodfile b/TIBottomSheet/PlaygroundPodfile index ed76571e..e44c2e85 100644 --- a/TIBottomSheet/PlaygroundPodfile +++ b/TIBottomSheet/PlaygroundPodfile @@ -7,4 +7,5 @@ target 'TIBottomSheet' do pod 'TIUIElements', :path => '../../../../TIUIElements/TIUIElements.podspec' pod 'TIUIKitCore', :path => '../../../../TIUIKitCore/TIUIKitCore.podspec' pod 'TISwiftUtils', :path => '../../../../TISwiftUtils/TISwiftUtils.podspec' + pod 'TIBottomSheet', :path => '../../../../TIBottomSheet/TIBottomSheet.podspec' end diff --git a/TIBottomSheet/Sources/BottomSheet/BaseModalViewController.swift b/TIBottomSheet/Sources/BottomSheet/BaseModalViewController.swift index aa71b815..6114309b 100644 --- a/TIBottomSheet/Sources/BottomSheet/BaseModalViewController.swift +++ b/TIBottomSheet/Sources/BottomSheet/BaseModalViewController.swift @@ -35,10 +35,120 @@ open class BaseModalViewController CGFloat { @@ -336,7 +452,7 @@ open class BaseModalViewController CGSize { diff --git a/TIBottomSheet/Sources/BottomSheet/Models/ModalViewPresentationDetent.swift b/TIBottomSheet/Sources/BottomSheet/Models/ModalViewPresentationDetent.swift index c01ad4b9..5f0d568b 100644 --- a/TIBottomSheet/Sources/BottomSheet/Models/ModalViewPresentationDetent.swift +++ b/TIBottomSheet/Sources/BottomSheet/Models/ModalViewPresentationDetent.swift @@ -26,16 +26,16 @@ public struct ModalViewPresentationDetent: Hashable { // MARK: - Default Values - public static var headerOnly: ModalViewPresentationDetent { - ModalViewPresentationDetent(height: CGFloat(Int.min)) + public static var headerOnly: Self { + Self(height: -.greatestFiniteMagnitude) } - public static func height(_ height: CGFloat) -> ModalViewPresentationDetent { - ModalViewPresentationDetent(height: height) + public static func height(_ height: CGFloat) -> Self { + Self(height: height) } - public static var maxHeight: ModalViewPresentationDetent { - ModalViewPresentationDetent(height: CGFloat(Int.max)) + public static var maxHeight: Self { + Self(height: .greatestFiniteMagnitude) } // MARK: - Public Properties diff --git a/TIBottomSheet/Sources/BottomSheet/Views/ModalFooterView.swift b/TIBottomSheet/Sources/BottomSheet/Views/ModalFooterView.swift index d1f00499..20aae228 100644 --- a/TIBottomSheet/Sources/BottomSheet/Views/ModalFooterView.swift +++ b/TIBottomSheet/Sources/BottomSheet/Views/ModalFooterView.swift @@ -32,12 +32,6 @@ public extension ModalFooterView { enum State { case hidden - case presented(UIView.BaseWrappedViewHolderAppearance) - } - - func configureAppearance(appearance: UIView.BaseWrappedViewHolderAppearance) { - wrappedView.configureUIView(appearance: appearance.subviewAppearance) - configureUIView(appearance: appearance) - contentInsets = appearance.subviewAppearance.layout.insets + case presented(BaseWrappedViewHolderAppearance) } } diff --git a/TIBottomSheet/Sources/BottomSheet/Views/ModalHeaderView.swift b/TIBottomSheet/Sources/BottomSheet/Views/ModalHeaderView.swift index 9cbcc555..2827abb8 100644 --- a/TIBottomSheet/Sources/BottomSheet/Views/ModalHeaderView.swift +++ b/TIBottomSheet/Sources/BottomSheet/Views/ModalHeaderView.swift @@ -34,10 +34,9 @@ open class ModalHeaderView: BaseInitializableView, AppearanceConfigurable { } public enum ContentViewState { - case none - case buttonLeft(BaseButtonStyle) - case buttonRight(BaseButtonStyle) - case buttons(left: BaseButtonStyle, right: BaseButtonStyle) + case leadingButton(BaseButtonStyle) + case trailingButton(BaseButtonStyle) + case buttons(leading: BaseButtonStyle, trailing: BaseButtonStyle) case custom(view: UIView, appearance: UIView.BaseWrappedAppearance) } @@ -46,24 +45,60 @@ open class ModalHeaderView: BaseInitializableView, AppearanceConfigurable { public let leftButton = StatefulButton() public let rightButton = StatefulButton() + public private(set) lazy var leftTrailingToRightLeadingConstraint: NSLayoutConstraint = { + leftButton.trailingAnchor.constraint(equalTo: rightButton.leadingAnchor) + }() + + public private(set) lazy var leftTrailingToSuperviewTrailing: NSLayoutConstraint = { + leftButton.trailingAnchor.constraint(equalTo: rightButton.leadingAnchor) + }() + public private(set) lazy var leftButtonConstraints: SubviewConstraints = { - SubviewConstraints( - edgeConstraints: .init( - leadingConstraint: leftButton.leadingAnchor.constraint(equalTo: leadingAnchor), - topConstraint: leftButton.topAnchor.constraint(equalTo: topAnchor), - bottomConstraint: leftButton.bottomAnchor.constraint(equalTo: bottomAnchor)), - centerConstraints: .init(centerYConstraint: leftButton.centerYAnchor.constraint(equalTo: centerYAnchor)), - sizeConstraints: .init()) + let edgeConstraints = EdgeConstraints(leadingConstraint: leftButton.leadingAnchor.constraint(equalTo: leadingAnchor), + trailingConstraint: leftTrailingToRightLeadingConstraint, + topConstraint: leftButton.topAnchor.constraint(equalTo: topAnchor), + bottomConstraint: leftButton.bottomAnchor.constraint(equalTo: bottomAnchor)) + + let centerXConstraint = leftButton.centerXAnchor.constraint(equalTo: centerXAnchor) + let centerYConstraint = leftButton.centerYAnchor.constraint(equalTo: centerYAnchor) + + let centerConstraints = CenterConstraints(centerXConstraint: centerXConstraint, + centerYConstraint: centerYConstraint) + + let sizeConstraints = SizeConstraints(widthConstraint: leftButton.widthAnchor.constraint(equalToConstant: .zero), + heightConstraint: leftButton.heightAnchor.constraint(equalToConstant: .zero)) + + return SubviewConstraints(edgeConstraints: edgeConstraints, + centerConstraints: centerConstraints, + sizeConstraints: sizeConstraints) }() + + public private(set) lazy var rightLeadingToSuperviewLeadingConstraint: NSLayoutConstraint = { + rightButton.leadingAnchor.constraint(equalTo: leadingAnchor) + }() + public private(set) lazy var rightButtonConstraints: SubviewConstraints = { - SubviewConstraints( - edgeConstraints: .init( - trailingConstraint: rightButton.trailingAnchor.constraint(equalTo: trailingAnchor), - topConstraint: rightButton.topAnchor.constraint(equalTo: topAnchor), - bottomConstraint: rightButton.bottomAnchor.constraint(equalTo: bottomAnchor)), - centerConstraints: .init(centerYConstraint: rightButton.centerYAnchor.constraint(equalTo: centerYAnchor)), - sizeConstraints: .init()) + let trailingConstraint = rightButton.trailingAnchor.constraint(equalTo: trailingAnchor) + + let edgeConstraints = EdgeConstraints(leadingConstraint: rightButton.leadingAnchor.constraint(equalTo: leadingAnchor), + trailingConstraint: trailingConstraint, + topConstraint: rightButton.topAnchor.constraint(equalTo: topAnchor), + bottomConstraint: rightButton.bottomAnchor.constraint(equalTo: bottomAnchor)) + + let centerXConstraint = rightButton.centerXAnchor.constraint(equalTo: centerXAnchor) + let centerYConstraint = rightButton.centerYAnchor.constraint(equalTo: centerYAnchor) + + let centerConstraints = CenterConstraints(centerXConstraint: centerXConstraint, + centerYConstraint: centerYConstraint) + + let sizeConstraints = SizeConstraints(widthConstraint: rightButton.widthAnchor.constraint(equalToConstant: .zero), + heightConstraint: rightButton.heightAnchor.constraint(equalToConstant: .zero)) + + return SubviewConstraints(edgeConstraints: edgeConstraints, + centerConstraints: centerConstraints, + sizeConstraints: sizeConstraints) }() + public var customViewConstraints: SubviewConstraints? // MARK: - BaseInitializableView @@ -79,8 +114,6 @@ open class ModalHeaderView: BaseInitializableView, AppearanceConfigurable { [leftButton, rightButton] .forEach { $0.translatesAutoresizingMaskIntoConstraints = false } - - NSLayoutConstraint.activate(leftButtonConstraints.allConstraints + rightButtonConstraints.allConstraints) } // MARK: - AppearanceConfigurable @@ -92,30 +125,37 @@ open class ModalHeaderView: BaseInitializableView, AppearanceConfigurable { } open func configureContentView(state: ContentViewState) { - var leftButtonStyle: BaseButtonStyle? - var rightButtonStyle: BaseButtonStyle? + var leadingButtonStyle: BaseButtonStyle? + var trailingButtonStyle: BaseButtonStyle? switch state { - case let .buttonLeft(style): - leftButtonStyle = style + case let .leadingButton(style): + leadingButtonStyle = style + leftButtonConstraints.edgeConstraints.trailingConstraint = leftTrailingToSuperviewTrailing - case let .buttonRight(style): - rightButtonStyle = style + case let .trailingButton(style): + trailingButtonStyle = style + rightButtonConstraints.edgeConstraints.leadingConstraint = rightLeadingToSuperviewLeadingConstraint - case let .buttons(left, right): - leftButtonStyle = left - rightButtonStyle = right + case let .buttons(leading, trailing): + leadingButtonStyle = leading + trailingButtonStyle = trailing + leftButtonConstraints.edgeConstraints.trailingConstraint = leftTrailingToRightLeadingConstraint + rightButtonConstraints.edgeConstraints.leadingConstraint = leftTrailingToRightLeadingConstraint + + let spacing = leading.appearance.layout.insets.add(\.right, + to: \.left, + of: trailing.appearance.layout.insets) + + leftTrailingToRightLeadingConstraint.setActiveConstantOrDeactivate(constant: spacing) case let .custom(view, appearance): configureCustomView(view, withLayout: appearance.layout) view.configureUIView(appearance: appearance) - - default: - break } - configure(buttonStyle: leftButtonStyle, forButton: leftButton, constraints: leftButtonConstraints) - configure(buttonStyle: rightButtonStyle, forButton: rightButton, constraints: rightButtonConstraints) + configure(buttonStyle: leadingButtonStyle, forButton: leftButton, constraints: leftButtonConstraints) + configure(buttonStyle: trailingButtonStyle, forButton: rightButton, constraints: rightButtonConstraints) } // MARK: - Private methods @@ -125,21 +165,24 @@ open class ModalHeaderView: BaseInitializableView, AppearanceConfigurable { view.translatesAutoresizingMaskIntoConstraints = false - let customViewConstraints = SubviewConstraints( - edgeConstraints: .init( - leadingConstraint: view.leadingAnchor.constraint(equalTo: leadingAnchor), - trailingConstraint: view.trailingAnchor.constraint(equalTo: trailingAnchor), - topConstraint: view.topAnchor.constraint(equalTo: topAnchor), - bottomConstraint: view.bottomAnchor.constraint(equalTo: bottomAnchor)), - centerConstraints: .init(centerXConstraint: view.centerXAnchor.constraint(equalTo: centerXAnchor), - centerYConstraint: view.centerYAnchor.constraint(equalTo: centerYAnchor)), - sizeConstraints: .init()) + let edgeConstraints = EdgeConstraints(leadingConstraint: view.leadingAnchor.constraint(equalTo: leadingAnchor), + trailingConstraint: view.trailingAnchor.constraint(equalTo: trailingAnchor), + topConstraint: view.topAnchor.constraint(equalTo: topAnchor), + bottomConstraint: view.bottomAnchor.constraint(equalTo: bottomAnchor)) + + let centerConstraints = CenterConstraints(centerXConstraint: view.centerXAnchor.constraint(equalTo: centerXAnchor), + centerYConstraint: view.centerYAnchor.constraint(equalTo: centerYAnchor)) + + let sizeConstraints = SizeConstraints(widthConstraint: view.widthAnchor.constraint(equalToConstant: .zero), + heightConstraint: view.heightAnchor.constraint(equalToConstant: .zero)) + + let customViewConstraints = SubviewConstraints(edgeConstraints: edgeConstraints, + centerConstraints: centerConstraints, + sizeConstraints: sizeConstraints) self.customViewConstraints = customViewConstraints - NSLayoutConstraint.deactivate(customViewConstraints.centerConstraints.allConstraints) - - layout.update(constraints: customViewConstraints) + customViewConstraints.update(from: layout) } private func configure(buttonStyle: BaseButtonStyle?, @@ -153,9 +196,7 @@ open class ModalHeaderView: BaseInitializableView, AppearanceConfigurable { button.isHidden = false - if let layout = buttonStyle.appearance[.normal]?.layout, let constraints { - layout.update(constraints: constraints) - } + constraints?.update(from: buttonStyle.appearance.layout) button.apply(style: buttonStyle) } @@ -163,20 +204,20 @@ open class ModalHeaderView: BaseInitializableView, AppearanceConfigurable { // MARK: - Appearance -extension ModalHeaderView { +public extension ModalHeaderView { - public final class Appearance: UIView.BaseWrappedAppearance, WrappedViewAppearance { + final class Appearance: BaseWrappedAppearance, WrappedViewAppearance { public static var defaultAppearance: Self { - .init() + Self() } public var contentViewState: ContentViewState - public init(layout: UIView.DefaultWrappedLayout = .defaultLayout, + public init(layout: DefaultWrappedLayout = .defaultLayout, backgroundColor: UIColor = .clear, border: UIViewBorder = .init(), shadow: UIViewShadow? = nil, - contentViewState: ContentViewState = .none) { + contentViewState: ContentViewState = .leadingButton(.init())) { self.contentViewState = contentViewState diff --git a/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/Podfile b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/Podfile index ed76571e..e44c2e85 100644 --- a/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/Podfile +++ b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/Podfile @@ -7,4 +7,5 @@ target 'TIBottomSheet' do pod 'TIUIElements', :path => '../../../../TIUIElements/TIUIElements.podspec' pod 'TIUIKitCore', :path => '../../../../TIUIKitCore/TIUIKitCore.podspec' pod 'TISwiftUtils', :path => '../../../../TISwiftUtils/TISwiftUtils.podspec' + pod 'TIBottomSheet', :path => '../../../../TIBottomSheet/TIBottomSheet.podspec' end diff --git a/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/Pages/TIBottomSheet.xcplaygroundpage/Contents.swift b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/Pages/TIBottomSheet.xcplaygroundpage/Contents.swift index ee0a5ab1..05a69f72 100644 --- a/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/Pages/TIBottomSheet.xcplaygroundpage/Contents.swift +++ b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/Pages/TIBottomSheet.xcplaygroundpage/Contents.swift @@ -56,7 +56,9 @@ class CustomViewController: BaseModalViewController { $0.layout.size = .fixedHeight(52) $0.backgroundColor = .white $0.contentViewState = .buttonLeft(.init(titles: [.normal: "Close"], - appearance: [.normal: .init(backgroundColor: .blue)])) + appearance: .init(stateAppearances: [ + .normal: .init(backgroundColor: .blue) + ]))) }) return appearance diff --git a/TIBottomSheet/TIBottomSheet.podspec b/TIBottomSheet/TIBottomSheet.podspec index 2ba117a7..3659dafc 100644 --- a/TIBottomSheet/TIBottomSheet.podspec +++ b/TIBottomSheet/TIBottomSheet.podspec @@ -11,12 +11,12 @@ Pod::Spec.new do |s| s.ios.deployment_target = '11.0' s.swift_versions = ['5.7'] - sources = '/Sources/**/*' + sources = 'Sources/**/*' if ENV["DEVELOPMENT_INSTALL"] # installing using :path => s.source_files = sources s.exclude_files = s.name + '.app' else - s.source_files = s.name + sources + s.source_files = s.name + '/' + sources s.exclude_files = s.name + '/*.app' end diff --git a/TIEcommerce/Sources/Filters/FiltersViews/ListFilters/FiltersTableViewCell/DefaultFilterTableViewCell.swift b/TIEcommerce/Sources/Filters/FiltersViews/ListFilters/FiltersTableViewCell/DefaultFilterTableViewCell.swift index 759c9270..cd38ae79 100644 --- a/TIEcommerce/Sources/Filters/FiltersViews/ListFilters/FiltersTableViewCell/DefaultFilterTableViewCell.swift +++ b/TIEcommerce/Sources/Filters/FiltersViews/ListFilters/FiltersTableViewCell/DefaultFilterTableViewCell.swift @@ -60,7 +60,7 @@ open class DefaultFilterTableViewCell: ContainerTableViewCell // MARK: - Open methods open func updateAppearance(with appearance: FilterCellStateAppearance) { - contentInsets = appearance.contentInsets + wrappedContentInsets = appearance.contentInsets wrappedView.textColor = appearance.fontColor wrappedView.images = appearance.stateImages ?? [:] diff --git a/TIEcommerce/Sources/Filters/FiltersViews/TagsFilters/FiltersCollectionCell/DefaultFilterCollectionCell.swift b/TIEcommerce/Sources/Filters/FiltersViews/TagsFilters/FiltersCollectionCell/DefaultFilterCollectionCell.swift index 19895540..605d9217 100644 --- a/TIEcommerce/Sources/Filters/FiltersViews/TagsFilters/FiltersCollectionCell/DefaultFilterCollectionCell.swift +++ b/TIEcommerce/Sources/Filters/FiltersViews/TagsFilters/FiltersCollectionCell/DefaultFilterCollectionCell.swift @@ -56,7 +56,7 @@ open class DefaultFilterCollectionCell: ContainerCollectionViewCell, Co // MARK: - Open methdos open func updateAppearance(with appearance: FilterCellStateAppearance) { - contentInsets = appearance.contentInsets + wrappedContentInsets = appearance.contentInsets wrappedView.textColor = appearance.fontColor backgroundColor = appearance.backgroundColor diff --git a/TIUIElements/Sources/Wrappers/Containers/ScrollViewWrapper.swift b/TIUIElements/Sources/Views/BaseInitializeableViews/BaseInitializeableScrollView.swift similarity index 57% rename from TIUIElements/Sources/Wrappers/Containers/ScrollViewWrapper.swift rename to TIUIElements/Sources/Views/BaseInitializeableViews/BaseInitializeableScrollView.swift index 3edaf125..084e48fc 100644 --- a/TIUIElements/Sources/Wrappers/Containers/ScrollViewWrapper.swift +++ b/TIUIElements/Sources/Views/BaseInitializeableViews/BaseInitializeableScrollView.swift @@ -20,32 +20,51 @@ // THE SOFTWARE. // +import TIUIKitCore import UIKit -public final class ScrollViewWrapper: UIScrollView { +open class BaseInitializeableScrollView: UIScrollView, InitializableViewProtocol { + public var callbacks: [ViewCallbacks] = [] - private let contentView: ContentView + override public init(frame: CGRect) { + super.init(frame: frame) - public override init(frame: CGRect) { - self.contentView = ContentView() - - super.init(frame: .zero) - - addSubview(contentView) - contentView.translatesAutoresizingMaskIntoConstraints = false - - NSLayoutConstraint.activate([ - contentView.leadingAnchor.constraint(equalTo: leadingAnchor), - contentView.trailingAnchor.constraint(equalTo: trailingAnchor), - contentView.topAnchor.constraint(equalTo: topAnchor), - contentView.bottomAnchor.constraint(equalTo: bottomAnchor), - contentView.widthAnchor.constraint(equalTo: widthAnchor) - ]) + initializeView() } - required init?(coder: NSCoder) { - contentView = ContentView() + required public init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) - super.init(coder: coder) + initializeView() + } + + override open func layoutSubviews() { + super.layoutSubviews() + + for callback in callbacks { + callback.onDidLayoutSubviews() + } + } + + // MARK: - InitializableView + + open func addViews() { + // override in subclass + } + + open func configureLayout() { + // override in subclass + } + + open func bindViews() { + // override in subclass + } + + open func configureAppearance() { + // override in subclass + } + + open func localize() { + // override in subclass } } diff --git a/TIUIElements/Sources/Views/ListItemView/BaseListItemView.swift b/TIUIElements/Sources/Views/ListItemView/BaseListItemView.swift index 3c56c8dd..1fb43419 100644 --- a/TIUIElements/Sources/Views/ListItemView/BaseListItemView.swift +++ b/TIUIElements/Sources/Views/ListItemView/BaseListItemView.swift @@ -38,29 +38,47 @@ open class BaseListItemView: UIImageView, public private(set) lazy var wrappedView = Placeholder() - public var contentInsets: UIEdgeInsets = .zero { + public var wrappedContentInsets: UIEdgeInsets = .zero { didSet { update(subviewConstraints: placeholderConstraints) } } - public var contentSize: CGSize = .infinity { + public var wrappedContentSize: CGSize = .infinity { didSet { update(subviewConstraints: placeholderConstraints) } } - public var contentCenterOffset: UIOffset = .nan { + public var wrappedContentCenterOffset: UIOffset = .nan { didSet { update(subviewConstraints: placeholderConstraints) } @@ -118,7 +118,9 @@ open class BasePlaceholderImageView: UIImageView, // MARK: - Open methods - open func configureBasePlaceholder(appearance: BaseWrappedViewHolderAppearance) { + open func configureBasePlaceholder(appearance: BaseWrappedViewHolderAppearance< + some BaseWrappedAppearance, + some WrappedViewLayout>) { configureUIView(appearance: appearance) wrappedView.configureUIView(appearance: appearance.subviewAppearance) diff --git a/TIUIElements/Sources/Views/Placeholder/Views/BasePlaceholderView.swift b/TIUIElements/Sources/Views/Placeholder/Views/BasePlaceholderView.swift index f101df37..49b6cca7 100644 --- a/TIUIElements/Sources/Views/Placeholder/Views/BasePlaceholderView.swift +++ b/TIUIElements/Sources/Views/Placeholder/Views/BasePlaceholderView.swift @@ -31,44 +31,74 @@ open class BasePlaceholderView: BaseInitializableView { public let controlsStackView = UIStackView() public private(set) lazy var imageViewConstraints: SubviewConstraints = { - SubviewConstraints(edgeConstraints: EdgeConstraints(leadingConstraint: imageView.leadingAnchor.constraint(equalTo: leadingAnchor), - trailingConstraint: imageView.trailingAnchor.constraint(equalTo: trailingAnchor), - topConstraint: imageView.topAnchor.constraint(equalTo: topAnchor), - bottomConstraint: imageView.bottomAnchor.constraint(equalTo: textView.topAnchor)), - centerConstraints: CenterConstraints(centerXConstraint: imageView.centerXAnchor.constraint(equalTo: centerXAnchor), - centerYConstraint: imageView.centerYAnchor.constraint(equalTo: centerYAnchor)), - sizeConstraints: SizeConstraints(widthConstraint: imageView.widthAnchor.constraint(equalToConstant: .zero), - heightConstraint: imageView.heightAnchor.constraint(equalToConstant: .zero))) + let edgeConstraints = EdgeConstraints(leadingConstraint: imageView.leadingAnchor.constraint(equalTo: leadingAnchor), + trailingConstraint: imageView.trailingAnchor.constraint(equalTo: trailingAnchor), + topConstraint: imageView.topAnchor.constraint(equalTo: topAnchor), + bottomConstraint: imageView.bottomAnchor.constraint(equalTo: textView.topAnchor)) + + let centerConstraints = CenterConstraints(centerXConstraint: imageView.centerXAnchor.constraint(equalTo: centerXAnchor), + centerYConstraint: imageView.centerYAnchor.constraint(equalTo: centerYAnchor)) + + let sizeConstraints = SizeConstraints(widthConstraint: imageView.widthAnchor.constraint(equalToConstant: .zero), + heightConstraint: imageView.heightAnchor.constraint(equalToConstant: .zero)) + + return SubviewConstraints(edgeConstraints: edgeConstraints, + centerConstraints: centerConstraints, + sizeConstraints: sizeConstraints) }() public private(set) lazy var textViewTopToSuperviewTopConstraint: NSLayoutConstraint = { textView.topAnchor.constraint(equalTo: topAnchor) }() - public private(set) lazy var textViewBottomToSuperviewBottomConstraint: NSLayoutConstraint = { + public private(set) lazy var textViewToSuperviewBottomConstraint: NSLayoutConstraint = { textView.bottomAnchor.constraint(equalTo: bottomAnchor) }() public private(set) lazy var textViewConstraints: SubviewConstraints = { - SubviewConstraints(edgeConstraints: EdgeConstraints(leadingConstraint: textView.leadingAnchor.constraint(equalTo: leadingAnchor), - trailingConstraint: textView.trailingAnchor.constraint(equalTo: trailingAnchor), - topConstraint: textView.topAnchor.constraint(equalTo: imageView.bottomAnchor), - bottomConstraint: textView.bottomAnchor.constraint(lessThanOrEqualTo: controlsStackView.topAnchor)), - centerConstraints: CenterConstraints(centerXConstraint: textView.centerXAnchor.constraint(equalTo: centerXAnchor), - centerYConstraint: textView.centerYAnchor.constraint(equalTo: centerYAnchor)), - sizeConstraints: SizeConstraints(widthConstraint: textView.widthAnchor.constraint(equalToConstant: .zero), - heightConstraint: textView.heightAnchor.constraint(equalToConstant: .zero))) + let bottomConstraint = textView.bottomAnchor.constraint(lessThanOrEqualTo: controlsStackView.topAnchor) + + let edgeConstraints = EdgeConstraints(leadingConstraint: textView.leadingAnchor.constraint(equalTo: leadingAnchor), + trailingConstraint: textView.trailingAnchor.constraint(equalTo: trailingAnchor), + topConstraint: textView.topAnchor.constraint(equalTo: imageView.bottomAnchor), + bottomConstraint: bottomConstraint) + + let centerConstraints = CenterConstraints(centerXConstraint: textView.centerXAnchor.constraint(equalTo: centerXAnchor), + centerYConstraint: textView.centerYAnchor.constraint(equalTo: centerYAnchor)) + + let sizeConstraints = SizeConstraints(widthConstraint: textView.widthAnchor.constraint(equalToConstant: .zero), + heightConstraint: textView.heightAnchor.constraint(equalToConstant: .zero)) + + return SubviewConstraints(edgeConstraints: edgeConstraints, + centerConstraints: centerConstraints, + sizeConstraints: sizeConstraints) }() public private(set) lazy var controlsViewConstraints: SubviewConstraints = { - SubviewConstraints(edgeConstraints: EdgeConstraints(leadingConstraint: controlsStackView.leadingAnchor.constraint(equalTo: leadingAnchor), - trailingConstraint: controlsStackView.trailingAnchor.constraint(equalTo: trailingAnchor), - topConstraint: controlsStackView.topAnchor.constraint(equalTo: textView.bottomAnchor), - bottomConstraint: controlsStackView.bottomAnchor.constraint(lessThanOrEqualTo: bottomAnchor)), - centerConstraints: CenterConstraints(centerXConstraint: controlsStackView.centerXAnchor.constraint(equalTo: centerXAnchor), - centerYConstraint: controlsStackView.centerYAnchor.constraint(equalTo: centerYAnchor)), - sizeConstraints: SizeConstraints(widthConstraint: controlsStackView.widthAnchor.constraint(equalToConstant: .zero), - heightConstraint: controlsStackView.heightAnchor.constraint(equalToConstant: .zero))) + let leadingConstraint = controlsStackView.leadingAnchor.constraint(equalTo: leadingAnchor) + let trailingConstraint = controlsStackView.trailingAnchor.constraint(equalTo: trailingAnchor) + let topConstraint = controlsStackView.topAnchor.constraint(equalTo: textView.bottomAnchor) + let bottomConstraint = controlsStackView.bottomAnchor.constraint(lessThanOrEqualTo: bottomAnchor) + + let edgeConstraints = EdgeConstraints(leadingConstraint: leadingConstraint, + trailingConstraint: trailingConstraint, + topConstraint: topConstraint, + bottomConstraint: bottomConstraint) + + let centerXConstraint = controlsStackView.centerXAnchor.constraint(equalTo: centerXAnchor) + let centerYConstraint = controlsStackView.centerYAnchor.constraint(equalTo: centerYAnchor) + + let centerConstraints = CenterConstraints(centerXConstraint: centerXConstraint, + centerYConstraint: centerYConstraint) + + let heightConstraint = controlsStackView.heightAnchor.constraint(equalToConstant: .zero) + + let sizeConstraints = SizeConstraints(widthConstraint: controlsStackView.widthAnchor.constraint(equalToConstant: .zero), + heightConstraint: heightConstraint) + + return SubviewConstraints(edgeConstraints: edgeConstraints, + centerConstraints: centerConstraints, + sizeConstraints: sizeConstraints) }() public var keyboardDidShownObserver: NSObjectProtocol? @@ -82,18 +112,6 @@ open class BasePlaceholderView: BaseInitializableView { controlsStackView.isHidden || controlsStackView.arrangedSubviews.isEmpty } - // MARK: - Deinit - - deinit { - if let keyboardDidShownObserver = keyboardDidShownObserver { - NotificationCenter.default.removeObserver(keyboardDidShownObserver) - } - - if let keyboardDidHiddenObserver = keyboardDidHiddenObserver { - NotificationCenter.default.removeObserver(keyboardDidHiddenObserver) - } - } - // MARK: - BaseInitializableView open override func addViews() { @@ -146,7 +164,7 @@ open class BasePlaceholderView: BaseInitializableView { // MARK: - Open methods - open func applyBaseStyle(style: BasePlaceholderStyle & ViewAppearance>) { + open func applyBase(style: BasePlaceholderStyle & ViewAppearance>) { textView.configure(with: style.titleSubtitle) controlsStackView.axis = style.controlsViewAxis @@ -158,7 +176,7 @@ open class BasePlaceholderView: BaseInitializableView { controlsStackView.addArrangedSubview(button) } - configureAppearance(appearance: style.appearance) + configureBase(appearance: style.appearance) } open func addAction(_ action: UIButton.Action, @@ -169,10 +187,10 @@ open class BasePlaceholderView: BaseInitializableView { button?.addTarget(action.target, action: action.action, for: action.event) } - open func configureAppearance(appearance: BaseAppearance) { - configureImageViewLayout(layout: appearance.imageViewAppearance.layout) - configureTextViewLayout(layout: appearance.textViewAppearance.layout) - configureControlsViewLayout(layout: appearance.controlsViewAppearance.layout) + open func configureBase(appearance: BaseAppearance) { + configureImageView(layout: appearance.imageViewAppearance.layout) + configureTextView(layout: appearance.textViewAppearance.layout) + configureControlsView(layout: appearance.controlsViewAppearance.layout) configureUIView(appearance: appearance) textView.configure(appearance: appearance.textViewAppearance) @@ -183,13 +201,13 @@ open class BasePlaceholderView: BaseInitializableView { let multiplier = isKeyboardHidden ? 1.0 : -1.0 if let height = getKeyboardHeight(notification) { - controlsViewConstraints.edgeConstraints.bottomConstraint?.constant = multiplier * height / 2 + controlsViewConstraints.edgeConstraints.bottomConstraint.constant = multiplier * height / 2 } } // MARK: - Private methods - private func configureImageViewLayout(layout: WrappedViewLayout) { + private func configureImageView(layout: WrappedViewLayout) { guard !isImageViewHidden else { imageViewConstraints.deactivate() return @@ -198,17 +216,17 @@ open class BasePlaceholderView: BaseInitializableView { imageViewConstraints.update(from: layout) } - private func configureTextViewLayout(layout: WrappedViewLayout) { - textViewConstraints.edgeConstraints.topConstraint?.isActive = !isImageViewHidden + private func configureTextView(layout: WrappedViewLayout) { + textViewConstraints.edgeConstraints.topConstraint.isActive = !isImageViewHidden textViewTopToSuperviewTopConstraint.isActive = isImageViewHidden - textViewConstraints.edgeConstraints.bottomConstraint?.isActive = !isControlsViewHidden - textViewBottomToSuperviewBottomConstraint.isActive = isControlsViewHidden + textViewConstraints.edgeConstraints.bottomConstraint.isActive = !isControlsViewHidden + textViewToSuperviewBottomConstraint.isActive = isControlsViewHidden textViewConstraints.update(from: layout) } - private func configureControlsViewLayout(layout: SpacedWrappedViewLayout) { + private func configureControlsView(layout: SpacedWrappedViewLayout) { guard !isControlsViewHidden else { controlsViewConstraints.deactivate() return diff --git a/TIUIElements/Sources/Views/Placeholder/Views/DefaultPlaceholderView.swift b/TIUIElements/Sources/Views/Placeholder/Views/DefaultPlaceholderView.swift index d86a2793..7cebb901 100644 --- a/TIUIElements/Sources/Views/Placeholder/Views/DefaultPlaceholderView.swift +++ b/TIUIElements/Sources/Views/Placeholder/Views/DefaultPlaceholderView.swift @@ -32,7 +32,7 @@ public final class DefaultPlaceholderView: BasePlaceholderView, App public func apply(style: DefaultPlaceholderStyle) { imageView.image = style.image - super.applyBaseStyle(style: style) + super.applyBase(style: style) guard let image = imageView.image else { return @@ -44,14 +44,14 @@ public final class DefaultPlaceholderView: BasePlaceholderView, App // MARK: - AppearanceConfigurable public func configure(appearance: Appearance) { - configureAppearance(appearance: appearance) + configureBase(appearance: appearance) } } // MARK: - Default appearance model -extension DefaultPlaceholderView { - public final class Appearance: BaseAppearance, ViewAppearance { +public extension DefaultPlaceholderView { + final class Appearance: BaseAppearance, ViewAppearance { public static var defaultAppearance: Self { .init() } diff --git a/TIUIElements/Sources/Views/StatefulButton/StatefulButton+ApplyStyle.swift b/TIUIElements/Sources/Views/StatefulButton/StatefulButton+ApplyStyle.swift index da7b1f67..29effcbf 100644 --- a/TIUIElements/Sources/Views/StatefulButton/StatefulButton+ApplyStyle.swift +++ b/TIUIElements/Sources/Views/StatefulButton/StatefulButton+ApplyStyle.swift @@ -20,11 +20,11 @@ // THE SOFTWARE. // -extension StatefulButton { - public func apply(style: BaseButtonStyle) { +public extension StatefulButton { + func apply(style: BaseButtonStyle) { set(titles: style.titles) set(images: style.images) - set(appearance: style.appearance) + configureStatefulButton(appearance: style.appearance) if let action = style.action { addTarget(action.target, action: action.action, for: action.event) diff --git a/TIUIElements/Sources/Wrappers/Constraints/CenterConstraints.swift b/TIUIElements/Sources/Wrappers/Constraints/CenterConstraints.swift index 7b107417..5f55c07d 100644 --- a/TIUIElements/Sources/Wrappers/Constraints/CenterConstraints.swift +++ b/TIUIElements/Sources/Wrappers/Constraints/CenterConstraints.swift @@ -23,8 +23,8 @@ import UIKit public struct CenterConstraints: ConstraintsSet { - public let centerXConstraint: NSLayoutConstraint? - public let centerYConstraint: NSLayoutConstraint? + public var centerXConstraint: NSLayoutConstraint + public var centerYConstraint: NSLayoutConstraint // MARK: - ConstraintsSet @@ -32,23 +32,18 @@ public struct CenterConstraints: ConstraintsSet { [ centerXConstraint, centerYConstraint - ].compactMap { $0 } + ] } - public init(centerXConstraint: NSLayoutConstraint? = nil, - centerYConstraint: NSLayoutConstraint? = nil) { + public init(centerXConstraint: NSLayoutConstraint, + centerYConstraint: NSLayoutConstraint) { self.centerXConstraint = centerXConstraint self.centerYConstraint = centerYConstraint } public func update(offset: UIOffset) { - centerXConstraint?.setActiveConstantOrDeactivate(constant: offset.horizontal) - centerYConstraint?.setActiveConstantOrDeactivate(constant: offset.vertical) - } - - public var centerConstraints: [NSLayoutConstraint] { - [centerXConstraint, centerYConstraint] - .compactMap { $0 } + centerXConstraint.setActiveConstantOrDeactivate(constant: offset.horizontal) + centerYConstraint.setActiveConstantOrDeactivate(constant: offset.vertical) } } diff --git a/TIUIElements/Sources/Wrappers/Constraints/EdgeConstraints.swift b/TIUIElements/Sources/Wrappers/Constraints/EdgeConstraints.swift index b25ea645..06afa29a 100644 --- a/TIUIElements/Sources/Wrappers/Constraints/EdgeConstraints.swift +++ b/TIUIElements/Sources/Wrappers/Constraints/EdgeConstraints.swift @@ -23,10 +23,10 @@ import UIKit public struct EdgeConstraints: ConstraintsSet { - public let leadingConstraint: NSLayoutConstraint? - public let trailingConstraint: NSLayoutConstraint? - public let topConstraint: NSLayoutConstraint? - public let bottomConstraint: NSLayoutConstraint? + public var leadingConstraint: NSLayoutConstraint + public var trailingConstraint: NSLayoutConstraint + public var topConstraint: NSLayoutConstraint + public var bottomConstraint: NSLayoutConstraint // MARK: - ConstraintsSet @@ -36,27 +36,27 @@ public struct EdgeConstraints: ConstraintsSet { trailingConstraint, topConstraint, bottomConstraint - ].compactMap { $0 } + ] } public var horizontal: [NSLayoutConstraint] { [ leadingConstraint, trailingConstraint - ].compactMap { $0 } + ] } public var vertical: [NSLayoutConstraint] { [ topConstraint, bottomConstraint - ].compactMap { $0 } + ] } - public init(leadingConstraint: NSLayoutConstraint? = nil, - trailingConstraint: NSLayoutConstraint? = nil, - topConstraint: NSLayoutConstraint? = nil, - bottomConstraint: NSLayoutConstraint? = nil) { + public init(leadingConstraint: NSLayoutConstraint, + trailingConstraint: NSLayoutConstraint, + topConstraint: NSLayoutConstraint, + bottomConstraint: NSLayoutConstraint) { self.leadingConstraint = leadingConstraint self.trailingConstraint = trailingConstraint @@ -65,9 +65,9 @@ public struct EdgeConstraints: ConstraintsSet { } public func update(from insets: UIEdgeInsets) { - leadingConstraint?.setActiveConstantOrDeactivate(constant: insets.left) - trailingConstraint?.setActiveConstantOrDeactivate(constant: -insets.right) - topConstraint?.setActiveConstantOrDeactivate(constant: insets.top) - bottomConstraint?.setActiveConstantOrDeactivate(constant: -insets.bottom) + leadingConstraint.setActiveConstantOrDeactivate(constant: insets.left) + trailingConstraint.setActiveConstantOrDeactivate(constant: -insets.right) + topConstraint.setActiveConstantOrDeactivate(constant: insets.top) + bottomConstraint.setActiveConstantOrDeactivate(constant: -insets.bottom) } } diff --git a/TIUIElements/Sources/Wrappers/Constraints/NSLayoutConstraint+SetActiveOrDeactivate.swift b/TIUIElements/Sources/Wrappers/Constraints/NSLayoutConstraint+SetActiveOrDeactivate.swift index 4929b2c3..3b5058c0 100644 --- a/TIUIElements/Sources/Wrappers/Constraints/NSLayoutConstraint+SetActiveOrDeactivate.swift +++ b/TIUIElements/Sources/Wrappers/Constraints/NSLayoutConstraint+SetActiveOrDeactivate.swift @@ -22,7 +22,7 @@ import UIKit.NSLayoutConstraint -extension NSLayoutConstraint { +public extension NSLayoutConstraint { func setActiveConstantOrDeactivate(constant: CGFloat) { if constant.isFinite { self.constant = constant diff --git a/TIUIElements/Sources/Wrappers/Constraints/SizeConstraints.swift b/TIUIElements/Sources/Wrappers/Constraints/SizeConstraints.swift index b26d9288..178b42d4 100644 --- a/TIUIElements/Sources/Wrappers/Constraints/SizeConstraints.swift +++ b/TIUIElements/Sources/Wrappers/Constraints/SizeConstraints.swift @@ -23,8 +23,8 @@ import UIKit public struct SizeConstraints: ConstraintsSet { - public let widthConstraint: NSLayoutConstraint? - public let heightConstraint: NSLayoutConstraint? + public var widthConstraint: NSLayoutConstraint + public var heightConstraint: NSLayoutConstraint // MARK: - ConstraintsSet @@ -32,18 +32,18 @@ public struct SizeConstraints: ConstraintsSet { [ widthConstraint, heightConstraint - ].compactMap { $0 } + ] } - public init(widthConstraint: NSLayoutConstraint? = nil, - heightConstraint: NSLayoutConstraint? = nil) { + public init(widthConstraint: NSLayoutConstraint, + heightConstraint: NSLayoutConstraint) { self.widthConstraint = widthConstraint self.heightConstraint = heightConstraint } public func update(from size: CGSize) { - widthConstraint?.setActiveConstantOrDeactivate(constant: size.width) - heightConstraint?.setActiveConstantOrDeactivate(constant: size.height) + widthConstraint.setActiveConstantOrDeactivate(constant: size.width) + heightConstraint.setActiveConstantOrDeactivate(constant: size.height) } } diff --git a/TIUIElements/Sources/Wrappers/Constraints/SubviewConstraints.swift b/TIUIElements/Sources/Wrappers/Constraints/SubviewConstraints.swift index 64372a50..99ab271a 100644 --- a/TIUIElements/Sources/Wrappers/Constraints/SubviewConstraints.swift +++ b/TIUIElements/Sources/Wrappers/Constraints/SubviewConstraints.swift @@ -35,8 +35,8 @@ public struct SubviewConstraints: ConstraintsSet { } public init(edgeConstraints: EdgeConstraints, - centerConstraints: CenterConstraints, - sizeConstraints: SizeConstraints) { + centerConstraints: CenterConstraints, + sizeConstraints: SizeConstraints) { self.edgeConstraints = edgeConstraints self.centerConstraints = centerConstraints @@ -59,9 +59,12 @@ public struct SubviewConstraints: ConstraintsSet { // MARK: - WrappedViewLayout shortcut - func update(from layout: some WrappedViewLayout) { + @discardableResult + public func update(from layout: some WrappedViewLayout) -> Self { update(insets: layout.insets, size: layout.size, centerOffset: layout.centerOffset) + + return self } } diff --git a/TIUIElements/Sources/Wrappers/Containers/CollectionTableViewCell.swift b/TIUIElements/Sources/Wrappers/Containers/CollectionTableViewCell.swift index 43c2aed1..d753f46f 100644 --- a/TIUIElements/Sources/Wrappers/Containers/CollectionTableViewCell.swift +++ b/TIUIElements/Sources/Wrappers/Containers/CollectionTableViewCell.swift @@ -31,7 +31,7 @@ open class CollectionTableViewCell: ContainerT if #available(iOS 16, *) { contentSizeObservation = wrappedView.observe(\.contentSize, - options: [.new]) { collectionView, change in + options: [.new]) { collectionView, change in if let contentSize = change.newValue, !contentSize.equalTo(collectionView.bounds.size) { self.invalidateIntrinsicContentSize() @@ -52,12 +52,12 @@ open class CollectionTableViewCell: ContainerT } let cachedCollectionFrame = wrappedView.frame - wrappedView.frame.size.width = targetSize.width - contentInsets.left - contentInsets.right + wrappedView.frame.size.width = targetSize.width - wrappedContentInsets.left - wrappedContentInsets.right let collectionContentHeight = wrappedView.collectionViewLayout.collectionViewContentSize.height wrappedView.frame = cachedCollectionFrame return CGSize(width: targetSize.width, - height: collectionContentHeight + contentInsets.top + contentInsets.bottom) + height: collectionContentHeight + wrappedContentInsets.top + wrappedContentInsets.bottom) } // MARK: - Open methods diff --git a/TIUIElements/Sources/Wrappers/Containers/ContainerCollectionViewCell.swift b/TIUIElements/Sources/Wrappers/Containers/ContainerCollectionViewCell.swift index 983a88da..85b484fb 100644 --- a/TIUIElements/Sources/Wrappers/Containers/ContainerCollectionViewCell.swift +++ b/TIUIElements/Sources/Wrappers/Containers/ContainerCollectionViewCell.swift @@ -26,24 +26,24 @@ import TIUIKitCore open class ContainerCollectionViewCell: UICollectionViewCell, InitializableViewProtocol, WrappedViewHolder { public var callbacks: [ViewCallbacks] = [] - + // MARK: - WrappedViewHolder public private(set) lazy var wrappedView = createView() - public var contentInsets: UIEdgeInsets = .zero { + public var wrappedContentInsets: UIEdgeInsets = .zero { didSet { update(subviewConstraints: subviewContraints) } } - public var contentSize: CGSize = .infinity { + public var wrappedContentSize: CGSize = .infinity { didSet { update(subviewConstraints: subviewContraints) } } - public var contentCenterOffset: UIOffset = .nan { + public var wrappedContentCenterOffset: UIOffset = .nan { didSet { update(subviewConstraints: subviewContraints) } @@ -98,6 +98,6 @@ open class ContainerCollectionViewCell: UICollectionViewCell, Init } open func createView() -> View { - return View() + View() } } diff --git a/TIUIElements/Sources/Wrappers/Containers/ContainerScrollView.swift b/TIUIElements/Sources/Wrappers/Containers/ContainerScrollView.swift new file mode 100644 index 00000000..fda07019 --- /dev/null +++ b/TIUIElements/Sources/Wrappers/Containers/ContainerScrollView.swift @@ -0,0 +1,73 @@ +// +// Copyright (c) 2023 Touch Instinct +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the Software), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import TIUIKitCore +import UIKit + +open class ContainerScrollView: BaseInitializeableScrollView, WrappedViewHolder { + + // MARK: - WrappedViewHolder + + public private(set) lazy var wrappedView = createView() + + public var wrappedContentInsets: UIEdgeInsets = .zero { + didSet { + update(subviewConstraints: subviewContraints) + } + } + + public var wrappedContentSize: CGSize = .infinity { + didSet { + update(subviewConstraints: subviewContraints) + } + } + + public var wrappedContentCenterOffset: UIOffset = .nan { + didSet { + update(subviewConstraints: subviewContraints) + } + } + + private lazy var subviewContraints: SubviewConstraints = { + configureWrappedViewLayout() + }() + + open func createView() -> ContentView { + ContentView() + } + + // MARK: - InitializableViewProtocol + + open override func addViews() { + super.addViews() + + addSubview(wrappedView) + } +} + +extension ContainerScrollView: AppearanceConfigurable where View: AppearanceConfigurable, + View.Appearance: WrappedViewAppearance { + + public func configure(appearance: DefaultWrappedViewHolderAppearance) { + configureWrappedViewHolder(appearance: appearance) + } +} diff --git a/TIUIElements/Sources/Wrappers/Containers/ContainerTableViewCell.swift b/TIUIElements/Sources/Wrappers/Containers/ContainerTableViewCell.swift index fc2a93f9..233911c2 100644 --- a/TIUIElements/Sources/Wrappers/Containers/ContainerTableViewCell.swift +++ b/TIUIElements/Sources/Wrappers/Containers/ContainerTableViewCell.swift @@ -24,24 +24,24 @@ import UIKit import TIUIKitCore open class ContainerTableViewCell: BaseInitializableCell, WrappedViewHolder { - + // MARK: - WrappedViewHolder public private(set) lazy var wrappedView = createView() - public var contentInsets: UIEdgeInsets = .zero { + public var wrappedContentInsets: UIEdgeInsets = .zero { didSet { update(subviewConstraints: subviewContraints) } } - public var contentSize: CGSize = .infinity { + public var wrappedContentSize: CGSize = .infinity { didSet { update(subviewConstraints: subviewContraints) } } - public var contentCenterOffset: UIOffset = .nan { + public var wrappedContentCenterOffset: UIOffset = .nan { didSet { update(subviewConstraints: subviewContraints) } @@ -66,14 +66,7 @@ open class ContainerTableViewCell: BaseInitializableCell, WrappedV } open func createView() -> View { - return View() - } - - // MARK: - Open methods - - public func configureContainerTableViewCell(appearance: BaseWrappedViewHolderAppearance) { - updateContentLayout(from: appearance.subviewAppearance.layout) - configureUIView(appearance: appearance) + View() } } @@ -82,8 +75,7 @@ open class ContainerTableViewCell: BaseInitializableCell, WrappedV extension ContainerTableViewCell: AppearanceConfigurable where View: AppearanceConfigurable, View.Appearance: WrappedViewAppearance { - public func configure(appearance: DefaultWrappedViewHolderAppearance) { - configureContainerTableViewCell(appearance: appearance) - wrappedView.configure(appearance: appearance.subviewAppearance) + public func configure(appearance: DefaultWrappedViewHolderAppearance) { + configureWrappedViewHolder(appearance: appearance) } } diff --git a/TIUIElements/Sources/Wrappers/Containers/ContainerView.swift b/TIUIElements/Sources/Wrappers/Containers/ContainerView.swift index e3366378..9549c06b 100644 --- a/TIUIElements/Sources/Wrappers/Containers/ContainerView.swift +++ b/TIUIElements/Sources/Wrappers/Containers/ContainerView.swift @@ -27,19 +27,19 @@ public final class ContainerView: BaseInitializableView, WrappedVi public private(set) lazy var wrappedView = View() - public var contentInsets: UIEdgeInsets = .zero { + public var wrappedContentInsets: UIEdgeInsets = .zero { didSet { update(subviewConstraints: subviewContraints) } } - public var contentSize: CGSize = .infinity { + public var wrappedContentSize: CGSize = .infinity { didSet { update(subviewConstraints: subviewContraints) } } - public var contentCenterOffset: UIOffset = .nan { + public var wrappedContentCenterOffset: UIOffset = .nan { didSet { update(subviewConstraints: subviewContraints) } @@ -80,8 +80,6 @@ extension ContainerView: AppearanceConfigurable where View: AppearanceConfigurab public typealias Appearance = UIView.DefaultWrappedViewHolderAppearance public func configure(appearance: Appearance) { - wrappedView.configure(appearance: appearance.subviewAppearance) - configureUIView(appearance: appearance) - updateContentLayout(from: appearance.subviewAppearance.layout) + configureWrappedViewHolder(appearance: appearance) } } diff --git a/TIUIElements/Sources/Wrappers/Containers/ReusableCollectionContainerView.swift b/TIUIElements/Sources/Wrappers/Containers/ReusableCollectionContainerView.swift index 9f62832c..af087046 100644 --- a/TIUIElements/Sources/Wrappers/Containers/ReusableCollectionContainerView.swift +++ b/TIUIElements/Sources/Wrappers/Containers/ReusableCollectionContainerView.swift @@ -23,26 +23,28 @@ import UIKit import TIUIKitCore -open class ReusableCollectionContainerView: UICollectionReusableView, InitializableViewProtocol, WrappedViewHolder { +open class ReusableCollectionContainerView: UICollectionReusableView, + InitializableViewProtocol, + WrappedViewHolder { public var callbacks: [ViewCallbacks] = [] // MARK: - WrappedViewHolder - + public private(set) lazy var wrappedView = createView() - public var contentInsets: UIEdgeInsets = .zero { + public var wrappedContentInsets: UIEdgeInsets = .zero { didSet { update(subviewConstraints: subviewContraints) } } - public var contentSize: CGSize = .infinity { + public var wrappedContentSize: CGSize = .infinity { didSet { update(subviewConstraints: subviewContraints) } } - public var contentCenterOffset: UIOffset = .nan { + public var wrappedContentCenterOffset: UIOffset = .nan { didSet { update(subviewConstraints: subviewContraints) } @@ -97,6 +99,6 @@ open class ReusableCollectionContainerView: UICollectionReusableVi } open func createView() -> View { - return View() + View() } } diff --git a/TIUIElements/Sources/Wrappers/Extensions/WrappedViewLayout+Constraints.swift b/TIUIElements/Sources/Wrappers/Extensions/WrappedViewHolder+AppearanceConfigurable.swift similarity index 57% rename from TIUIElements/Sources/Wrappers/Extensions/WrappedViewLayout+Constraints.swift rename to TIUIElements/Sources/Wrappers/Extensions/WrappedViewHolder+AppearanceConfigurable.swift index dfd1d949..5fcd2186 100644 --- a/TIUIElements/Sources/Wrappers/Extensions/WrappedViewLayout+Constraints.swift +++ b/TIUIElements/Sources/Wrappers/Extensions/WrappedViewHolder+AppearanceConfigurable.swift @@ -21,12 +21,22 @@ // import TIUIKitCore -import UIKit +import UIKit.UIView -public extension WrappedViewLayout { - func update(constraints: SubviewConstraints) { - constraints.update(insets: insets, - size: size, - centerOffset: centerOffset) +public extension WrappedViewHolder { + func configureBaseWrappedViewHolder(appearance: some UIView.BaseWrappedViewHolderAppearance< + some WrappedViewAppearance, + some ViewLayout>) { + updateContentLayout(from: appearance.subviewAppearance.layout) + contentView.configureUIView(appearance: appearance) + } +} + +public extension WrappedViewHolder where View: AppearanceConfigurable, View.Appearance: WrappedViewAppearance { + func configureWrappedViewHolder(appearance: some UIView.BaseWrappedViewHolderAppearance< + View.Appearance, + some ViewLayout>) { + configureBaseWrappedViewHolder(appearance: appearance) + wrappedView.configure(appearance: appearance.subviewAppearance) } } diff --git a/TIUIElements/Sources/Wrappers/Protocols/WrappedViewHolder.swift b/TIUIElements/Sources/Wrappers/Protocols/WrappedViewHolder.swift index 54b6dd50..01ce6d97 100644 --- a/TIUIElements/Sources/Wrappers/Protocols/WrappedViewHolder.swift +++ b/TIUIElements/Sources/Wrappers/Protocols/WrappedViewHolder.swift @@ -28,9 +28,10 @@ public protocol WrappedViewHolder: AnyObject { var wrappedView: View { get } var contentView: UIView { get } - var contentInsets: UIEdgeInsets { get set } - var contentSize: CGSize { get set } - var contentCenterOffset: UIOffset { get set } + + var wrappedContentInsets: UIEdgeInsets { get set } + var wrappedContentSize: CGSize { get set } + var wrappedContentCenterOffset: UIOffset { get set } } public extension WrappedViewHolder { @@ -65,17 +66,17 @@ public extension WrappedViewHolder { // MARK: - SubviewConstraints shortcut func update(subviewConstraints: SubviewConstraints) { - subviewConstraints.update(insets: contentInsets, - size: contentSize, - centerOffset: contentCenterOffset) + subviewConstraints.update(insets: wrappedContentInsets, + size: wrappedContentSize, + centerOffset: wrappedContentCenterOffset) } // MARK: - WrappedViewLayout shortcut func updateContentLayout(from layout: some WrappedViewLayout) { - contentInsets = layout.insets - contentSize = layout.size - contentCenterOffset = layout.centerOffset + wrappedContentInsets = layout.insets + wrappedContentSize = layout.size + wrappedContentCenterOffset = layout.centerOffset } } diff --git a/TIUIElements/TIUIElements.app/Contents/MacOS/TIUIElements.playground/Pages/Placeholder.xcplaygroundpage/Contents.swift b/TIUIElements/TIUIElements.app/Contents/MacOS/TIUIElements.playground/Pages/Placeholder.xcplaygroundpage/Contents.swift index 46138048..b29ba3f6 100644 --- a/TIUIElements/TIUIElements.app/Contents/MacOS/TIUIElements.playground/Pages/Placeholder.xcplaygroundpage/Contents.swift +++ b/TIUIElements/TIUIElements.app/Contents/MacOS/TIUIElements.playground/Pages/Placeholder.xcplaygroundpage/Contents.swift @@ -57,10 +57,10 @@ let customStyle = DefaultPlaceholderStyle( }, buttonsStyles: [ .init(titles: [.normal: "Reload"], appearance: .init(stateAppearances: [ - .normal: UIButton.DefaultAppearance(textAttributes: .init(font: .systemFont(ofSize: 20), - color: .black, - alignment: .natural, - isMultiline: false)) + .normal: UIButton.DefaultStateAppearance(textAttributes: .init(font: .systemFont(ofSize: 20), + color: .black, + alignment: .natural, + isMultiline: false)) ])) ]) diff --git a/TIUIKitCore/Sources/Extensions/UIKit/UIEdgeInsets+Extensions.swift b/TIUIKitCore/Sources/Extensions/UIKit/UIEdgeInsets+Extensions.swift index 41d9af39..c27fb07d 100644 --- a/TIUIKitCore/Sources/Extensions/UIKit/UIEdgeInsets+Extensions.swift +++ b/TIUIKitCore/Sources/Extensions/UIKit/UIEdgeInsets+Extensions.swift @@ -31,33 +31,31 @@ public extension UIEdgeInsets { } static func horizontal(_ insets: CGFloat) -> UIEdgeInsets { - .init(top: .zero, left: insets, bottom: .zero, right: insets) + .init(top: .nan, left: insets, bottom: .nan, right: insets) } static func vertical(_ insets: CGFloat) -> UIEdgeInsets { - .init(top: insets, left: .zero, bottom: insets, right: .zero) + .init(top: insets, left: .nan, bottom: insets, right: .nan) } - static func horizontal(left: CGFloat = .zero, right: CGFloat = .zero) -> UIEdgeInsets { - .init(top: .zero, left: left, bottom: .zero, right: right) + static func horizontal(left: CGFloat = .nan, right: CGFloat = .nan) -> UIEdgeInsets { + .init(top: .nan, left: left, bottom: .nan, right: right) } - static func vertical(top: CGFloat = .zero, bottom: CGFloat = .zero) -> UIEdgeInsets { - .init(top: top, left: .zero, bottom: bottom, right: .zero) - } - - // MARK: - Computed Properties - - var vertical: CGFloat { - top + bottom - } - - var horizontal: CGFloat { - left + right + static func vertical(top: CGFloat = .nan, bottom: CGFloat = .nan) -> UIEdgeInsets { + .init(top: top, left: .nan, bottom: bottom, right: .nan) } // MARK: - Instance methods + func vertical(onNan defaultValue: CGFloat = .nan) -> CGFloat { + add(\.top, to: \.bottom, of: self, onNan: defaultValue) + } + + func horizontal(onNan defaultValue: CGFloat = .nan) -> CGFloat { + add(\.left, to: \.right, of: self, onNan: defaultValue) + } + func horizontal(_ insets: CGFloat) -> UIEdgeInsets { .init(top: top, left: insets, bottom: bottom, right: insets) } @@ -73,4 +71,24 @@ public extension UIEdgeInsets { func vertical(top: CGFloat = .zero, bottom: CGFloat = .zero) -> UIEdgeInsets { .init(top: top, left: left, bottom: bottom, right: right) } + + func add(_ lhsKeyPath: KeyPath, + to rhsKeyPath: KeyPath, + of rhs: Self, + onNan defaultValue: CGFloat = .nan) -> CGFloat { + + let lhsValue = self[keyPath: lhsKeyPath] + let rhsValue = rhs[keyPath: rhsKeyPath] + + switch (lhsValue.isFinite, rhsValue.isFinite) { + case (true, true): + return lhsValue + rhsValue + case (true, false): + return lhsValue + case (false, true): + return rhsValue + case (false, false): + return defaultValue + } + } } diff --git a/docs/tibottomsheet/tibottomsheet.md b/docs/tibottomsheet/tibottomsheet.md index d8114635..5086aa85 100644 --- a/docs/tibottomsheet/tibottomsheet.md +++ b/docs/tibottomsheet/tibottomsheet.md @@ -58,7 +58,9 @@ class CustomViewController: BaseModalViewController { $0.layout.size = .fixedHeight(52) $0.backgroundColor = .white $0.contentViewState = .buttonLeft(.init(titles: [.normal: "Close"], - appearance: [.normal: .init(backgroundColor: .blue)])) + appearance: .init(stateAppearances: [ + .normal: .init(backgroundColor: .blue) + ]))) }) return appearance diff --git a/docs/tiuielements/placeholder.md b/docs/tiuielements/placeholder.md index 293fb70e..74074b2d 100644 --- a/docs/tiuielements/placeholder.md +++ b/docs/tiuielements/placeholder.md @@ -60,10 +60,10 @@ let customStyle = DefaultPlaceholderStyle( }, buttonsStyles: [ .init(titles: [.normal: "Reload"], appearance: .init(stateAppearances: [ - .normal: UIButton.DefaultAppearance(textAttributes: .init(font: .systemFont(ofSize: 20), - color: .black, - alignment: .natural, - isMultiline: false)) + .normal: UIButton.DefaultStateAppearance(textAttributes: .init(font: .systemFont(ofSize: 20), + color: .black, + alignment: .natural, + isMultiline: false)) ])) ]) -- 2.40.1 From 0ef1edfacb8ff8dcad0aef3c0f0c09e436b7368b Mon Sep 17 00:00:00 2001 From: Ivan Smolin Date: Tue, 25 Jul 2023 17:32:21 +0300 Subject: [PATCH 09/13] build: move included pan modal sources to separate dependency --- Package.resolved | 9 + Package.swift | 5 +- TIBottomSheet/PlaygroundPodfile | 2 + .../BottomSheet/BaseModalViewController.swift | 1 + .../Models/ModalViewPresentationDetent.swift | 1 + .../Views/PassthroughDimmedView.swift | 51 + .../PanModal/Animator/PanModalAnimator.swift | 40 - .../PanModalPresentationAnimator.swift | 172 ---- .../PanModalPresentationController.swift | 881 ------------------ .../PanModalPresentationDelegate.swift | 81 -- TIBottomSheet/Sources/PanModal/LICENSE | 19 - TIBottomSheet/Sources/PanModal/PanModal.h | 19 - .../PanModal/Presentable/PanModalHeight.swift | 44 - .../PanModalPresentable+Defaults.swift | 145 --- .../PanModalPresentable+LayoutHelpers.swift | 126 --- ...PanModalPresentable+UIViewController.swift | 63 -- .../Presentable/PanModalPresentable.swift | 231 ----- .../Presenter/PanModalPresenter.swift | 38 - .../UIViewController+PanModalPresenter.swift | 66 -- .../Sources/PanModal/View/DimmedView.swift | 131 --- .../PanModal/View/PanContainerView.swift | 44 - .../TIBottomSheet.app/Contents/MacOS/Podfile | 2 + .../Contents.swift | 26 +- TIBottomSheet/TIBottomSheet.podspec | 1 + docs/tibottomsheet/tibottomsheet.md | 26 +- 25 files changed, 92 insertions(+), 2132 deletions(-) create mode 100644 TIBottomSheet/Sources/BottomSheet/Views/PassthroughDimmedView.swift delete mode 100644 TIBottomSheet/Sources/PanModal/Animator/PanModalAnimator.swift delete mode 100644 TIBottomSheet/Sources/PanModal/Animator/PanModalPresentationAnimator.swift delete mode 100644 TIBottomSheet/Sources/PanModal/Controller/PanModalPresentationController.swift delete mode 100644 TIBottomSheet/Sources/PanModal/Delegate/PanModalPresentationDelegate.swift delete mode 100644 TIBottomSheet/Sources/PanModal/LICENSE delete mode 100644 TIBottomSheet/Sources/PanModal/PanModal.h delete mode 100644 TIBottomSheet/Sources/PanModal/Presentable/PanModalHeight.swift delete mode 100644 TIBottomSheet/Sources/PanModal/Presentable/PanModalPresentable+Defaults.swift delete mode 100644 TIBottomSheet/Sources/PanModal/Presentable/PanModalPresentable+LayoutHelpers.swift delete mode 100644 TIBottomSheet/Sources/PanModal/Presentable/PanModalPresentable+UIViewController.swift delete mode 100644 TIBottomSheet/Sources/PanModal/Presentable/PanModalPresentable.swift delete mode 100644 TIBottomSheet/Sources/PanModal/Presenter/PanModalPresenter.swift delete mode 100644 TIBottomSheet/Sources/PanModal/Presenter/UIViewController+PanModalPresenter.swift delete mode 100644 TIBottomSheet/Sources/PanModal/View/DimmedView.swift delete mode 100644 TIBottomSheet/Sources/PanModal/View/PanContainerView.swift diff --git a/Package.resolved b/Package.resolved index 810d97dc..14b78560 100644 --- a/Package.resolved +++ b/Package.resolved @@ -54,6 +54,15 @@ "version" : "15.0.0" } }, + { + "identity" : "panmodal", + "kind" : "remoteSourceControl", + "location" : "https://git.svc.touchin.ru/TouchInstinct/PanModal", + "state" : { + "revision" : "be82eddb529faa2bc668230906ec007c53e7b635", + "version" : "1.3.0" + } + }, { "identity" : "reactiveswift", "kind" : "remoteSourceControl", diff --git a/Package.swift b/Package.swift index 1d157285..c7cfa56b 100644 --- a/Package.swift +++ b/Package.swift @@ -55,7 +55,8 @@ let package = Package( .package(url: "https://github.com/Alamofire/Alamofire.git", .upToNextMajor(from: "5.4.0")), .package(url: "https://github.com/Moya/Moya.git", .upToNextMajor(from: "15.0.0")), .package(url: "https://github.com/hyperoslo/Cache.git", .upToNextMajor(from: "6.0.0")), - .package(url: "https://github.com/antlr/antlr4", .upToNextMinor(from: "4.10.1")) + .package(url: "https://github.com/antlr/antlr4", .upToNextMinor(from: "4.10.1")), + .package(url: "https://git.svc.touchin.ru/TouchInstinct/PanModal", .upToNextMinor(from: "1.3.0")) ], targets: [ @@ -70,7 +71,7 @@ let package = Package( .target(name: "TIWebView", dependencies: ["TIUIKitCore", "TISwiftUtils"], path: "TIWebView/Sources"), .target(name: "TIBottomSheet", - dependencies: ["TIUIElements", "TIUIKitCore", "TISwiftUtils"], + dependencies: ["PanModal", "TIUIElements", "TIUIKitCore", "TISwiftUtils"], path: "TIBottomSheet/Sources", exclude: ["../TIBottomSheet.app"], plugins: [.plugin(name: "TISwiftLintPlugin")]), diff --git a/TIBottomSheet/PlaygroundPodfile b/TIBottomSheet/PlaygroundPodfile index e44c2e85..beb2a489 100644 --- a/TIBottomSheet/PlaygroundPodfile +++ b/TIBottomSheet/PlaygroundPodfile @@ -1,5 +1,7 @@ ENV["DEVELOPMENT_INSTALL"] = "true" +source 'https://git.svc.touchin.ru/TouchInstinct/Podspecs.git' + target 'TIBottomSheet' do platform :ios, 11 use_frameworks! diff --git a/TIBottomSheet/Sources/BottomSheet/BaseModalViewController.swift b/TIBottomSheet/Sources/BottomSheet/BaseModalViewController.swift index 6114309b..01a7369e 100644 --- a/TIBottomSheet/Sources/BottomSheet/BaseModalViewController.swift +++ b/TIBottomSheet/Sources/BottomSheet/BaseModalViewController.swift @@ -24,6 +24,7 @@ import TISwiftUtils import TIUIElements import TIUIKitCore import UIKit +import PanModal open class BaseModalViewController: BaseInitializableViewController, PanModalPresentable { diff --git a/TIBottomSheet/Sources/BottomSheet/Models/ModalViewPresentationDetent.swift b/TIBottomSheet/Sources/BottomSheet/Models/ModalViewPresentationDetent.swift index 5f0d568b..6948914a 100644 --- a/TIBottomSheet/Sources/BottomSheet/Models/ModalViewPresentationDetent.swift +++ b/TIBottomSheet/Sources/BottomSheet/Models/ModalViewPresentationDetent.swift @@ -21,6 +21,7 @@ // import Foundation +import PanModal public struct ModalViewPresentationDetent: Hashable { diff --git a/TIBottomSheet/Sources/BottomSheet/Views/PassthroughDimmedView.swift b/TIBottomSheet/Sources/BottomSheet/Views/PassthroughDimmedView.swift new file mode 100644 index 00000000..70056aed --- /dev/null +++ b/TIBottomSheet/Sources/BottomSheet/Views/PassthroughDimmedView.swift @@ -0,0 +1,51 @@ +// +// Copyright (c) 2023 Touch Instinct +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the Software), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import UIKit +import PanModal + +open class PassthroughDimmedView: DimmedView { + weak var hitTestHandlerView: UIView? + + public var isTransparent = false + + public override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { + guard let hitTestHandlerView else { + return super.hitTest(point, with: event) + } + + return hitTestHandlerView.hitTest(point, with: event) + } + + public override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { + hitTestHandlerView == nil || super.point(inside: point, with: event) + } + + open override func onChange(dimState: DimmedView.DimState) { + guard !isTransparent else { + alpha = .zero + return + } + + super.onChange(dimState: dimState) + } +} diff --git a/TIBottomSheet/Sources/PanModal/Animator/PanModalAnimator.swift b/TIBottomSheet/Sources/PanModal/Animator/PanModalAnimator.swift deleted file mode 100644 index 712dd5d2..00000000 --- a/TIBottomSheet/Sources/PanModal/Animator/PanModalAnimator.swift +++ /dev/null @@ -1,40 +0,0 @@ -// -// PanModalAnimator.swift -// PanModal -// -// Copyright © 2019 Tiny Speck, Inc. All rights reserved. -// - -#if os(iOS) -import UIKit - -/** - Helper animation function to keep animations consistent. - */ -struct PanModalAnimator { - - /** - Constant Animation Properties - */ - struct Constants { - static let defaultTransitionDuration: TimeInterval = 0.5 - } - - static func animate(_ animations: @escaping PanModalPresentable.AnimationBlockType, - config: PanModalPresentable?, - _ completion: PanModalPresentable.AnimationCompletionType? = nil) { - - let transitionDuration = config?.transitionDuration ?? Constants.defaultTransitionDuration - let springDamping = config?.springDamping ?? 1.0 - let animationOptions = config?.transitionAnimationOptions ?? [] - - UIView.animate(withDuration: transitionDuration, - delay: 0, - usingSpringWithDamping: springDamping, - initialSpringVelocity: 0, - options: animationOptions, - animations: animations, - completion: completion) - } -} -#endif diff --git a/TIBottomSheet/Sources/PanModal/Animator/PanModalPresentationAnimator.swift b/TIBottomSheet/Sources/PanModal/Animator/PanModalPresentationAnimator.swift deleted file mode 100644 index f7fbdd0e..00000000 --- a/TIBottomSheet/Sources/PanModal/Animator/PanModalPresentationAnimator.swift +++ /dev/null @@ -1,172 +0,0 @@ -// -// PanModalPresentationAnimator.swift -// PanModal -// -// Copyright © 2019 Tiny Speck, Inc. All rights reserved. -// - -#if os(iOS) -import UIKit - -/** - Handles the animation of the presentedViewController as it is presented or dismissed. - - This is a vertical animation that - - Animates up from the bottom of the screen - - Dismisses from the top to the bottom of the screen - - This can be used as a standalone object for transition animation, - but is primarily used in the PanModalPresentationDelegate for handling pan modal transitions. - - - Note: The presentedViewController can conform to PanModalPresentable to adjust - it's starting position through manipulating the shortFormHeight - */ - -public class PanModalPresentationAnimator: NSObject { - - /** - Enum representing the possible transition styles - */ - public enum TransitionStyle { - case presentation - case dismissal - } - - // MARK: - Properties - - /** - The transition style - */ - private let transitionStyle: TransitionStyle - - /** - Haptic feedback generator (during presentation) - */ - private var feedbackGenerator: UISelectionFeedbackGenerator? - - // MARK: - Initializers - - required public init(transitionStyle: TransitionStyle) { - self.transitionStyle = transitionStyle - super.init() - - /** - Prepare haptic feedback, only during the presentation state - */ - if case .presentation = transitionStyle { - feedbackGenerator = UISelectionFeedbackGenerator() - feedbackGenerator?.prepare() - } - } - - /** - Animate presented view controller presentation - */ - private func animatePresentation(transitionContext: UIViewControllerContextTransitioning) { - - guard - let toVC = transitionContext.viewController(forKey: .to), - let fromVC = transitionContext.viewController(forKey: .from) - else { return } - - let presentable = panModalLayoutType(from: transitionContext) - - // Calls viewWillAppear and viewWillDisappear - fromVC.beginAppearanceTransition(false, animated: true) - - // Presents the view in shortForm position, initially - let yPos: CGFloat = presentable?.shortFormYPos ?? 0.0 - - // Use panView as presentingView if it already exists within the containerView - let panView: UIView = transitionContext.containerView.panContainerView ?? toVC.view - - // Move presented view offscreen (from the bottom) - panView.frame = transitionContext.finalFrame(for: toVC) - panView.frame.origin.y = transitionContext.containerView.frame.height - - // Haptic feedback - if presentable?.isHapticFeedbackEnabled == true { - feedbackGenerator?.selectionChanged() - } - - PanModalAnimator.animate({ - panView.frame.origin.y = yPos - }, config: presentable) { [weak self] didComplete in - // Calls viewDidAppear and viewDidDisappear - fromVC.endAppearanceTransition() - transitionContext.completeTransition(didComplete) - self?.feedbackGenerator = nil - } - } - - /** - Animate presented view controller dismissal - */ - private func animateDismissal(transitionContext: UIViewControllerContextTransitioning) { - - guard - let toVC = transitionContext.viewController(forKey: .to), - let fromVC = transitionContext.viewController(forKey: .from) - else { return } - - // Calls viewWillAppear and viewWillDisappear - toVC.beginAppearanceTransition(true, animated: true) - - let presentable = panModalLayoutType(from: transitionContext) - let panView: UIView = transitionContext.containerView.panContainerView ?? fromVC.view - - PanModalAnimator.animate({ - panView.frame.origin.y = transitionContext.containerView.frame.height - }, config: presentable) { didComplete in - fromVC.view.removeFromSuperview() - // Calls viewDidAppear and viewDidDisappear - toVC.endAppearanceTransition() - transitionContext.completeTransition(didComplete) - } - } - - /** - Extracts the PanModal from the transition context, if it exists - */ - private func panModalLayoutType(from context: UIViewControllerContextTransitioning) -> PanModalPresentable.LayoutType? { - switch transitionStyle { - case .presentation: - return context.viewController(forKey: .to) as? PanModalPresentable.LayoutType - case .dismissal: - return context.viewController(forKey: .from) as? PanModalPresentable.LayoutType - } - } - -} - -// MARK: - UIViewControllerAnimatedTransitioning Delegate - -extension PanModalPresentationAnimator: UIViewControllerAnimatedTransitioning { - - /** - Returns the transition duration - */ - public func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval { - - guard - let context = transitionContext, - let presentable = panModalLayoutType(from: context) - else { return PanModalAnimator.Constants.defaultTransitionDuration } - - return presentable.transitionDuration - } - - /** - Performs the appropriate animation based on the transition style - */ - public func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { - switch transitionStyle { - case .presentation: - animatePresentation(transitionContext: transitionContext) - case .dismissal: - animateDismissal(transitionContext: transitionContext) - } - } - -} -#endif diff --git a/TIBottomSheet/Sources/PanModal/Controller/PanModalPresentationController.swift b/TIBottomSheet/Sources/PanModal/Controller/PanModalPresentationController.swift deleted file mode 100644 index bf1dab90..00000000 --- a/TIBottomSheet/Sources/PanModal/Controller/PanModalPresentationController.swift +++ /dev/null @@ -1,881 +0,0 @@ -// -// PanModalPresentationController.swift -// PanModal -// -// Copyright © 2019 Tiny Speck, Inc. All rights reserved. -// - -#if os(iOS) -import TIUIKitCore -import UIKit - -/** - The PanModalPresentationController is the middle layer between the presentingViewController - and the presentedViewController. - - It controls the coordination between the individual transition classes as well as - provides an abstraction over how the presented view is presented & displayed. - - For example, we add a drag indicator view above the presented view and - a background overlay between the presenting & presented view. - - The presented view's layout configuration & presentation is defined using the PanModalPresentable. - - By conforming to the PanModalPresentable protocol & overriding values - the presented view can define its layout configuration & presentation. - */ -open class PanModalPresentationController: UIPresentationController { - - /** - Enum representing the possible presentation states - */ - public enum PresentationState { - case shortForm - case mediumForm - case longForm - } - - /** - Constants - */ - struct Constants { - static let indicatorYOffset = CGFloat(8.0) - static let snapMovementSensitivity = CGFloat(0.7) - static let dragIndicatorSize = CGSize(width: 36.0, height: 5.0) - } - - // MARK: - Properties - - /** - A flag to track if the presented view is animating - */ - private var isPresentedViewAnimating = false - - /** - A flag to determine if scrolling should seamlessly transition - from the pan modal container view to the scroll view - once the scroll limit has been reached. - */ - private var extendsPanScrolling = true - - /** - A flag to determine if scrolling should be limited to the longFormHeight. - Return false to cap scrolling at .max height. - */ - private var anchorModalToLongForm = true - - /** - The y content offset value of the embedded scroll view - */ - private var scrollViewYOffset: CGFloat = 0.0 - - /** - An observer for the scroll view content offset - */ - private var scrollObserver: NSKeyValueObservation? - - // store the y positions so we don't have to keep re-calculating - - /** - The y value for the short form presentation state - */ - private var shortFormYPosition: CGFloat = 0 - - private var mediumFormYPosition: CGFloat = 0 - - /** - The y value for the long form presentation state - */ - private var longFormYPosition: CGFloat = 0 - - private var allowsDragToDismiss: Bool { - presentable?.onDragToDismiss != nil - } - - /** - Determine anchored Y postion based on the `anchorModalToLongForm` flag - */ - private var anchoredYPosition: CGFloat { - let defaultTopOffset = presentable?.topOffset ?? 0 - return anchorModalToLongForm ? longFormYPosition : defaultTopOffset - } - - /** - Configuration object for PanModalPresentationController - */ - private var presentable: PanModalPresentable? { - return presentedViewController as? PanModalPresentable - } - - // MARK: - Views - - /** - Background view used as an overlay over the presenting view - */ - private lazy var backgroundView: DimmedView = { - let view: DimmedView - let type = presentable?.dimmedViewType ?? .opaque - - if let color = presentable?.panModalBackgroundColor { - view = DimmedView(presentingController: presentingViewController, dimColor: color, appearanceType: type) - } else { - view = DimmedView(presentingController: presentingViewController, appearanceType: type) - } - - view.didTap = { [weak self] in - self?.presentable?.onTapToDismiss?() - } - - return view - }() - - /** - A wrapper around the presented view so that we can modify - the presented view apperance without changing - the presented view's properties - */ - private lazy var panContainerView: PanContainerView = { - let frame = containerView?.frame ?? .zero - return PanContainerView(presentedView: presentedViewController.view, frame: frame) - }() - - /** - Override presented view to return the pan container wrapper - */ - public override var presentedView: UIView { - return panContainerView - } - - // MARK: - Gesture Recognizers - - /** - Gesture recognizer to detect & track pan gestures - */ - private lazy var panGestureRecognizer: UIPanGestureRecognizer = { - let gesture = UIPanGestureRecognizer(target: self, action: #selector(didPanOnPresentedView(_ :))) - gesture.minimumNumberOfTouches = 1 - gesture.maximumNumberOfTouches = 1 - gesture.delegate = self - return gesture - }() - - // MARK: - Deinitializers - - deinit { - scrollObserver?.invalidate() - } - - // MARK: - Lifecycle - - override public func containerViewWillLayoutSubviews() { - super.containerViewWillLayoutSubviews() - configureViewLayout() - } - - override public func presentationTransitionWillBegin() { - - guard let containerView = containerView - else { return } - - layoutBackgroundView(in: containerView) - layoutPresentedView(in: containerView) - configureScrollViewInsets() - configureShadowIfNeeded() - - guard let coordinator = presentedViewController.transitionCoordinator else { - backgroundView.dimState = .max - return - } - - coordinator.animate(alongsideTransition: { [weak self] _ in - if let yPos = self?.shortFormYPosition { - self?.adjust(toYPosition: yPos) - } - self?.presentedViewController.setNeedsStatusBarAppearanceUpdate() - }) - } - - override public func presentationTransitionDidEnd(_ completed: Bool) { - if completed { return } - - backgroundView.removeFromSuperview() - } - - override public func dismissalTransitionWillBegin() { - presentable?.panModalWillDismiss() - - guard let coordinator = presentedViewController.transitionCoordinator else { - backgroundView.dimState = .off - return - } - - /** - Drag indicator is drawn outside of view bounds - so hiding it on view dismiss means avoiding visual bugs - */ - coordinator.animate(alongsideTransition: { [weak self] _ in - self?.backgroundView.dimState = .off - self?.presentingViewController.setNeedsStatusBarAppearanceUpdate() - }) - } - - override public func dismissalTransitionDidEnd(_ completed: Bool) { - if !completed { return } - - presentable?.panModalDidDismiss() - } - - /** - Update presented view size in response to size class changes - */ - override public func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { - super.viewWillTransition(to: size, with: coordinator) - - coordinator.animate(alongsideTransition: { [weak self] _ in - guard - let self = self, - let presentable = self.presentable - else { return } - - self.adjustPresentedViewFrame() - if presentable.shouldRoundTopCorners { - self.addRoundedCorners(to: self.presentedView) - } - }) - } - -} - -// MARK: - Public Methods - -public extension PanModalPresentationController { - - /** - Transition the PanModalPresentationController - to the given presentation state - */ - func transition(to state: PresentationState) { - - guard presentable?.shouldTransition(to: state) == true - else { return } - - presentable?.willTransition(to: state) - - switch state { - case .shortForm: - snap(toYPosition: shortFormYPosition) - - case .mediumForm: - snap(toYPosition: mediumFormYPosition) - - case .longForm: - snap(toYPosition: longFormYPosition) - } - } - - /** - Operations on the scroll view, such as content height changes, - or when inserting/deleting rows can cause the pan modal to jump, - caused by the pan modal responding to content offset changes. - - To avoid this, you can call this method to perform scroll view updates, - with scroll observation temporarily disabled. - */ - func performUpdates(_ updates: () -> Void) { - - guard let scrollView = presentable?.panScrollable - else { return } - - // Pause scroll observer - scrollObserver?.invalidate() - scrollObserver = nil - - // Perform updates - updates() - - // Resume scroll observer - trackScrolling(scrollView) - observe(scrollView: scrollView) - } - - /** - Updates the PanModalPresentationController layout - based on values in the PanModalPresentable - - - Note: This should be called whenever any - pan modal presentable value changes after the initial presentation - */ - func setNeedsLayoutUpdate() { - configureViewLayout() - adjustPresentedViewFrame() - observe(scrollView: presentable?.panScrollable) - configureScrollViewInsets() - } - -} - -// MARK: - Presented View Layout Configuration - -private extension PanModalPresentationController { - - /** - Boolean flag to determine if the presented view is anchored - */ - var isPresentedViewAnchored: Bool { - if !isPresentedViewAnimating - && extendsPanScrolling - && presentedView.frame.minY.rounded() <= anchoredYPosition.rounded() { - return true - } - - return false - } - - /** - Adds the presented view to the given container view - & configures the view elements such as drag indicator, rounded corners - based on the pan modal presentable. - */ - func layoutPresentedView(in containerView: UIView) { - - /** - If the presented view controller does not conform to pan modal presentable - don't configure - */ - guard let presentable = presentable - else { return } - - /** - ⚠️ If this class is NOT used in conjunction with the PanModalPresentationAnimator - & PanModalPresentable, the presented view should be added to the container view - in the presentation animator instead of here - */ - containerView.addSubview(presentedView) - containerView.addGestureRecognizer(panGestureRecognizer) - - if presentable.shouldRoundTopCorners { - addRoundedCorners(to: presentedView) - } - - setNeedsLayoutUpdate() - adjustPanContainerBackgroundColor() - } - - /** - Reduce height of presentedView so that it sits at the bottom of the screen - */ - func adjustPresentedViewFrame() { - - guard let frame = containerView?.frame - else { return } - - let adjustedSize = CGSize(width: frame.size.width, height: frame.size.height - anchoredYPosition) - let panFrame = panContainerView.frame - panContainerView.frame.size = frame.size - - if ![shortFormYPosition, mediumFormYPosition, longFormYPosition].contains(panFrame.origin.y) { - // if the container is already in the correct position, no need to adjust positioning - // (rotations & size changes cause positioning to be out of sync) - let yPosition = panFrame.origin.y - panFrame.height + frame.height - presentedView.frame.origin.y = max(yPosition, anchoredYPosition) - } - panContainerView.frame.origin.x = frame.origin.x - presentedViewController.view.frame = CGRect(origin: .zero, size: adjustedSize) - } - - /** - Adds a background color to the pan container view - in order to avoid a gap at the bottom - during initial view presentation in longForm (when view bounces) - */ - func adjustPanContainerBackgroundColor() { - panContainerView.backgroundColor = presentedViewController.view.backgroundColor - ?? presentable?.panScrollable?.backgroundColor - } - - /** - Adds the background view to the view hierarchy - & configures its layout constraints. - */ - func layoutBackgroundView(in containerView: UIView) { - containerView.addSubview(backgroundView) - backgroundView.translatesAutoresizingMaskIntoConstraints = false - backgroundView.topAnchor.constraint(equalTo: containerView.topAnchor).isActive = true - backgroundView.leadingAnchor.constraint(equalTo: containerView.leadingAnchor).isActive = true - backgroundView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor).isActive = true - backgroundView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor).isActive = true - } - - /** - Calculates & stores the layout anchor points & options - */ - func configureViewLayout() { - - guard let layoutPresentable = presentedViewController as? PanModalPresentable.LayoutType - else { return } - - shortFormYPosition = layoutPresentable.shortFormYPos - mediumFormYPosition = layoutPresentable.mediumFormYPos - longFormYPosition = layoutPresentable.longFormYPos - anchorModalToLongForm = layoutPresentable.anchorModalToLongForm - extendsPanScrolling = layoutPresentable.allowsExtendedPanScrolling - - containerView?.isUserInteractionEnabled = layoutPresentable.isUserInteractionEnabled - } - - /** - Configures the scroll view insets - */ - func configureScrollViewInsets() { - - guard - let scrollView = presentable?.panScrollable, - !scrollView.isScrolling - else { return } - - /** - Disable vertical scroll indicator until we start to scroll - to avoid visual bugs - */ - scrollView.showsVerticalScrollIndicator = false - scrollView.scrollIndicatorInsets = presentable?.scrollIndicatorInsets ?? .zero - - /** - Set the appropriate contentInset as the configuration within this class - offsets it - */ - scrollView.contentInset.bottom = presentingViewController.bottomLayoutGuide.length - - /** - As we adjust the bounds during `handleScrollViewTopBounce` - we should assume that contentInsetAdjustmentBehavior will not be correct - */ - if #available(iOS 11.0, *) { - scrollView.contentInsetAdjustmentBehavior = .never - } - } - - func configureShadowIfNeeded() { - let type = presentable?.dimmedViewType ?? .opaque - - if case let .transparentWithShadow(shadow) = type { - containerView?.configureUIView(appearance: UIView.DefaultAppearance(shadow: shadow)) - } - } -} - -// MARK: - Pan Gesture Event Handler - -private extension PanModalPresentationController { - - /** - The designated function for handling pan gesture events - */ - @objc func didPanOnPresentedView(_ recognizer: UIPanGestureRecognizer) { - - guard - shouldRespond(to: recognizer), - let containerView = containerView - else { - recognizer.setTranslation(.zero, in: recognizer.view) - return - } - - switch recognizer.state { - case .began, .changed: - - /** - Respond accordingly to pan gesture translation - */ - respond(to: recognizer) - - /** - If presentedView is translated above the longForm threshold, treat as transition - */ - if presentedView.frame.origin.y == anchoredYPosition && extendsPanScrolling { - presentable?.willTransition(to: .longForm) - } - - default: - - /** - Use velocity sensitivity value to restrict snapping - */ - let velocity = recognizer.velocity(in: presentedView) - - if isVelocityWithinSensitivityRange(velocity.y) { - - /** - If velocity is within the sensitivity range, - transition to a presentation state or dismiss entirely. - - This allows the user to dismiss directly from long form - instead of going to the short form state first. - */ - if velocity.y < 0 { - transition(to: .longForm) - - } else if nearest(to: presentedView.frame.minY, inValues: [mediumFormYPosition, containerView.bounds.height]) == mediumFormYPosition - && presentedView.frame.minY < mediumFormYPosition { - transition(to: .mediumForm) - - } else if (nearest(to: presentedView.frame.minY, inValues: [longFormYPosition, containerView.bounds.height]) == longFormYPosition - && presentedView.frame.minY < shortFormYPosition) || allowsDragToDismiss == false { - transition(to: .shortForm) - - } else { - presentable?.onDragToDismiss?() - } - - } else { - - /** - The `containerView.bounds.height` is used to determine - how close the presented view is to the bottom of the screen - */ - let position = nearest(to: presentedView.frame.minY, inValues: [containerView.bounds.height, shortFormYPosition, mediumFormYPosition, longFormYPosition]) - - if position == longFormYPosition { - transition(to: .longForm) - - } else if position == mediumFormYPosition { - transition(to: .mediumForm) - - } else if position == shortFormYPosition || allowsDragToDismiss == false { - transition(to: .shortForm) - - } else { - presentable?.onDragToDismiss?() - } - } - } - } - - /** - Determine if the pan modal should respond to the gesture recognizer. - - If the pan modal is already being dragged & the delegate returns false, ignore until - the recognizer is back to it's original state (.began) - - ⚠️ This is the only time we should be cancelling the pan modal gesture recognizer - */ - func shouldRespond(to panGestureRecognizer: UIPanGestureRecognizer) -> Bool { - guard - presentable?.shouldRespond(to: panGestureRecognizer) == true || - !(panGestureRecognizer.state == .began || panGestureRecognizer.state == .cancelled) - else { - panGestureRecognizer.isEnabled = false - panGestureRecognizer.isEnabled = true - return false - } - return !shouldFail(panGestureRecognizer: panGestureRecognizer) - } - - /** - Communicate intentions to presentable and adjust subviews in containerView - */ - func respond(to panGestureRecognizer: UIPanGestureRecognizer) { - presentable?.willRespond(to: panGestureRecognizer) - - var yDisplacement = panGestureRecognizer.translation(in: presentedView).y - - /** - If the presentedView is not anchored to long form, reduce the rate of movement - above the threshold - */ - if presentedView.frame.origin.y < longFormYPosition { - yDisplacement /= 2.0 - } - adjust(toYPosition: presentedView.frame.origin.y + yDisplacement) - - panGestureRecognizer.setTranslation(.zero, in: presentedView) - } - - /** - Determines if we should fail the gesture recognizer based on certain conditions - - We fail the presented view's pan gesture recognizer if we are actively scrolling on the scroll view. - This allows the user to drag whole view controller from outside scrollView touch area. - - Unfortunately, cancelling a gestureRecognizer means that we lose the effect of transition scrolling - from one view to another in the same pan gesture so don't cancel - */ - func shouldFail(panGestureRecognizer: UIPanGestureRecognizer) -> Bool { - - /** - Allow api consumers to override the internal conditions & - decide if the pan gesture recognizer should be prioritized. - - ⚠️ This is the only time we should be cancelling the panScrollable recognizer, - for the purpose of ensuring we're no longer tracking the scrollView - */ - guard !shouldPrioritize(panGestureRecognizer: panGestureRecognizer) else { - presentable?.panScrollable?.panGestureRecognizer.isEnabled = false - presentable?.panScrollable?.panGestureRecognizer.isEnabled = true - return false - } - - guard - isPresentedViewAnchored, - let scrollView = presentable?.panScrollable, - scrollView.contentOffset.y > 0 - else { - return false - } - - let loc = panGestureRecognizer.location(in: presentedView) - return (scrollView.frame.contains(loc) || scrollView.isScrolling) - } - - /** - Determine if the presented view's panGestureRecognizer should be prioritized over - embedded scrollView's panGestureRecognizer. - */ - func shouldPrioritize(panGestureRecognizer: UIPanGestureRecognizer) -> Bool { - return panGestureRecognizer.state == .began && - presentable?.shouldPrioritize(panModalGestureRecognizer: panGestureRecognizer) == true - } - - /** - Check if the given velocity is within the sensitivity range - */ - func isVelocityWithinSensitivityRange(_ velocity: CGFloat) -> Bool { - return (abs(velocity) - (1000 * (1 - Constants.snapMovementSensitivity))) > 0 - } - - func snap(toYPosition yPos: CGFloat) { - PanModalAnimator.animate({ [weak self] in - self?.adjust(toYPosition: yPos) - self?.isPresentedViewAnimating = true - }, config: presentable) { [weak self] didComplete in - self?.isPresentedViewAnimating = !didComplete - } - } - - /** - Sets the y position of the presentedView & adjusts the backgroundView. - */ - func adjust(toYPosition yPos: CGFloat) { - presentedView.frame.origin.y = max(yPos, anchoredYPosition) - - let maxHeight = UIScreen.main.bounds.height - longFormYPosition - - backgroundView.dimState = .percent(1 - presentedView.frame.origin.y / maxHeight) - } - - /** - Finds the nearest value to a given number out of a given array of float values - - - Parameters: - - number: reference float we are trying to find the closest value to - - values: array of floats we would like to compare against - */ - func nearest(to number: CGFloat, inValues values: [CGFloat]) -> CGFloat { - guard let nearestVal = values.min(by: { abs(number - $0) < abs(number - $1) }) - else { return number } - return nearestVal - } -} - -// MARK: - UIScrollView Observer - -private extension PanModalPresentationController { - - /** - Creates & stores an observer on the given scroll view's content offset. - This allows us to track scrolling without overriding the scrollView delegate - */ - func observe(scrollView: UIScrollView?) { - scrollObserver?.invalidate() - scrollObserver = scrollView?.observe(\.contentOffset, options: .old) { [weak self] scrollView, change in - - /** - Incase we have a situation where we have two containerViews in the same presentation - */ - guard self?.containerView != nil - else { return } - - self?.didPanOnScrollView(scrollView, change: change) - } - } - - /** - Scroll view content offset change event handler - - Also when scrollView is scrolled to the top, we disable the scroll indicator - otherwise glitchy behaviour occurs - - This is also shown in Apple Maps (reverse engineering) - which allows us to seamlessly transition scrolling from the panContainerView to the scrollView - */ - func didPanOnScrollView(_ scrollView: UIScrollView, change: NSKeyValueObservedChange) { - - guard - !presentedViewController.isBeingDismissed, - !presentedViewController.isBeingPresented - else { return } - - if !isPresentedViewAnchored && scrollView.contentOffset.y > 0 { - - /** - Hold the scrollView in place if we're actively scrolling and not handling top bounce - */ - haltScrolling(scrollView) - - } else if scrollView.isScrolling || isPresentedViewAnimating { - - if isPresentedViewAnchored { - /** - While we're scrolling upwards on the scrollView, - store the last content offset position - */ - trackScrolling(scrollView) - } else { - /** - Keep scroll view in place while we're panning on main view - */ - haltScrolling(scrollView) - } - - } else if presentedViewController.view.isKind(of: UIScrollView.self) - && !isPresentedViewAnimating && scrollView.contentOffset.y <= 0 { - - /** - In the case where we drag down quickly on the scroll view and let go, - `handleScrollViewTopBounce` adds a nice elegant touch. - */ - handleScrollViewTopBounce(scrollView: scrollView, change: change) - } else { - trackScrolling(scrollView) - } - } - - /** - Halts the scroll of a given scroll view & anchors it at the `scrollViewYOffset` - */ - func haltScrolling(_ scrollView: UIScrollView) { - scrollView.setContentOffset(CGPoint(x: 0, y: scrollViewYOffset), animated: false) - scrollView.showsVerticalScrollIndicator = false - } - - /** - As the user scrolls, track & save the scroll view y offset. - This helps halt scrolling when we want to hold the scroll view in place. - */ - func trackScrolling(_ scrollView: UIScrollView) { - scrollViewYOffset = max(scrollView.contentOffset.y, 0) - scrollView.showsVerticalScrollIndicator = true - } - - /** - To ensure that the scroll transition between the scrollView & the modal - is completely seamless, we need to handle the case where content offset is negative. - - In this case, we follow the curve of the decelerating scroll view. - This gives the effect that the modal view and the scroll view are one view entirely. - - - Note: This works best where the view behind view controller is a UIScrollView. - So, for example, a UITableViewController. - */ - func handleScrollViewTopBounce(scrollView: UIScrollView, change: NSKeyValueObservedChange) { - - guard let oldYValue = change.oldValue?.y, scrollView.isDecelerating - else { return } - - let yOffset = scrollView.contentOffset.y - let presentedSize = containerView?.frame.size ?? .zero - - /** - Decrease the view bounds by the y offset so the scroll view stays in place - and we can still get updates on its content offset - */ - presentedView.bounds.size = CGSize(width: presentedSize.width, height: presentedSize.height + yOffset) - - if oldYValue > yOffset { - /** - Move the view in the opposite direction to the decreasing bounds - until half way through the deceleration so that it appears - as if we're transferring the scrollView drag momentum to the entire view - */ - presentedView.frame.origin.y = longFormYPosition - yOffset - } else { - scrollViewYOffset = 0 - snap(toYPosition: longFormYPosition) - } - - scrollView.showsVerticalScrollIndicator = false - } -} - -// MARK: - UIGestureRecognizerDelegate - -extension PanModalPresentationController: UIGestureRecognizerDelegate { - - /** - Do not require any other gesture recognizers to fail - */ - public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool { - return false - } - - /** - Allow simultaneous gesture recognizers only when the other gesture recognizer's view - is the pan scrollable view - */ - public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { - return otherGestureRecognizer.view == presentable?.panScrollable - } -} - -// MARK: - UIBezierPath - -private extension PanModalPresentationController { - - /** - Draws top rounded corners on a given view - We have to set a custom path for corner rounding - because we render the dragIndicator outside of view bounds - */ - func addRoundedCorners(to view: UIView) { - let radius = presentable?.cornerRadius ?? 0 - let path = UIBezierPath(roundedRect: view.bounds, - byRoundingCorners: [.topLeft, .topRight], - cornerRadii: CGSize(width: radius, height: radius)) - - // Set path as a mask to display optional drag indicator view & rounded corners - let mask = CAShapeLayer() - mask.path = path.cgPath - view.layer.mask = mask - - // Improve performance by rasterizing the layer - view.layer.shouldRasterize = true - view.layer.rasterizationScale = UIScreen.main.scale - } - - /** - Draws a path around the drag indicator view - */ - func drawAroundDragIndicator(currentPath path: UIBezierPath, indicatorLeftEdgeXPos: CGFloat) { - - let totalIndicatorOffset = Constants.indicatorYOffset + Constants.dragIndicatorSize.height - - // Draw around drag indicator starting from the left - path.addLine(to: CGPoint(x: indicatorLeftEdgeXPos, y: path.currentPoint.y)) - path.addLine(to: CGPoint(x: path.currentPoint.x, y: path.currentPoint.y - totalIndicatorOffset)) - path.addLine(to: CGPoint(x: path.currentPoint.x + Constants.dragIndicatorSize.width, y: path.currentPoint.y)) - path.addLine(to: CGPoint(x: path.currentPoint.x, y: path.currentPoint.y + totalIndicatorOffset)) - } -} - -// MARK: - Helper Extensions - -private extension UIScrollView { - - /** - A flag to determine if a scroll view is scrolling - */ - var isScrolling: Bool { - return isDragging && !isDecelerating || isTracking - } -} -#endif diff --git a/TIBottomSheet/Sources/PanModal/Delegate/PanModalPresentationDelegate.swift b/TIBottomSheet/Sources/PanModal/Delegate/PanModalPresentationDelegate.swift deleted file mode 100644 index 24264b74..00000000 --- a/TIBottomSheet/Sources/PanModal/Delegate/PanModalPresentationDelegate.swift +++ /dev/null @@ -1,81 +0,0 @@ -// -// PanModalPresentationDelegate.swift -// PanModal -// -// Copyright © 2019 Tiny Speck, Inc. All rights reserved. -// - -#if os(iOS) -import UIKit - -/** - The PanModalPresentationDelegate conforms to the various transition delegates - and vends the appropriate object for each transition controller requested. - - Usage: - ``` - viewController.modalPresentationStyle = .custom - viewController.transitioningDelegate = PanModalPresentationDelegate.default - ``` - */ -public class PanModalPresentationDelegate: NSObject { - - /** - Returns an instance of the delegate, retained for the duration of presentation - */ - public static var `default`: PanModalPresentationDelegate = { - return PanModalPresentationDelegate() - }() - -} - -extension PanModalPresentationDelegate: UIViewControllerTransitioningDelegate { - - /** - Returns a modal presentation animator configured for the presenting state - */ - public func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? { - return PanModalPresentationAnimator(transitionStyle: .presentation) - } - - /** - Returns a modal presentation animator configured for the dismissing state - */ - public func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { - return PanModalPresentationAnimator(transitionStyle: .dismissal) - } - - /** - Returns a modal presentation controller to coordinate the transition from the presenting - view controller to the presented view controller. - - Changes in size class during presentation are handled via the adaptive presentation delegate - */ - public func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? { - let controller = PanModalPresentationController(presentedViewController: presented, presenting: presenting) - controller.delegate = self - return controller - } - -} - -extension PanModalPresentationDelegate: UIAdaptivePresentationControllerDelegate, UIPopoverPresentationControllerDelegate { - - /** - - Note: We do not adapt to size classes due to the introduction of the UIPresentationController - & deprecation of UIPopoverController (iOS 9), there is no way to have more than one - presentation controller in use during the same presentation - - This is essential when transitioning from .popover to .custom on iPad split view... unless a custom popover view is also implemented - (popover uses UIPopoverPresentationController & we use PanModalPresentationController) - */ - - /** - Dismisses the presented view controller - */ - public func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle { - return .none - } - -} -#endif diff --git a/TIBottomSheet/Sources/PanModal/LICENSE b/TIBottomSheet/Sources/PanModal/LICENSE deleted file mode 100644 index 02bc46f1..00000000 --- a/TIBottomSheet/Sources/PanModal/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright © 2018 Tiny Speck, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/TIBottomSheet/Sources/PanModal/PanModal.h b/TIBottomSheet/Sources/PanModal/PanModal.h deleted file mode 100644 index 01451f52..00000000 --- a/TIBottomSheet/Sources/PanModal/PanModal.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// PanModal.h -// PanModal -// -// Created by Tosin A on 3/13/19. -// Copyright © 2019 Detail. All rights reserved. -// - -#import - -//! Project version number for PanModal. -FOUNDATION_EXPORT double PanModalVersionNumber; - -//! Project version string for PanModal. -FOUNDATION_EXPORT const unsigned char PanModalVersionString[]; - -// In this header, you should import all the public headers of your framework using statements like #import - - diff --git a/TIBottomSheet/Sources/PanModal/Presentable/PanModalHeight.swift b/TIBottomSheet/Sources/PanModal/Presentable/PanModalHeight.swift deleted file mode 100644 index 00654f4e..00000000 --- a/TIBottomSheet/Sources/PanModal/Presentable/PanModalHeight.swift +++ /dev/null @@ -1,44 +0,0 @@ -// -// PanModalHeight.swift -// PanModal -// -// Copyright © 2019 Tiny Speck, Inc. All rights reserved. -// - -#if os(iOS) -import UIKit - -/** - An enum that defines the possible states of the height of a pan modal container view - for a given presentation state (shortForm, longForm) - */ -public enum PanModalHeight: Equatable { - - /** - Sets the height to be the maximum height (+ topOffset) - */ - case maxHeight - - /** - Sets the height to be the max height with a specified top inset. - - Note: A value of 0 is equivalent to .maxHeight - */ - case maxHeightWithTopInset(CGFloat) - - /** - Sets the height to be the specified content height - */ - case contentHeight(CGFloat) - - /** - Sets the height to be the specified content height - & also ignores the bottomSafeAreaInset - */ - case contentHeightIgnoringSafeArea(CGFloat) - - /** - Sets the height to be the intrinsic content height - */ - case intrinsicHeight -} -#endif diff --git a/TIBottomSheet/Sources/PanModal/Presentable/PanModalPresentable+Defaults.swift b/TIBottomSheet/Sources/PanModal/Presentable/PanModalPresentable+Defaults.swift deleted file mode 100644 index d6c7dcd4..00000000 --- a/TIBottomSheet/Sources/PanModal/Presentable/PanModalPresentable+Defaults.swift +++ /dev/null @@ -1,145 +0,0 @@ -// -// PanModalPresentable+Defaults.swift -// PanModal -// -// Copyright © 2018 Tiny Speck, Inc. All rights reserved. -// - -#if os(iOS) -import TISwiftUtils -import UIKit - -/** - Default values for the PanModalPresentable. - */ -public extension PanModalPresentable where Self: UIViewController { - - var onTapToDismiss: VoidClosure? { - { [weak self] in - self?.dismiss(animated: true) - } - } - - var onDragToDismiss: VoidClosure? { - { [weak self] in - self?.dismiss(animated: true) - } - } - - var topOffset: CGFloat { - topLayoutOffset - } - - var shortFormHeight: PanModalHeight { - return longFormHeight - } - - var mediumFormHeight: PanModalHeight { - longFormHeight - } - - var longFormHeight: PanModalHeight { - - guard let scrollView = panScrollable - else { return .maxHeight } - - // called once during presentation and stored - scrollView.layoutIfNeeded() - return .contentHeight(scrollView.contentSize.height) - } - - var dimmedViewType: DimmedView.AppearanceType { - .opaque - } - - var presentationDetents: [ModalViewPresentationDetent] { - [] - } - - var cornerRadius: CGFloat { - return 8.0 - } - - var springDamping: CGFloat { - return 0.8 - } - - var transitionDuration: Double { - return PanModalAnimator.Constants.defaultTransitionDuration - } - - var transitionAnimationOptions: UIView.AnimationOptions { - return [.curveEaseInOut, .allowUserInteraction, .beginFromCurrentState] - } - - var panModalBackgroundColor: UIColor { - return UIColor.black.withAlphaComponent(0.7) - } - - var scrollIndicatorInsets: UIEdgeInsets { - let top = shouldRoundTopCorners ? cornerRadius : 0 - return UIEdgeInsets(top: CGFloat(top), left: 0, bottom: bottomLayoutOffset, right: 0) - } - - var anchorModalToLongForm: Bool { - return true - } - - var allowsExtendedPanScrolling: Bool { - - guard let scrollView = panScrollable - else { return false } - - scrollView.layoutIfNeeded() - return scrollView.contentSize.height > (scrollView.frame.height - bottomLayoutOffset) - } - - var allowsDragToDismiss: Bool { - return true - } - - var allowsTapToDismiss: Bool { - return true - } - - var isUserInteractionEnabled: Bool { - return true - } - - var isHapticFeedbackEnabled: Bool { - return true - } - - var shouldRoundTopCorners: Bool { - return isPanModalPresented - } - - func shouldRespond(to panModalGestureRecognizer: UIPanGestureRecognizer) -> Bool { - return true - } - - func willRespond(to panModalGestureRecognizer: UIPanGestureRecognizer) { - - } - - func shouldTransition(to state: PanModalPresentationController.PresentationState) -> Bool { - return true - } - - func shouldPrioritize(panModalGestureRecognizer: UIPanGestureRecognizer) -> Bool { - return false - } - - func willTransition(to state: PanModalPresentationController.PresentationState) { - - } - - func panModalWillDismiss() { - - } - - func panModalDidDismiss() { - - } -} -#endif diff --git a/TIBottomSheet/Sources/PanModal/Presentable/PanModalPresentable+LayoutHelpers.swift b/TIBottomSheet/Sources/PanModal/Presentable/PanModalPresentable+LayoutHelpers.swift deleted file mode 100644 index 0e93abe6..00000000 --- a/TIBottomSheet/Sources/PanModal/Presentable/PanModalPresentable+LayoutHelpers.swift +++ /dev/null @@ -1,126 +0,0 @@ -// -// PanModalPresentable+LayoutHelpers.swift -// PanModal -// -// Copyright © 2018 Tiny Speck, Inc. All rights reserved. -// - -#if os(iOS) -import UIKit - -/** - ⚠️ [Internal Only] ⚠️ - Helper extensions that handle layout in the PanModalPresentationController - */ -extension PanModalPresentable where Self: UIViewController { - - /** - Cast the presentation controller to PanModalPresentationController - so we can access PanModalPresentationController properties and methods - */ - var presentedVC: PanModalPresentationController? { - return presentationController as? PanModalPresentationController - } - - /** - Length of the top layout guide of the presenting view controller. - Gives us the safe area inset from the top. - */ - var topLayoutOffset: CGFloat { - - guard let rootVC = rootViewController - else { return 0} - - if #available(iOS 11.0, *) { return rootVC.view.safeAreaInsets.top } else { return rootVC.topLayoutGuide.length } - } - - /** - Length of the bottom layout guide of the presenting view controller. - Gives us the safe area inset from the bottom. - */ - var bottomLayoutOffset: CGFloat { - - guard let rootVC = rootViewController - else { return 0} - - if #available(iOS 11.0, *) { return rootVC.view.safeAreaInsets.bottom } else { return rootVC.bottomLayoutGuide.length } - } - - /** - Returns the short form Y position - - - Note: If voiceover is on, the `longFormYPos` is returned. - We do not support short form when voiceover is on as it would make it difficult for user to navigate. - */ - var shortFormYPos: CGFloat { - - guard !UIAccessibility.isVoiceOverRunning - else { return longFormYPos } - - let shortFormYPos = topMargin(from: shortFormHeight) + topOffset - - // shortForm shouldn't exceed longForm - return max(shortFormYPos, longFormYPos) - } - - var mediumFormYPos: CGFloat { - let mediumFormYPos = topMargin(from: mediumFormHeight) - - return max(mediumFormYPos, longFormYPos) - } - - /** - Returns the long form Y position - - - Note: We cap this value to the max possible height - to ensure content is not rendered outside of the view bounds - */ - var longFormYPos: CGFloat { - return max(topMargin(from: longFormHeight), topMargin(from: .maxHeight)) + topOffset - } - - /** - Use the container view for relative positioning as this view's frame - is adjusted in PanModalPresentationController - */ - var bottomYPos: CGFloat { - - guard let container = presentedVC?.containerView - else { return view.bounds.height } - - return container.bounds.size.height - topOffset - } - - /** - Converts a given pan modal height value into a y position value - calculated from top of view - */ - func topMargin(from: PanModalHeight) -> CGFloat { - switch from { - case .maxHeight: - return 0.0 - case .maxHeightWithTopInset(let inset): - return inset - case .contentHeight(let height): - return bottomYPos - (height + bottomLayoutOffset) - case .contentHeightIgnoringSafeArea(let height): - return bottomYPos - height - case .intrinsicHeight: - view.layoutIfNeeded() - let targetSize = CGSize(width: (presentedVC?.containerView?.bounds ?? UIScreen.main.bounds).width, - height: UIView.layoutFittingCompressedSize.height) - let intrinsicHeight = view.systemLayoutSizeFitting(targetSize).height - return bottomYPos - (intrinsicHeight + bottomLayoutOffset) - } - } - - private var rootViewController: UIViewController? { - - guard let application = UIApplication.value(forKeyPath: #keyPath(UIApplication.shared)) as? UIApplication - else { return nil } - - return application.keyWindow?.rootViewController - } - -} -#endif diff --git a/TIBottomSheet/Sources/PanModal/Presentable/PanModalPresentable+UIViewController.swift b/TIBottomSheet/Sources/PanModal/Presentable/PanModalPresentable+UIViewController.swift deleted file mode 100644 index 8de82fd5..00000000 --- a/TIBottomSheet/Sources/PanModal/Presentable/PanModalPresentable+UIViewController.swift +++ /dev/null @@ -1,63 +0,0 @@ -// -// PanModalPresentable+UIViewController.swift -// PanModal -// -// Copyright © 2018 Tiny Speck, Inc. All rights reserved. -// - -#if os(iOS) -import UIKit - -/** - Extends PanModalPresentable with helper methods - when the conforming object is a UIViewController - */ -public extension PanModalPresentable where Self: UIViewController { - - typealias AnimationBlockType = () -> Void - typealias AnimationCompletionType = (Bool) -> Void - - /** - For Presentation, the object must be a UIViewController & confrom to the PanModalPresentable protocol. - */ - typealias LayoutType = UIViewController & PanModalPresentable - - /** - A function wrapper over the `transition(to state: PanModalPresentationController.PresentationState)` - function in the PanModalPresentationController. - */ - func panModalTransition(to state: PanModalPresentationController.PresentationState) { - presentedVC?.transition(to: state) - } - - /** - A function wrapper over the `setNeedsLayoutUpdate()` - function in the PanModalPresentationController. - - - Note: This should be called whenever any of the values for the PanModalPresentable protocol are changed. - */ - func panModalSetNeedsLayoutUpdate() { - presentedVC?.setNeedsLayoutUpdate() - } - - /** - Operations on the scroll view, such as content height changes, or when inserting/deleting rows can cause the pan modal to jump, - caused by the pan modal responding to content offset changes. - - To avoid this, you can call this method to perform scroll view updates, with scroll observation temporarily disabled. - */ - func panModalPerformUpdates(_ updates: () -> Void) { - presentedVC?.performUpdates(updates) - } - - /** - A function wrapper over the animate function in PanModalAnimator. - - This can be used for animation consistency on views within the presented view controller. - */ - func panModalAnimate(_ animationBlock: @escaping AnimationBlockType, _ completion: AnimationCompletionType? = nil) { - PanModalAnimator.animate(animationBlock, config: self, completion) - } - -} -#endif diff --git a/TIBottomSheet/Sources/PanModal/Presentable/PanModalPresentable.swift b/TIBottomSheet/Sources/PanModal/Presentable/PanModalPresentable.swift deleted file mode 100644 index aa008aed..00000000 --- a/TIBottomSheet/Sources/PanModal/Presentable/PanModalPresentable.swift +++ /dev/null @@ -1,231 +0,0 @@ -// -// PanModalPresentable.swift -// PanModal -// -// Copyright © 2017 Tiny Speck, Inc. All rights reserved. -// - -#if os(iOS) -import TISwiftUtils -import UIKit - -/** - This is the configuration object for a view controller - that will be presented using the PanModal transition. - - Usage: - ``` - extension YourViewController: PanModalPresentable { - func shouldRoundTopCorners: Bool { return false } - } - ``` - */ -public protocol PanModalPresentable: AnyObject { - - /** - The scroll view embedded in the view controller. - Setting this value allows for seamless transition scrolling between the embedded scroll view - and the pan modal container view. - */ - var panScrollable: UIScrollView? { get } - - /** - The offset between the top of the screen and the top of the pan modal container view. - - Default value is the topLayoutGuide.length + 21.0. - */ - var topOffset: CGFloat { get } - - /** - The height of the pan modal container view - when in the shortForm presentation state. - - This value is capped to .max, if provided value exceeds the space available. - - Default value is the longFormHeight. - */ - var shortFormHeight: PanModalHeight { get } - - var mediumFormHeight: PanModalHeight { get } - - /** - The height of the pan modal container view - when in the longForm presentation state. - - This value is capped to .max, if provided value exceeds the space available. - - Default value is .max. - */ - var longFormHeight: PanModalHeight { get } - - var presentationDetents: [ModalViewPresentationDetent] { get } - - var dimmedViewType: DimmedView.AppearanceType { get } - /** - The corner radius used when `shouldRoundTopCorners` is enabled. - - Default Value is 8.0. - */ - var cornerRadius: CGFloat { get } - - /** - The springDamping value used to determine the amount of 'bounce' - seen when transitioning to short/long form. - - Default Value is 0.8. - */ - var springDamping: CGFloat { get } - - /** - The transitionDuration value is used to set the speed of animation during a transition, - including initial presentation. - - Default value is 0.5. - */ - var transitionDuration: Double { get } - - /** - The animation options used when performing animations on the PanModal, utilized mostly - during a transition. - - Default value is [.curveEaseInOut, .allowUserInteraction, .beginFromCurrentState]. - */ - var transitionAnimationOptions: UIView.AnimationOptions { get } - - /** - The background view color. - - - Note: This is only utilized at the very start of the transition. - - Default Value is black with alpha component 0.7. - */ - var panModalBackgroundColor: UIColor { get } - - /** - We configure the panScrollable's scrollIndicatorInsets interally so override this value - to set custom insets. - - - Note: Use `panModalSetNeedsLayoutUpdate()` when updating insets. - */ - var scrollIndicatorInsets: UIEdgeInsets { get } - - /** - A flag to determine if scrolling should be limited to the longFormHeight. - Return false to cap scrolling at .max height. - - Default value is true. - */ - var anchorModalToLongForm: Bool { get } - - /** - A flag to determine if scrolling should seamlessly transition from the pan modal container view to - the embedded scroll view once the scroll limit has been reached. - - Default value is false. Unless a scrollView is provided and the content height exceeds the longForm height. - */ - var allowsExtendedPanScrolling: Bool { get } - - /** - A flag to determine if dismissal should be initiated when swiping down on the presented view. - - Return false to fallback to the short form state instead of dismissing. - - Default value is true. - */ - var allowsDragToDismiss: Bool { get } - var onTapToDismiss: VoidClosure? { get } - var onDragToDismiss: VoidClosure? { get } - - /** - A flag to determine if dismissal should be initiated when tapping on the dimmed background view. - - Default value is true. - */ - var allowsTapToDismiss: Bool { get } - - /** - A flag to toggle user interactions on the container view. - - - Note: Return false to forward touches to the presentingViewController. - - Default is true. - */ - var isUserInteractionEnabled: Bool { get } - - /** - A flag to determine if haptic feedback should be enabled during presentation. - - Default value is true. - */ - var isHapticFeedbackEnabled: Bool { get } - - /** - A flag to determine if the top corners should be rounded. - - Default value is true. - */ - var shouldRoundTopCorners: Bool { get } - - - /** - Asks the delegate if the pan modal should respond to the pan modal gesture recognizer. - - Return false to disable movement on the pan modal but maintain gestures on the presented view. - - Default value is true. - */ - func shouldRespond(to panModalGestureRecognizer: UIPanGestureRecognizer) -> Bool - - /** - Notifies the delegate when the pan modal gesture recognizer state is either - `began` or `changed`. This method gives the delegate a chance to prepare - for the gesture recognizer state change. - - For example, when the pan modal view is about to scroll. - - Default value is an empty implementation. - */ - func willRespond(to panModalGestureRecognizer: UIPanGestureRecognizer) - - /** - Asks the delegate if the pan modal gesture recognizer should be prioritized. - - For example, you can use this to define a region - where you would like to restrict where the pan gesture can start. - - If false, then we rely solely on the internal conditions of when a pan gesture - should succeed or fail, such as, if we're actively scrolling on the scrollView. - - Default return value is false. - */ - func shouldPrioritize(panModalGestureRecognizer: UIPanGestureRecognizer) -> Bool - - /** - Asks the delegate if the pan modal should transition to a new state. - - Default value is true. - */ - func shouldTransition(to state: PanModalPresentationController.PresentationState) -> Bool - - /** - Notifies the delegate that the pan modal is about to transition to a new state. - - Default value is an empty implementation. - */ - func willTransition(to state: PanModalPresentationController.PresentationState) - - /** - Notifies the delegate that the pan modal is about to be dismissed. - - Default value is an empty implementation. - */ - func panModalWillDismiss() - - /** - Notifies the delegate after the pan modal is dismissed. - - Default value is an empty implementation. - */ - func panModalDidDismiss() -} -#endif diff --git a/TIBottomSheet/Sources/PanModal/Presenter/PanModalPresenter.swift b/TIBottomSheet/Sources/PanModal/Presenter/PanModalPresenter.swift deleted file mode 100644 index 8763fdac..00000000 --- a/TIBottomSheet/Sources/PanModal/Presenter/PanModalPresenter.swift +++ /dev/null @@ -1,38 +0,0 @@ -// -// PanModalPresenter.swift -// PanModal -// -// Copyright © 2019 Tiny Speck, Inc. All rights reserved. -// - -#if os(iOS) -import UIKit - -/** - A protocol for objects that will present a view controller as a PanModal - - - Usage: - ``` - viewController.presentPanModal(viewControllerToPresent: presentingVC, - sourceView: presentingVC.view, - sourceRect: .zero) - ``` - */ -protocol PanModalPresenter: AnyObject { - - /** - A flag that returns true if the current presented view controller - is using the PanModalPresentationDelegate - */ - var isPanModalPresented: Bool { get } - - /** - Presents a view controller that conforms to the PanModalPresentable protocol - */ - func presentPanModal(_ viewControllerToPresent: PanModalPresentable.LayoutType, - sourceView: UIView?, - sourceRect: CGRect, - completion: (() -> Void)?) - -} -#endif diff --git a/TIBottomSheet/Sources/PanModal/Presenter/UIViewController+PanModalPresenter.swift b/TIBottomSheet/Sources/PanModal/Presenter/UIViewController+PanModalPresenter.swift deleted file mode 100644 index b252d8f7..00000000 --- a/TIBottomSheet/Sources/PanModal/Presenter/UIViewController+PanModalPresenter.swift +++ /dev/null @@ -1,66 +0,0 @@ -// -// UIViewController+PanModalPresenterProtocol.swift -// PanModal -// -// Copyright © 2019 Tiny Speck, Inc. All rights reserved. -// - -#if os(iOS) -import UIKit - -/** - Extends the UIViewController to conform to the PanModalPresenter protocol - */ -extension UIViewController: PanModalPresenter { - - /** - A flag that returns true if the topmost view controller in the navigation stack - was presented using the custom PanModal transition - - - Warning: ⚠️ Calling `presentationController` in this function may cause a memory leak. ⚠️ - - In most cases, this check will be used early in the view lifecycle and unfortunately, - there's an Apple bug that causes multiple presentationControllers to be created if - the presentationController is referenced here and called too early resulting in - a strong reference to this view controller and in turn, creating a memory leak. - */ - public var isPanModalPresented: Bool { - return (transitioningDelegate as? PanModalPresentationDelegate) != nil - } - - /** - Configures a view controller for presentation using the PanModal transition - - - Parameters: - - viewControllerToPresent: The view controller to be presented - - sourceView: The view containing the anchor rectangle for the popover. - - sourceRect: The rectangle in the specified view in which to anchor the popover. - - completion: The block to execute after the presentation finishes. You may specify nil for this parameter. - - - Note: sourceView & sourceRect are only required for presentation on an iPad. - */ - public func presentPanModal(_ viewControllerToPresent: PanModalPresentable.LayoutType, - sourceView: UIView? = nil, - sourceRect: CGRect = .zero, - completion: (() -> Void)? = nil) { - - /** - Here, we deliberately do not check for size classes. More info in `PanModalPresentationDelegate` - */ - - if UIDevice.current.userInterfaceIdiom == .pad { - viewControllerToPresent.modalPresentationStyle = .popover - viewControllerToPresent.popoverPresentationController?.sourceRect = sourceRect - viewControllerToPresent.popoverPresentationController?.sourceView = sourceView ?? view - viewControllerToPresent.popoverPresentationController?.delegate = PanModalPresentationDelegate.default - } else { - viewControllerToPresent.modalPresentationStyle = .custom - viewControllerToPresent.modalPresentationCapturesStatusBarAppearance = true - viewControllerToPresent.transitioningDelegate = PanModalPresentationDelegate.default - } - - present(viewControllerToPresent, animated: true, completion: completion) - } - -} -#endif diff --git a/TIBottomSheet/Sources/PanModal/View/DimmedView.swift b/TIBottomSheet/Sources/PanModal/View/DimmedView.swift deleted file mode 100644 index 8ca838d2..00000000 --- a/TIBottomSheet/Sources/PanModal/View/DimmedView.swift +++ /dev/null @@ -1,131 +0,0 @@ -// -// DimmedView.swift -// PanModal -// -// Copyright © 2017 Tiny Speck, Inc. All rights reserved. -// - -#if os(iOS) -import TISwiftUtils -import TIUIKitCore -import TIUIElements -import UIKit - -/** - A dim view for use as an overlay over content you want dimmed. - */ -public class DimmedView: BaseInitializableView { - - public enum AppearanceType { - - case transparent - case transparentWithShadow(UIViewShadow) - case opaque - - var isTransparent: Bool { - switch self { - case .transparent, .transparentWithShadow: - return true - - default: - return false - } - } - } - - /** - Represents the possible states of the dimmed view. - max, off or a percentage of dimAlpha. - */ - enum DimState { - case max - case off - case percent(CGFloat) - } - - // MARK: - Properties - - /** - The state of the dimmed view - */ - var dimState: DimState = .off { - didSet { - guard !appearanceType.isTransparent else { - alpha = .zero - return - } - - switch dimState { - case .max: - alpha = 1.0 - case .off: - alpha = 0.0 - case .percent(let percentage): - alpha = max(0.0, min(1.0, percentage)) - } - } - } - - weak var presentingController: UIViewController? - var appearanceType: AppearanceType - - /** - The closure to be executed when a tap occurs - */ - var didTap: VoidClosure? - - // MARK: - Initializers - - init(presentingController: UIViewController? = nil, - dimColor: UIColor = UIColor.black.withAlphaComponent(0.7), - appearanceType: AppearanceType) { - - self.presentingController = presentingController - self.appearanceType = appearanceType - - super.init(frame: .zero) - - alpha = 0.0 - backgroundColor = dimColor - } - - required public init?(coder aDecoder: NSCoder) { - fatalError() - } - - // MARK: - BaseInitializableView - - public override func bindViews() { - super.bindViews() - - let tapGesture = UITapGestureRecognizer(target: self, action: #selector(didTapView)) - addGestureRecognizer(tapGesture) - } - - // MARK: - Overrides - - public override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { - if appearanceType.isTransparent { - let subviews = presentingController?.view.subviews.reversed() ?? [] - - for subview in subviews { - if let hittedView = subview.hitTest(point, with: event) { - return hittedView - } - } - } - - return super.hitTest(point, with: event) - } - - public override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { - !appearanceType.isTransparent - } - - // MARK: - Event Handlers - - @objc private func didTapView() { - didTap?() - } -} -#endif diff --git a/TIBottomSheet/Sources/PanModal/View/PanContainerView.swift b/TIBottomSheet/Sources/PanModal/View/PanContainerView.swift deleted file mode 100644 index f5c2892b..00000000 --- a/TIBottomSheet/Sources/PanModal/View/PanContainerView.swift +++ /dev/null @@ -1,44 +0,0 @@ -// -// PanContainerView.swift -// PanModal -// -// Copyright © 2018 Tiny Speck, Inc. All rights reserved. -// - -#if os(iOS) -import UIKit - -/** - A view wrapper around the presented view in a PanModal transition. - - This allows us to make modifications to the presented view without - having to do those changes directly on the view - */ -class PanContainerView: UIView { - - init(presentedView: UIView, frame: CGRect) { - super.init(frame: frame) - addSubview(presentedView) - } - - @available(*, unavailable) - required init?(coder aDecoder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - -} - -extension UIView { - - /** - Convenience property for retrieving a PanContainerView instance - from the view hierachy - */ - var panContainerView: PanContainerView? { - return subviews.first(where: { view -> Bool in - view is PanContainerView - }) as? PanContainerView - } - -} -#endif diff --git a/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/Podfile b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/Podfile index e44c2e85..beb2a489 100644 --- a/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/Podfile +++ b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/Podfile @@ -1,5 +1,7 @@ ENV["DEVELOPMENT_INSTALL"] = "true" +source 'https://git.svc.touchin.ru/TouchInstinct/Podspecs.git' + target 'TIBottomSheet' do platform :ios, 11 use_frameworks! diff --git a/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/Pages/TIBottomSheet.xcplaygroundpage/Contents.swift b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/Pages/TIBottomSheet.xcplaygroundpage/Contents.swift index 05a69f72..3892076c 100644 --- a/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/Pages/TIBottomSheet.xcplaygroundpage/Contents.swift +++ b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/Pages/TIBottomSheet.xcplaygroundpage/Contents.swift @@ -82,19 +82,19 @@ class DetentsViewController: BaseModalViewController { В данный массив не рекомендуется передавать больше 3 значений, т.к. модальное окно все равно сможет занять только 3 положения на экране. - ## DimmedView + ## DimmedView и PassthroughDimmedView - Для контроля `DimmedView` (затемняющей view) есть отдельное свойство `dimmedViewType`. Это перечисление, содержащие следующие кейсы: - - - opaque: dimmedView не прозрачен и чем выше будет подниматься, тем больше будет затемнение. В shortFormHeight прозрачность равна 0.0, в longFormHeight - 1.0. - - transparent: dimmedView полностью прозрачен и будет пропускать все жесты на нижний (показывающий) контроллер - - transparentWithShadow(_) dimmedView полностью прозрачен, однако модальное окно будет отбразывать тень на нижний контроллер. Все жесты так же проходят - - > `UIViewShadow` получил статичное свойство для быстрой настройки тени котроллера + Для контроля `DimmedView` (затемняющей view) есть отдельное свойство `dimmedView`. Эти классы позволяют настраивать поведение при тапе в затемнённую область и кастомизировать затемнение под ваши нужды. */ class ShadowViewController: BaseModalViewController { - var dimmedViewType: DimmedView.AppearanceType { - .transparentWithShadow(.defaultModalViewShadow) + override var dimmedView: DimmedView? { + let dimmedView = PassthroughDimmedView() + dimmedView.hitTestHandlerView = view + dimmedView.configureUIView(appearance: .init(shadow: UIViewShadow(radius: 8, + color: .black, + opacity: 0.3)) + + return dimmedView } } @@ -107,13 +107,9 @@ class ShadowViewController: BaseModalViewController { Если нет необходимости или возможности использовать `BaseModalViewController`, вы все так же можете пользоваться протоколом `PanModalRepresentable`. Вот список изменений протокола: - - `DragView` больше не добавляется самостоятельно автоматически. Однако теперь к нему есть доступ, так что его даже можно как угодно настроить - Открытие/закрытие модального окна теперь можно настроить с помощью свойств `onTapToDismiss` и `onDragToDismiss` - - Больше нет свойст отвечающих за разрешение закрыть модалку тапом или свайпом. Если какое-то из этих действий необходимо запретить, объявите соответствующее действие (`onTapToDismiss` и `onDragToDismiss`) с nil - Можно настроить промежуточное состояние модального окна с `mediumFormHeight` - - `DimmedView` остается настраиваемым с помощью `dimmedViewType` свойства - - Через протокол `PanModalPresentable` у вас остается доступ к `presentationDetents`. Однако его установка никак не повлияет на настройку высоты и положений модального окна. + - `DimmedView` открыт для наследования и может создаваться в `dimmedView` у > Для `BaseModalViewController` все свойства из `PanModalPresentable` все также работают, т.е. вы можете их переопределять, добавлять и изменять по необходимости. */ diff --git a/TIBottomSheet/TIBottomSheet.podspec b/TIBottomSheet/TIBottomSheet.podspec index 3659dafc..8c100fd9 100644 --- a/TIBottomSheet/TIBottomSheet.podspec +++ b/TIBottomSheet/TIBottomSheet.podspec @@ -23,6 +23,7 @@ Pod::Spec.new do |s| s.dependency 'TIUIElements', s.version.to_s s.dependency 'TIUIKitCore', s.version.to_s s.dependency 'TISwiftUtils', s.version.to_s + s.dependency 'PanModal', '~> 1.3.0' end diff --git a/docs/tibottomsheet/tibottomsheet.md b/docs/tibottomsheet/tibottomsheet.md index 5086aa85..251cf60e 100644 --- a/docs/tibottomsheet/tibottomsheet.md +++ b/docs/tibottomsheet/tibottomsheet.md @@ -86,20 +86,20 @@ class DetentsViewController: BaseModalViewController { В данный массив не рекомендуется передавать больше 3 значений, т.к. модальное окно все равно сможет занять только 3 положения на экране. -## DimmedView +## DimmedView и PassthroughDimmedView - Для контроля `DimmedView` (затемняющей view) есть отдельное свойство `dimmedViewType`. Это перечисление, содержащие следующие кейсы: - - - opaque: dimmedView не прозрачен и чем выше будет подниматься, тем больше будет затемнение. В shortFormHeight прозрачность равна 0.0, в longFormHeight - 1.0. - - transparent: dimmedView полностью прозрачен и будет пропускать все жесты на нижний (показывающий) контроллер - - transparentWithShadow(_) dimmedView полностью прозрачен, однако модальное окно будет отбразывать тень на нижний контроллер. Все жесты так же проходят - - > `UIViewShadow` получил статичное свойство для быстрой настройки тени котроллера + Для контроля `DimmedView` (затемняющей view) есть отдельное свойство `dimmedView`. Эти классы позволяют настраивать поведение при тапе в затемнённую область и кастомизировать затемнение под ваши нужды. ```swift class ShadowViewController: BaseModalViewController { - var dimmedViewType: DimmedView.AppearanceType { - .transparentWithShadow(.defaultModalViewShadow) + override var dimmedView: DimmedView? { + let dimmedView = PassthroughDimmedView() + dimmedView.hitTestHandlerView = view + dimmedView.configureUIView(appearance: .init(shadow: UIViewShadow(radius: 8, + color: .black, + opacity: 0.3)) + + return dimmedView } } ``` @@ -112,12 +112,8 @@ class ShadowViewController: BaseModalViewController { Если нет необходимости или возможности использовать `BaseModalViewController`, вы все так же можете пользоваться протоколом `PanModalRepresentable`. Вот список изменений протокола: - - `DragView` больше не добавляется самостоятельно автоматически. Однако теперь к нему есть доступ, так что его даже можно как угодно настроить - Открытие/закрытие модального окна теперь можно настроить с помощью свойств `onTapToDismiss` и `onDragToDismiss` - - Больше нет свойст отвечающих за разрешение закрыть модалку тапом или свайпом. Если какое-то из этих действий необходимо запретить, объявите соответствующее действие (`onTapToDismiss` и `onDragToDismiss`) с nil - Можно настроить промежуточное состояние модального окна с `mediumFormHeight` - - `DimmedView` остается настраиваемым с помощью `dimmedViewType` свойства - - Через протокол `PanModalPresentable` у вас остается доступ к `presentationDetents`. Однако его установка никак не повлияет на настройку высоты и положений модального окна. + - `DimmedView` открыт для наследования и может создаваться в `dimmedView` у > Для `BaseModalViewController` все свойства из `PanModalPresentable` все также работают, т.е. вы можете их переопределять, добавлять и изменять по необходимости. -- 2.40.1 From 80075323519ec32f3ec259720cc7fa30938e9968 Mon Sep 17 00:00:00 2001 From: Ivan Smolin Date: Tue, 25 Jul 2023 18:36:24 +0300 Subject: [PATCH 10/13] fix: keyboard overlapping for footer and content view of BaseModalViewController --- .../BottomSheet/BaseModalViewController.swift | 54 +++++++++---------- ...> DefaultModalWrapperViewController.swift} | 24 +++++---- .../Sources/BottomSheet/Views/DragView.swift | 2 +- .../BottomSheet/Views/ModalFooterView.swift | 7 +-- .../BottomSheet/Views/ModalHeaderView.swift | 52 +++++++++--------- .../Views/BasePlaceholderView.swift | 16 +++++- .../Containers/CollectionTableViewCell.swift | 4 +- .../Wrappers/Containers/ContainerView.swift | 2 +- 8 files changed, 86 insertions(+), 75 deletions(-) rename TIBottomSheet/Sources/BottomSheet/{BaseModalWrapperViewController.swift => DefaultModalWrapperViewController.swift} (61%) diff --git a/TIBottomSheet/Sources/BottomSheet/BaseModalViewController.swift b/TIBottomSheet/Sources/BottomSheet/BaseModalViewController.swift index 01a7369e..92f1b5c3 100644 --- a/TIBottomSheet/Sources/BottomSheet/BaseModalViewController.swift +++ b/TIBottomSheet/Sources/BottomSheet/BaseModalViewController.swift @@ -151,9 +151,6 @@ open class BaseModalViewController: BaseModalViewController -where ContentViewController: UIViewController { +open class DefaultModalWrapperViewController: BaseModalViewController { - private(set) public lazy var contentViewController = createContentViewController() + private(set) public var contentViewController: ContentController - // MARK: - BaseModalViewController + public init(contentViewController: ContentController) { + self.contentViewController = contentViewController - open override func createContentView() -> UIView { - contentViewController.view + super.init(nibName: nil, bundle: nil) } - // MARK: - Open methods + @available(*, unavailable) + required public init?(coder: NSCoder) { + contentViewController = ContentController() - open func createContentViewController() -> ContentViewController { - ContentViewController() + super.init(coder: coder) + } +} + +public extension UIViewController { + func wrappedInBottomSheetController() -> DefaultModalWrapperViewController { + DefaultModalWrapperViewController(contentViewController: self) } } diff --git a/TIBottomSheet/Sources/BottomSheet/Views/DragView.swift b/TIBottomSheet/Sources/BottomSheet/Views/DragView.swift index 1f05d400..22edd8ea 100644 --- a/TIBottomSheet/Sources/BottomSheet/Views/DragView.swift +++ b/TIBottomSheet/Sources/BottomSheet/Views/DragView.swift @@ -54,7 +54,7 @@ public final class DragView: BaseInitializableView, AppearanceConfigurable { public final class Appearance: UIView.BaseWrappedAppearance, WrappedViewAppearance { public static var defaultAppearance: Appearance { - Self().update { dragView in + .make { dragView in dragView.backgroundColor = Constants.dragViewBackgroundColor dragView.border = Constants.dragViewBorder diff --git a/TIBottomSheet/Sources/BottomSheet/Views/ModalFooterView.swift b/TIBottomSheet/Sources/BottomSheet/Views/ModalFooterView.swift index 20aae228..ab83ddfb 100644 --- a/TIBottomSheet/Sources/BottomSheet/Views/ModalFooterView.swift +++ b/TIBottomSheet/Sources/BottomSheet/Views/ModalFooterView.swift @@ -24,13 +24,10 @@ import TIUIElements import TIUIKitCore import UIKit -public typealias ModalFooterView = ContainerView - -public extension ModalFooterView { - +open class ModalFooterView: ContainerView { // MARK: - Nested Types - enum State { + public enum State { case hidden case presented(BaseWrappedViewHolderAppearance) } diff --git a/TIBottomSheet/Sources/BottomSheet/Views/ModalHeaderView.swift b/TIBottomSheet/Sources/BottomSheet/Views/ModalHeaderView.swift index 2827abb8..dc6ec762 100644 --- a/TIBottomSheet/Sources/BottomSheet/Views/ModalHeaderView.swift +++ b/TIBottomSheet/Sources/BottomSheet/Views/ModalHeaderView.swift @@ -42,31 +42,31 @@ open class ModalHeaderView: BaseInitializableView, AppearanceConfigurable { // MARK: - Public properties - public let leftButton = StatefulButton() - public let rightButton = StatefulButton() + public let leadingButton = StatefulButton() + public let trailingButton = StatefulButton() public private(set) lazy var leftTrailingToRightLeadingConstraint: NSLayoutConstraint = { - leftButton.trailingAnchor.constraint(equalTo: rightButton.leadingAnchor) + leadingButton.trailingAnchor.constraint(equalTo: trailingButton.leadingAnchor) }() public private(set) lazy var leftTrailingToSuperviewTrailing: NSLayoutConstraint = { - leftButton.trailingAnchor.constraint(equalTo: rightButton.leadingAnchor) + leadingButton.trailingAnchor.constraint(equalTo: trailingButton.leadingAnchor) }() public private(set) lazy var leftButtonConstraints: SubviewConstraints = { - let edgeConstraints = EdgeConstraints(leadingConstraint: leftButton.leadingAnchor.constraint(equalTo: leadingAnchor), + let edgeConstraints = EdgeConstraints(leadingConstraint: leadingButton.leadingAnchor.constraint(equalTo: leadingAnchor), trailingConstraint: leftTrailingToRightLeadingConstraint, - topConstraint: leftButton.topAnchor.constraint(equalTo: topAnchor), - bottomConstraint: leftButton.bottomAnchor.constraint(equalTo: bottomAnchor)) + topConstraint: leadingButton.topAnchor.constraint(equalTo: topAnchor), + bottomConstraint: leadingButton.bottomAnchor.constraint(equalTo: bottomAnchor)) - let centerXConstraint = leftButton.centerXAnchor.constraint(equalTo: centerXAnchor) - let centerYConstraint = leftButton.centerYAnchor.constraint(equalTo: centerYAnchor) + let centerXConstraint = leadingButton.centerXAnchor.constraint(equalTo: centerXAnchor) + let centerYConstraint = leadingButton.centerYAnchor.constraint(equalTo: centerYAnchor) let centerConstraints = CenterConstraints(centerXConstraint: centerXConstraint, centerYConstraint: centerYConstraint) - let sizeConstraints = SizeConstraints(widthConstraint: leftButton.widthAnchor.constraint(equalToConstant: .zero), - heightConstraint: leftButton.heightAnchor.constraint(equalToConstant: .zero)) + let sizeConstraints = SizeConstraints(widthConstraint: leadingButton.widthAnchor.constraint(equalToConstant: .zero), + heightConstraint: leadingButton.heightAnchor.constraint(equalToConstant: .zero)) return SubviewConstraints(edgeConstraints: edgeConstraints, centerConstraints: centerConstraints, @@ -74,25 +74,26 @@ open class ModalHeaderView: BaseInitializableView, AppearanceConfigurable { }() public private(set) lazy var rightLeadingToSuperviewLeadingConstraint: NSLayoutConstraint = { - rightButton.leadingAnchor.constraint(equalTo: leadingAnchor) + trailingButton.leadingAnchor.constraint(equalTo: leadingAnchor) }() public private(set) lazy var rightButtonConstraints: SubviewConstraints = { - let trailingConstraint = rightButton.trailingAnchor.constraint(equalTo: trailingAnchor) + let leadingConstraint = trailingButton.leadingAnchor.constraint(equalTo: leadingAnchor) + let trailingConstraint = trailingButton.trailingAnchor.constraint(equalTo: trailingAnchor) - let edgeConstraints = EdgeConstraints(leadingConstraint: rightButton.leadingAnchor.constraint(equalTo: leadingAnchor), + let edgeConstraints = EdgeConstraints(leadingConstraint: leadingConstraint, trailingConstraint: trailingConstraint, - topConstraint: rightButton.topAnchor.constraint(equalTo: topAnchor), - bottomConstraint: rightButton.bottomAnchor.constraint(equalTo: bottomAnchor)) + topConstraint: trailingButton.topAnchor.constraint(equalTo: topAnchor), + bottomConstraint: trailingButton.bottomAnchor.constraint(equalTo: bottomAnchor)) - let centerXConstraint = rightButton.centerXAnchor.constraint(equalTo: centerXAnchor) - let centerYConstraint = rightButton.centerYAnchor.constraint(equalTo: centerYAnchor) + let centerXConstraint = trailingButton.centerXAnchor.constraint(equalTo: centerXAnchor) + let centerYConstraint = trailingButton.centerYAnchor.constraint(equalTo: centerYAnchor) let centerConstraints = CenterConstraints(centerXConstraint: centerXConstraint, centerYConstraint: centerYConstraint) - let sizeConstraints = SizeConstraints(widthConstraint: rightButton.widthAnchor.constraint(equalToConstant: .zero), - heightConstraint: rightButton.heightAnchor.constraint(equalToConstant: .zero)) + let sizeConstraints = SizeConstraints(widthConstraint: trailingButton.widthAnchor.constraint(equalToConstant: .zero), + heightConstraint: trailingButton.heightAnchor.constraint(equalToConstant: .zero)) return SubviewConstraints(edgeConstraints: edgeConstraints, centerConstraints: centerConstraints, @@ -106,14 +107,15 @@ open class ModalHeaderView: BaseInitializableView, AppearanceConfigurable { open override func addViews() { super.addViews() - addSubviews(leftButton, rightButton) + addSubviews(leadingButton, trailingButton) } open override func configureLayout() { super.configureLayout() - [leftButton, rightButton] - .forEach { $0.translatesAutoresizingMaskIntoConstraints = false } + for view in [leadingButton, trailingButton] { + view.translatesAutoresizingMaskIntoConstraints = false + } } // MARK: - AppearanceConfigurable @@ -154,8 +156,8 @@ open class ModalHeaderView: BaseInitializableView, AppearanceConfigurable { view.configureUIView(appearance: appearance) } - configure(buttonStyle: leadingButtonStyle, forButton: leftButton, constraints: leftButtonConstraints) - configure(buttonStyle: trailingButtonStyle, forButton: rightButton, constraints: rightButtonConstraints) + configure(buttonStyle: leadingButtonStyle, forButton: leadingButton, constraints: leftButtonConstraints) + configure(buttonStyle: trailingButtonStyle, forButton: trailingButton, constraints: rightButtonConstraints) } // MARK: - Private methods diff --git a/TIUIElements/Sources/Views/Placeholder/Views/BasePlaceholderView.swift b/TIUIElements/Sources/Views/Placeholder/Views/BasePlaceholderView.swift index 49b6cca7..772d4538 100644 --- a/TIUIElements/Sources/Views/Placeholder/Views/BasePlaceholderView.swift +++ b/TIUIElements/Sources/Views/Placeholder/Views/BasePlaceholderView.swift @@ -101,8 +101,8 @@ open class BasePlaceholderView: BaseInitializableView { sizeConstraints: sizeConstraints) }() - public var keyboardDidShownObserver: NSObjectProtocol? - public var keyboardDidHiddenObserver: NSObjectProtocol? + private var keyboardDidShownObserver: NSObjectProtocol? + private var keyboardDidHiddenObserver: NSObjectProtocol? open var isImageViewHidden: Bool { imageView.isHidden @@ -112,6 +112,18 @@ open class BasePlaceholderView: BaseInitializableView { controlsStackView.isHidden || controlsStackView.arrangedSubviews.isEmpty } + deinit { + let notificationCenter = NotificationCenter.default + + if let keyboardDidShownObserver { + notificationCenter.removeObserver(keyboardDidShownObserver) + } + + if let keyboardDidHiddenObserver { + notificationCenter.removeObserver(keyboardDidHiddenObserver) + } + } + // MARK: - BaseInitializableView open override func addViews() { diff --git a/TIUIElements/Sources/Wrappers/Containers/CollectionTableViewCell.swift b/TIUIElements/Sources/Wrappers/Containers/CollectionTableViewCell.swift index d753f46f..efd45b8f 100644 --- a/TIUIElements/Sources/Wrappers/Containers/CollectionTableViewCell.swift +++ b/TIUIElements/Sources/Wrappers/Containers/CollectionTableViewCell.swift @@ -52,12 +52,12 @@ open class CollectionTableViewCell: ContainerT } let cachedCollectionFrame = wrappedView.frame - wrappedView.frame.size.width = targetSize.width - wrappedContentInsets.left - wrappedContentInsets.right + wrappedView.frame.size.width = targetSize.width - wrappedContentInsets.horizontal(onNan: .zero) let collectionContentHeight = wrappedView.collectionViewLayout.collectionViewContentSize.height wrappedView.frame = cachedCollectionFrame return CGSize(width: targetSize.width, - height: collectionContentHeight + wrappedContentInsets.top + wrappedContentInsets.bottom) + height: collectionContentHeight + wrappedContentInsets.vertical(onNan: .zero)) } // MARK: - Open methods diff --git a/TIUIElements/Sources/Wrappers/Containers/ContainerView.swift b/TIUIElements/Sources/Wrappers/Containers/ContainerView.swift index 9549c06b..272ad2e4 100644 --- a/TIUIElements/Sources/Wrappers/Containers/ContainerView.swift +++ b/TIUIElements/Sources/Wrappers/Containers/ContainerView.swift @@ -23,7 +23,7 @@ import TIUIKitCore import UIKit -public final class ContainerView: BaseInitializableView, WrappedViewHolder { +open class ContainerView: BaseInitializableView, WrappedViewHolder { public private(set) lazy var wrappedView = View() -- 2.40.1 From 843a887ec7224d3f0b254bd0977863451ec5e912 Mon Sep 17 00:00:00 2001 From: Ivan Smolin Date: Wed, 26 Jul 2023 14:37:49 +0300 Subject: [PATCH 11/13] fix: move presentation detents settings to modal view controller appearance, force use nan for undefined layout dimension, fix related layout issues --- Package.resolved | 20 ++--- .../BaseModalViewController+Appearance.swift | 14 +++- .../BottomSheet/BaseModalViewController.swift | 30 ++++--- .../DefaultModalWrapperViewController.swift | 7 ++ .../Sources/BottomSheet/Views/DragView.swift | 16 ++-- .../BottomSheet/Views/ModalFooterView.swift | 13 ++- .../BottomSheet/Views/ModalHeaderView.swift | 39 +++++---- .../Views/PassthroughDimmedView.swift | 11 ++- .../UIButton+AppearanceConfigurable.swift | 16 ++-- .../Appearance/UIView+ViewLayout.swift | 6 +- .../ContainerSeparatorTableViewCell.swift | 83 +++++++++---------- .../Views/ListItemView/BaseListItemView.swift | 6 +- .../Constraints/SubviewConstraints.swift | 8 -- .../Containers/CollectionTableViewCell.swift | 2 +- .../UIKit/UIEdgeInsets+Extensions.swift | 15 +++- 15 files changed, 158 insertions(+), 128 deletions(-) diff --git a/Package.resolved b/Package.resolved index 14b78560..ae273492 100644 --- a/Package.resolved +++ b/Package.resolved @@ -5,8 +5,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/Alamofire/Alamofire.git", "state" : { - "revision" : "f96b619bcb2383b43d898402283924b80e2c4bae", - "version" : "5.4.3" + "revision" : "bc268c28fb170f494de9e9927c371b8342979ece", + "version" : "5.7.1" } }, { @@ -32,8 +32,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/petropavel13/Cursors", "state" : { - "revision" : "a1561869135e72832eff3b1e729075c56c2eebf6", - "version" : "0.5.1" + "revision" : "52f27b82cb1cbbc2b5fd09514c48b9c75e3b0300", + "version" : "0.6.0" } }, { @@ -50,8 +50,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/Moya/Moya.git", "state" : { - "revision" : "9b906860e3c3c09032879465c471e6375829593f", - "version" : "15.0.0" + "revision" : "c263811c1f3dbf002be9bd83107f7cdc38992b26", + "version" : "15.0.3" } }, { @@ -59,8 +59,8 @@ "kind" : "remoteSourceControl", "location" : "https://git.svc.touchin.ru/TouchInstinct/PanModal", "state" : { - "revision" : "be82eddb529faa2bc668230906ec007c53e7b635", - "version" : "1.3.0" + "revision" : "ced7c1703f90746df0224b6e0d33c146d9ae4284", + "version" : "1.3.1" } }, { @@ -77,8 +77,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/ReactiveX/RxSwift.git", "state" : { - "revision" : "b4307ba0b6425c0ba4178e138799946c3da594f8", - "version" : "6.5.0" + "revision" : "9dcaa4b333db437b0fbfaf453fad29069044a8b4", + "version" : "6.6.0" } }, { diff --git a/TIBottomSheet/Sources/BottomSheet/BaseModalViewController+Appearance.swift b/TIBottomSheet/Sources/BottomSheet/BaseModalViewController+Appearance.swift index 53d66d0e..53a4002e 100644 --- a/TIBottomSheet/Sources/BottomSheet/BaseModalViewController+Appearance.swift +++ b/TIBottomSheet/Sources/BottomSheet/BaseModalViewController+Appearance.swift @@ -28,6 +28,7 @@ extension BaseModalViewController { open class BaseAppearance: UIView.BaseAppearance { + public var presentationDetents: [ModalViewPresentationDetent] public var dragViewState: DragView.State public var headerViewState: ModalHeaderView.State public var footerViewState: ModalFooterView.State @@ -36,15 +37,26 @@ extension BaseModalViewController { backgroundColor: UIColor = .clear, border: UIViewBorder = .init(), shadow: UIViewShadow? = nil, + presentationDetents: [ModalViewPresentationDetent] = [.maxHeight], dragViewState: DragView.State = .hidden, headerViewState: ModalHeaderView.State = .hidden, footerViewState: ModalFooterView.State = .hidden) { + self.presentationDetents = presentationDetents self.dragViewState = dragViewState self.headerViewState = headerViewState self.footerViewState = footerViewState - super.init(layout: layout, backgroundColor: backgroundColor, border: border, shadow: shadow) + super.init(layout: layout, + backgroundColor: backgroundColor, + border: border, + shadow: shadow) + } + } + + public final class DefaultAppearance: BaseAppearance, ViewAppearance { + public static var defaultAppearance: Self { + Self() } } } diff --git a/TIBottomSheet/Sources/BottomSheet/BaseModalViewController.swift b/TIBottomSheet/Sources/BottomSheet/BaseModalViewController.swift index 92f1b5c3..8f340340 100644 --- a/TIBottomSheet/Sources/BottomSheet/BaseModalViewController.swift +++ b/TIBottomSheet/Sources/BottomSheet/BaseModalViewController.swift @@ -112,7 +112,7 @@ open class BaseModalViewController [ModalViewPresentationDetent] { - presentationDetents.uniqued().sorted() + viewControllerAppearance.presentationDetents.uniqued().sorted() } private func getHeight(of view: UIView) -> CGFloat { diff --git a/TIBottomSheet/Sources/BottomSheet/DefaultModalWrapperViewController.swift b/TIBottomSheet/Sources/BottomSheet/DefaultModalWrapperViewController.swift index 342de463..b70b056a 100644 --- a/TIBottomSheet/Sources/BottomSheet/DefaultModalWrapperViewController.swift +++ b/TIBottomSheet/Sources/BottomSheet/DefaultModalWrapperViewController.swift @@ -30,6 +30,9 @@ open class DefaultModalWrapperViewController UIView { + contentViewController.view + } } public extension UIViewController { diff --git a/TIBottomSheet/Sources/BottomSheet/Views/DragView.swift b/TIBottomSheet/Sources/BottomSheet/Views/DragView.swift index 22edd8ea..f66b4d3a 100644 --- a/TIBottomSheet/Sources/BottomSheet/Views/DragView.swift +++ b/TIBottomSheet/Sources/BottomSheet/Views/DragView.swift @@ -53,16 +53,12 @@ public final class DragView: BaseInitializableView, AppearanceConfigurable { public final class Appearance: UIView.BaseWrappedAppearance, WrappedViewAppearance { - public static var defaultAppearance: Appearance { - .make { dragView in - dragView.backgroundColor = Constants.dragViewBackgroundColor - dragView.border = Constants.dragViewBorder - - dragView.layout { layout in - layout.size = Constants.dragViewSize - layout.insets = .vertical(top: Constants.dragViewTopInset) - } - } + public static var defaultAppearance: Self { + Self(layout: DefaultWrappedLayout(insets: .vertical(top: Constants.dragViewTopInset), + size: Constants.dragViewSize, + centerOffset: .centerHorizontal()), + backgroundColor: Constants.dragViewBackgroundColor, + border: Constants.dragViewBorder) } } diff --git a/TIBottomSheet/Sources/BottomSheet/Views/ModalFooterView.swift b/TIBottomSheet/Sources/BottomSheet/Views/ModalFooterView.swift index ab83ddfb..51e84e39 100644 --- a/TIBottomSheet/Sources/BottomSheet/Views/ModalFooterView.swift +++ b/TIBottomSheet/Sources/BottomSheet/Views/ModalFooterView.swift @@ -29,6 +29,17 @@ open class ModalFooterView: ContainerView { public enum State { case hidden - case presented(BaseWrappedViewHolderAppearance) + case presented(Appearance) + } +} + +public extension ModalFooterView { + + final class Appearance: BaseWrappedViewHolderAppearance, + WrappedViewHolderAppearance { + public static var defaultAppearance: Self { + Self(layout: DefaultWrappedLayout(insets: .horizontal(.zero).vertical(bottom: .zero), + size: .fixedHeight(44))) + } } } diff --git a/TIBottomSheet/Sources/BottomSheet/Views/ModalHeaderView.swift b/TIBottomSheet/Sources/BottomSheet/Views/ModalHeaderView.swift index dc6ec762..815d6493 100644 --- a/TIBottomSheet/Sources/BottomSheet/Views/ModalHeaderView.swift +++ b/TIBottomSheet/Sources/BottomSheet/Views/ModalHeaderView.swift @@ -50,10 +50,10 @@ open class ModalHeaderView: BaseInitializableView, AppearanceConfigurable { }() public private(set) lazy var leftTrailingToSuperviewTrailing: NSLayoutConstraint = { - leadingButton.trailingAnchor.constraint(equalTo: trailingButton.leadingAnchor) + leadingButton.trailingAnchor.constraint(equalTo: trailingAnchor) }() - public private(set) lazy var leftButtonConstraints: SubviewConstraints = { + public private(set) lazy var leadingButtonConstraints: SubviewConstraints = { let edgeConstraints = EdgeConstraints(leadingConstraint: leadingButton.leadingAnchor.constraint(equalTo: leadingAnchor), trailingConstraint: leftTrailingToRightLeadingConstraint, topConstraint: leadingButton.topAnchor.constraint(equalTo: topAnchor), @@ -77,11 +77,10 @@ open class ModalHeaderView: BaseInitializableView, AppearanceConfigurable { trailingButton.leadingAnchor.constraint(equalTo: leadingAnchor) }() - public private(set) lazy var rightButtonConstraints: SubviewConstraints = { - let leadingConstraint = trailingButton.leadingAnchor.constraint(equalTo: leadingAnchor) + public private(set) lazy var trailingButtonConstraints: SubviewConstraints = { let trailingConstraint = trailingButton.trailingAnchor.constraint(equalTo: trailingAnchor) - let edgeConstraints = EdgeConstraints(leadingConstraint: leadingConstraint, + let edgeConstraints = EdgeConstraints(leadingConstraint: leftTrailingToRightLeadingConstraint, trailingConstraint: trailingConstraint, topConstraint: trailingButton.topAnchor.constraint(equalTo: topAnchor), bottomConstraint: trailingButton.bottomAnchor.constraint(equalTo: bottomAnchor)) @@ -133,31 +132,34 @@ open class ModalHeaderView: BaseInitializableView, AppearanceConfigurable { switch state { case let .leadingButton(style): leadingButtonStyle = style - leftButtonConstraints.edgeConstraints.trailingConstraint = leftTrailingToSuperviewTrailing + leadingButtonConstraints.edgeConstraints.trailingConstraint = leftTrailingToSuperviewTrailing case let .trailingButton(style): trailingButtonStyle = style - rightButtonConstraints.edgeConstraints.leadingConstraint = rightLeadingToSuperviewLeadingConstraint + trailingButtonConstraints.edgeConstraints.leadingConstraint = rightLeadingToSuperviewLeadingConstraint case let .buttons(leading, trailing): leadingButtonStyle = leading trailingButtonStyle = trailing - leftButtonConstraints.edgeConstraints.trailingConstraint = leftTrailingToRightLeadingConstraint - rightButtonConstraints.edgeConstraints.leadingConstraint = leftTrailingToRightLeadingConstraint - - let spacing = leading.appearance.layout.insets.add(\.right, - to: \.left, - of: trailing.appearance.layout.insets) - - leftTrailingToRightLeadingConstraint.setActiveConstantOrDeactivate(constant: spacing) case let .custom(view, appearance): configureCustomView(view, withLayout: appearance.layout) view.configureUIView(appearance: appearance) } - configure(buttonStyle: leadingButtonStyle, forButton: leadingButton, constraints: leftButtonConstraints) - configure(buttonStyle: trailingButtonStyle, forButton: trailingButton, constraints: rightButtonConstraints) + configure(buttonStyle: leadingButtonStyle, forButton: leadingButton, constraints: leadingButtonConstraints) + configure(buttonStyle: trailingButtonStyle, forButton: trailingButton, constraints: trailingButtonConstraints) + + if let leadingButtonStyle, let trailingButtonStyle { + leadingButtonConstraints.edgeConstraints.trailingConstraint = leftTrailingToRightLeadingConstraint + trailingButtonConstraints.edgeConstraints.leadingConstraint = leftTrailingToRightLeadingConstraint + + let spacing = leadingButtonStyle.appearance.layout.insets.add(\.right, + to: \.left, + of: trailingButtonStyle.appearance.layout.insets) + + leftTrailingToRightLeadingConstraint.setActiveConstantOrDeactivate(constant: spacing) + } } // MARK: - Private methods @@ -210,7 +212,8 @@ public extension ModalHeaderView { final class Appearance: BaseWrappedAppearance, WrappedViewAppearance { public static var defaultAppearance: Self { - Self() + Self(layout: DefaultWrappedLayout(insets: .horizontal(.zero).vertical(top: .zero), + size: .fixedHeight(44))) } public var contentViewState: ContentViewState diff --git a/TIBottomSheet/Sources/BottomSheet/Views/PassthroughDimmedView.swift b/TIBottomSheet/Sources/BottomSheet/Views/PassthroughDimmedView.swift index 70056aed..64c0e249 100644 --- a/TIBottomSheet/Sources/BottomSheet/Views/PassthroughDimmedView.swift +++ b/TIBottomSheet/Sources/BottomSheet/Views/PassthroughDimmedView.swift @@ -24,7 +24,7 @@ import UIKit import PanModal open class PassthroughDimmedView: DimmedView { - weak var hitTestHandlerView: UIView? + public weak var hitTestHandlerView: UIView? public var isTransparent = false @@ -41,11 +41,10 @@ open class PassthroughDimmedView: DimmedView { } open override func onChange(dimState: DimmedView.DimState) { - guard !isTransparent else { - alpha = .zero - return - } - super.onChange(dimState: dimState) + + if isTransparent { + alpha = .zero + } } } diff --git a/TIUIElements/Sources/Appearance/UIButton+AppearanceConfigurable.swift b/TIUIElements/Sources/Appearance/UIButton+AppearanceConfigurable.swift index 6c7b56a5..00afb6a9 100644 --- a/TIUIElements/Sources/Appearance/UIButton+AppearanceConfigurable.swift +++ b/TIUIElements/Sources/Appearance/UIButton+AppearanceConfigurable.swift @@ -30,21 +30,21 @@ extension UIButton { appearance.textAttributes? .configure(button: self, with: title(for: state), - for: state) + for: state) if #available(iOS 15, *) { var config = configuration ?? .plain() configureInsets(in: &config, - contentInsets: appearance.contentLayout.contentInsets, - titleInsets: appearance.contentLayout.titleInsets, - imageInsets: appearance.contentLayout.imageInsets) + contentInsets: appearance.contentLayout.contentInsets.replacingNan(with: .zero), + titleInsets: appearance.contentLayout.titleInsets.replacingNan(with: .zero), + imageInsets: appearance.contentLayout.imageInsets.replacingNan(with: .zero)) configuration = config } else { - contentEdgeInsets = appearance.contentLayout.contentInsets - titleEdgeInsets = appearance.contentLayout.titleInsets - imageEdgeInsets = appearance.contentLayout.imageInsets + contentEdgeInsets = appearance.contentLayout.contentInsets.replacingNan(with: .zero) + titleEdgeInsets = appearance.contentLayout.titleInsets.replacingNan(with: .zero) + imageEdgeInsets = appearance.contentLayout.imageInsets.replacingNan(with: .zero) } super.configureUIView(appearance: appearance) @@ -67,7 +67,7 @@ extension UIButton { currentImage ] .compactMap { $0 } - .first { !($0.size.width.isZero || $0.size.height.isZero) } != nil + .contains { !($0.size.width.isZero || $0.size.height.isZero) } if hasNonEmptyImage { let leadingContentInset: CGFloat diff --git a/TIUIElements/Sources/Appearance/UIView+ViewLayout.swift b/TIUIElements/Sources/Appearance/UIView+ViewLayout.swift index 94904d82..4a7118a3 100644 --- a/TIUIElements/Sources/Appearance/UIView+ViewLayout.swift +++ b/TIUIElements/Sources/Appearance/UIView+ViewLayout.swift @@ -53,7 +53,7 @@ extension UIView { public var centerOffset: UIOffset public var insets: UIEdgeInsets - public init(insets: UIEdgeInsets = .zero, + public init(insets: UIEdgeInsets = .nan, size: CGSize = .infinity, centerOffset: UIOffset = .nan) { @@ -73,7 +73,7 @@ extension UIView { open class BaseSpecedWrappedLayout: BaseWrappedLayout { public var spacing: CGFloat - public init(insets: UIEdgeInsets = .zero, + public init(insets: UIEdgeInsets = .nan, size: CGSize = .infinity, centerOffset: UIOffset = .nan, spacing: CGFloat = .zero) { @@ -98,7 +98,7 @@ extension UIView { public var distribution: UIStackView.Distribution public var alignment: UIStackView.Alignment - public init(insets: UIEdgeInsets = .zero, + public init(insets: UIEdgeInsets = .nan, size: CGSize = .infinity, centerOffset: UIOffset = .nan, spacing: CGFloat = .zero, diff --git a/TIUIElements/Sources/Separators/ContainerSeparatorTableViewCell.swift b/TIUIElements/Sources/Separators/ContainerSeparatorTableViewCell.swift index 1f34f887..17a54326 100644 --- a/TIUIElements/Sources/Separators/ContainerSeparatorTableViewCell.swift +++ b/TIUIElements/Sources/Separators/ContainerSeparatorTableViewCell.swift @@ -27,15 +27,13 @@ open class ContainerSeparatorTableViewCell: ContainerTableViewCell private lazy var topSeparatorView = createTopSeparator() private lazy var bottomSeparatorView = createBottomSeparator() - private var topViewLeftConstraint: NSLayoutConstraint? - private var topViewRightConstraint: NSLayoutConstraint? - private var topViewTopConstraint: NSLayoutConstraint? - private var topViewHeightConstraint: NSLayoutConstraint? + private lazy var topSeparatorConstraints: SubviewConstraints = { + subviewConstraints(for: topSeparatorView) + }() - private var bottomViewLeftConstraint: NSLayoutConstraint? - private var bottomViewRightConstraint: NSLayoutConstraint? - private var bottomViewBottomConstraint: NSLayoutConstraint? - private var bottomViewHeightConstraint: NSLayoutConstraint? + private lazy var bottomSeparatorConstraints: SubviewConstraints = { + subviewConstraints(for: bottomSeparatorView) + }() open func createTopSeparator() -> UIView { .init() @@ -93,41 +91,17 @@ open class ContainerSeparatorTableViewCell: ContainerTableViewCell open override func configureLayout() { super.configureLayout() - if let separatorSuperview = topSeparatorView.superview { - topViewTopConstraint = topSeparatorView.topAnchor.constraint(equalTo: separatorSuperview.topAnchor) - topViewRightConstraint = separatorSuperview.rightAnchor.constraint(equalTo: topSeparatorView.rightAnchor) - topViewLeftConstraint = topSeparatorView.leftAnchor.constraint(equalTo: separatorSuperview.leftAnchor) + for view in [topSeparatorView, bottomSeparatorView] { + view.translatesAutoresizingMaskIntoConstraints = false } - - topViewHeightConstraint = topSeparatorView.heightAnchor.constraint(equalToConstant: 1) - - if let separatorSuperview = topSeparatorView.superview { - bottomViewRightConstraint = separatorSuperview.rightAnchor.constraint(equalTo: bottomSeparatorView.rightAnchor) - bottomViewLeftConstraint = bottomSeparatorView.leftAnchor.constraint(equalTo: separatorSuperview.leftAnchor) - bottomViewBottomConstraint = bottomSeparatorView.bottomAnchor.constraint(equalTo: separatorSuperview.bottomAnchor) - } - - bottomViewHeightConstraint = bottomSeparatorView.heightAnchor.constraint(equalToConstant: 1) - - NSLayoutConstraint.activate([ - topViewTopConstraint, - topViewRightConstraint, - topViewLeftConstraint, - topViewHeightConstraint, - bottomViewRightConstraint, - bottomViewLeftConstraint, - bottomViewBottomConstraint, - bottomViewHeightConstraint - ].compactMap { $0 }) } open override func configureAppearance() { super.configureAppearance() - [topSeparatorView, bottomSeparatorView].forEach { - $0.isHidden = true - $0.backgroundColor = .black - $0.translatesAutoresizingMaskIntoConstraints = false + for view in [topSeparatorView, bottomSeparatorView] { + view.isHidden = true + view.backgroundColor = .black } } @@ -136,20 +110,37 @@ open class ContainerSeparatorTableViewCell: ContainerTableViewCell private func updateTopSeparator(with appearance: SeparatorAppearance) { topSeparatorView.configureUIView(appearance: appearance) - topViewHeightConstraint?.constant = appearance.layout.size.height - - topViewTopConstraint?.constant = appearance.layout.insets.top - topViewLeftConstraint?.constant = appearance.layout.insets.left - topViewRightConstraint?.constant = appearance.layout.insets.right + topSeparatorConstraints.update(from: appearance.layout) } private func updateBottomSeparator(with appearance: SeparatorAppearance) { bottomSeparatorView.configureUIView(appearance: appearance) - bottomViewHeightConstraint?.constant = appearance.layout.size.height + bottomSeparatorConstraints.update(from: appearance.layout) + } - bottomViewBottomConstraint?.constant = appearance.layout.insets.bottom - bottomViewLeftConstraint?.constant = appearance.layout.insets.left - bottomViewRightConstraint?.constant = appearance.layout.insets.right + private func subviewConstraints(for seperatorView: UIView) -> SubviewConstraints { + let leadingConstraint = seperatorView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor) + let trailingConstraint = seperatorView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor) + let topConstraint = seperatorView.topAnchor.constraint(equalTo: contentView.topAnchor) + let bottomConstraint = seperatorView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor) + + let edgeConstraints = EdgeConstraints(leadingConstraint: leadingConstraint, + trailingConstraint: trailingConstraint, + topConstraint: topConstraint, + bottomConstraint: bottomConstraint) + + let centerXConstraint = seperatorView.centerXAnchor.constraint(equalTo: contentView.centerXAnchor) + let centerYConstraint = seperatorView.centerYAnchor.constraint(equalTo: contentView.centerYAnchor) + + let centerConstraints = CenterConstraints(centerXConstraint: centerXConstraint, + centerYConstraint: centerYConstraint) + + let sizeConstraints = SizeConstraints(widthConstraint: seperatorView.widthAnchor.constraint(equalToConstant: .zero), + heightConstraint: seperatorView.heightAnchor.constraint(equalToConstant: .zero)) + + return SubviewConstraints(edgeConstraints: edgeConstraints, + centerConstraints: centerConstraints, + sizeConstraints: sizeConstraints) } } diff --git a/TIUIElements/Sources/Views/ListItemView/BaseListItemView.swift b/TIUIElements/Sources/Views/ListItemView/BaseListItemView.swift index 1fb43419..f1c9bbf7 100644 --- a/TIUIElements/Sources/Views/ListItemView/BaseListItemView.swift +++ b/TIUIElements/Sources/Views/ListItemView/BaseListItemView.swift @@ -184,7 +184,8 @@ open class BaseListItemView: ContainerT } let cachedCollectionFrame = wrappedView.frame - wrappedView.frame.size.width = targetSize.width - wrappedContentInsets.horizontal(onNan: .zero) + wrappedView.frame.size.width = max(targetSize.width - wrappedContentInsets.horizontal(onNan: .zero), .zero) let collectionContentHeight = wrappedView.collectionViewLayout.collectionViewContentSize.height wrappedView.frame = cachedCollectionFrame diff --git a/TIUIKitCore/Sources/Extensions/UIKit/UIEdgeInsets+Extensions.swift b/TIUIKitCore/Sources/Extensions/UIKit/UIEdgeInsets+Extensions.swift index c27fb07d..4e14ff55 100644 --- a/TIUIKitCore/Sources/Extensions/UIKit/UIEdgeInsets+Extensions.swift +++ b/TIUIKitCore/Sources/Extensions/UIKit/UIEdgeInsets+Extensions.swift @@ -26,6 +26,10 @@ public extension UIEdgeInsets { // MARK: - Factory methods + static var nan: Self { + .edges(.nan) + } + static func edges(_ insets: CGFloat) -> UIEdgeInsets { .init(top: insets, left: insets, bottom: insets, right: insets) } @@ -64,14 +68,21 @@ public extension UIEdgeInsets { .init(top: insets, left: left, bottom: insets, right: right) } - func horizontal(left: CGFloat = .zero, right: CGFloat = .zero) -> UIEdgeInsets { + func horizontal(left: CGFloat = .nan, right: CGFloat = .nan) -> UIEdgeInsets { .init(top: top, left: left, bottom: bottom, right: right) } - func vertical(top: CGFloat = .zero, bottom: CGFloat = .zero) -> UIEdgeInsets { + func vertical(top: CGFloat = .nan, bottom: CGFloat = .nan) -> UIEdgeInsets { .init(top: top, left: left, bottom: bottom, right: right) } + func replacingNan(with defaultValue: CGFloat) -> Self { + .init(top: top.isFinite ? top : defaultValue, + left: left.isFinite ? left : defaultValue, + bottom: bottom.isFinite ? bottom : defaultValue, + right: right.isFinite ? right : defaultValue) + } + func add(_ lhsKeyPath: KeyPath, to rhsKeyPath: KeyPath, of rhs: Self, -- 2.40.1 From c485434f51c3045bba57e92661378be653727ef8 Mon Sep 17 00:00:00 2001 From: Ivan Smolin Date: Wed, 26 Jul 2023 22:24:02 +0300 Subject: [PATCH 12/13] build: add makefile for parallel execution of pod repo push action --- Makefile | 103 ++++++++++++++++++ Package.swift | 6 +- TIAppleMapUtils/TIAppleMapUtils.podspec | 2 +- TIAuth/TIAuth.podspec | 2 +- TIBottomSheet/TIBottomSheet.podspec | 2 +- .../TICoreGraphicsUtils.podspec | 2 +- TIDeeplink/TIDeeplink.podspec | 2 +- TIDeveloperUtils/TIDeveloperUtils.podspec | 2 +- TIEcommerce/TIEcommerce.podspec | 2 +- TIFoundationUtils/TIFoundationUtils.podspec | 2 +- TIGoogleMapUtils/TIGoogleMapUtils.podspec | 2 +- TIKeychainUtils/TIKeychainUtils.podspec | 2 +- TILogging/TILogging.podspec | 2 +- TIMapUtils/TIMapUtils.podspec | 2 +- TIMoyaNetworking/TIMoyaNetworking.podspec | 2 +- TINetworking/TINetworking.podspec | 2 +- TINetworkingCache/TINetworkingCache.podspec | 2 +- TIPagination/TIPagination.podspec | 2 +- TISwiftUICore/TISwiftUICore.podspec | 2 +- TISwiftUtils/TISwiftUtils.podspec | 2 +- TITableKitUtils/TITableKitUtils.podspec | 2 +- TITextProcessing/TITextProcessing.podspec | 2 +- TIUIElements/TIUIElements.podspec | 2 +- TIUIKitCore/TIUIKitCore.podspec | 2 +- TIWebView/TIWebView.podspec | 2 +- TIYandexMapUtils/TIYandexMapUtils.podspec | 2 +- project-scripts/push_to_podspecs.sh | 23 ++-- 27 files changed, 146 insertions(+), 34 deletions(-) create mode 100644 Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..f9807505 --- /dev/null +++ b/Makefile @@ -0,0 +1,103 @@ +export SRCROOT := $(shell pwd) + +push_to_podspecs: TISwiftUtils.target TIFoundationUtils.target TICoreGraphicsUtils.target TIKeychainUtils.target TIUIKitCore.target TIUIElements.target TIWebView.target TIBottomSheet.target TISwiftUICore.target TITableKitUtils.target TIDeeplink.target TIDeveloperUtils.target TILogging.target TINetworking.target TIMoyaNetworking.target TINetworkingCache.target TIMapUtils.target TIAppleMapUtils.target TIGoogleMapUtils.target TIPagination.target TIAuth.target TIEcommerce.target TITextProcessing.target + $(call clean) + +TISwiftUtils.target: + MODULE_NAME="TISwiftUtils" ./project-scripts/push_to_podspecs.sh + touch TISwiftUtils.target + +TIFoundationUtils.target: TISwiftUtils.target + MODULE_NAME="TIFoundationUtils" ./project-scripts/push_to_podspecs.sh + touch TIFoundationUtils.target + +TICoreGraphicsUtils.target: + MODULE_NAME="TICoreGraphicsUtils" ./project-scripts/push_to_podspecs.sh + touch TICoreGraphicsUtils.target + +TIKeychainUtils.target: TIFoundationUtils.target + MODULE_NAME="TIKeychainUtils" ./project-scripts/push_to_podspecs.sh + touch TIKeychainUtils.target + +TIUIKitCore.target: TISwiftUtils.target + MODULE_NAME="TIUIKitCore" ./project-scripts/push_to_podspecs.sh + touch TIUIKitCore.target + +TIUIElements.target: TIUIKitCore.target + MODULE_NAME="TIUIElements" ./project-scripts/push_to_podspecs.sh + touch TIUIElements.target + +TIWebView.target: TIUIKitCore.target + MODULE_NAME="TIWebView" ./project-scripts/push_to_podspecs.sh + touch TIWebView.target + +TIBottomSheet.target: TIUIElements.target + MODULE_NAME="TIBottomSheet" ./project-scripts/push_to_podspecs.sh + touch TIBottomSheet.target + +TISwiftUICore.target: TIUIKitCore.target + MODULE_NAME="TISwiftUICore" ./project-scripts/push_to_podspecs.sh + touch TISwiftUICore.target + +TITableKitUtils.target: TIUIElements.target + MODULE_NAME="TITableKitUtils" ./project-scripts/push_to_podspecs.sh + touch TITableKitUtils.target + +TIDeeplink.target: TIFoundationUtils.target + MODULE_NAME="TIDeeplink" ./project-scripts/push_to_podspecs.sh + touch TIDeeplink.target + +TIDeveloperUtils.target: TIUIElements.target + MODULE_NAME="TIDeveloperUtils" ./project-scripts/push_to_podspecs.sh + touch TIDeveloperUtils.target + +TINetworking.target: TIFoundationUtils.target + MODULE_NAME="TINetworking" ./project-scripts/push_to_podspecs.sh + touch TINetworking.target + +TILogging.target: + MODULE_NAME="TILogging" ./project-scripts/push_to_podspecs.sh + touch TILogging.target + +TIMoyaNetworking.target: TINetworking.target + MODULE_NAME="TIMoyaNetworking" ./project-scripts/push_to_podspecs.sh + touch TIMoyaNetworking.target + +TINetworkingCache.target: TINetworking.target + MODULE_NAME="TINetworkingCache" ./project-scripts/push_to_podspecs.sh + touch TINetworkingCache.target + +TIMapUtils.target: TILogging TICoreGraphicsUtils.target + MODULE_NAME="TIMapUtils" ./project-scripts/push_to_podspecs.sh + touch TIMapUtils.target + +TIAppleMapUtils.target: TIMapUtils.target + MODULE_NAME="TIAppleMapUtils" ./project-scripts/push_to_podspecs.sh + touch TIAppleMapUtils.target + +TIGoogleMapUtils.target: TIMapUtils.target + MODULE_NAME="TIGoogleMapUtils" ./project-scripts/push_to_podspecs.sh + touch TIGoogleMapUtils.target + +TIYandexMapUtils.target: TIMapUtils.target + MODULE_NAME="TIYandexMapUtils" ./project-scripts/push_to_podspecs.sh + touch TIYandexMapUtils.target + +TIPagination.target: TISwiftUtils.target + MODULE_NAME="TIPagination" ./project-scripts/push_to_podspecs.sh + touch TIPagination.target + +TIAuth.target: TIUIKitCore.target TIKeychainUtils.target + MODULE_NAME="TIAuth" ./project-scripts/push_to_podspecs.sh + touch TIAuth.target + +TIEcommerce.target: TINetworking.target TIUIElements.target + MODULE_NAME="TIEcommerce" ./project-scripts/push_to_podspecs.sh + touch TIEcommerce.target + +TITextProcessing.target: + MODULE_NAME="TITextProcessing" ./project-scripts/push_to_podspecs.sh + touch TITextProcessing.target + +clean: + rm *.target diff --git a/Package.swift b/Package.swift index c7cfa56b..feca2418 100644 --- a/Package.swift +++ b/Package.swift @@ -118,12 +118,12 @@ let package = Package( plugins: [.plugin(name: "TISwiftLintPlugin")]), .target(name: "TIMoyaNetworking", - dependencies: ["TINetworking", "TIFoundationUtils", "Moya"], + dependencies: ["TINetworking", "Moya"], path: "TIMoyaNetworking/Sources", plugins: [.plugin(name: "TISwiftLintPlugin")]), .target(name: "TINetworkingCache", - dependencies: ["TIFoundationUtils", "TINetworking", "Cache"], + dependencies: ["TINetworking", "Cache"], path: "TINetworkingCache/Sources", plugins: [.plugin(name: "TISwiftLintPlugin")]), @@ -143,7 +143,7 @@ let package = Package( .target(name: "OTPSwiftView", dependencies: ["TIUIElements"], path: "OTPSwiftView/Sources"), .target(name: "TITransitions", path: "TITransitions/Sources"), .target(name: "TIPagination", dependencies: ["Cursors", "TISwiftUtils"], path: "TIPagination/Sources"), - .target(name: "TIAuth", dependencies: ["TIFoundationUtils", "TIUIKitCore", "TIKeychainUtils"], path: "TIAuth/Sources"), + .target(name: "TIAuth", dependencies: ["TIUIKitCore", "TIKeychainUtils"], path: "TIAuth/Sources"), .target(name: "TIEcommerce", dependencies: ["TIFoundationUtils", "TISwiftUtils", "TINetworking", "TIUIKitCore", "TIUIElements"], path: "TIEcommerce/Sources"), .target(name: "TITextProcessing", dependencies: [.product(name: "Antlr4", package: "antlr4")], diff --git a/TIAppleMapUtils/TIAppleMapUtils.podspec b/TIAppleMapUtils/TIAppleMapUtils.podspec index 05398773..1319b561 100644 --- a/TIAppleMapUtils/TIAppleMapUtils.podspec +++ b/TIAppleMapUtils/TIAppleMapUtils.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TIAppleMapUtils' - s.version = '1.50.0' + s.version = '1.51.0' s.summary = 'Set of helpers for map objects clustering and interacting using Apple MapKit.' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TIAuth/TIAuth.podspec b/TIAuth/TIAuth.podspec index 6f585a37..231c1c91 100644 --- a/TIAuth/TIAuth.podspec +++ b/TIAuth/TIAuth.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TIAuth' - s.version = '1.50.0' + s.version = '1.51.0' s.summary = 'Login, registration, confirmation and other related actions' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TIBottomSheet/TIBottomSheet.podspec b/TIBottomSheet/TIBottomSheet.podspec index 8c100fd9..bfaeb5a1 100644 --- a/TIBottomSheet/TIBottomSheet.podspec +++ b/TIBottomSheet/TIBottomSheet.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TIBottomSheet' - s.version = '1.45.0' + s.version = '1.51.0' s.summary = 'Base models for creating bottom sheet view controllers' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TICoreGraphicsUtils/TICoreGraphicsUtils.podspec b/TICoreGraphicsUtils/TICoreGraphicsUtils.podspec index b2754d8d..e36a6951 100644 --- a/TICoreGraphicsUtils/TICoreGraphicsUtils.podspec +++ b/TICoreGraphicsUtils/TICoreGraphicsUtils.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TICoreGraphicsUtils' - s.version = '1.50.0' + s.version = '1.51.0' s.summary = 'CoreGraphics drawing helpers' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TIDeeplink/TIDeeplink.podspec b/TIDeeplink/TIDeeplink.podspec index 49c419a0..f018e444 100644 --- a/TIDeeplink/TIDeeplink.podspec +++ b/TIDeeplink/TIDeeplink.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TIDeeplink' - s.version = '1.50.0' + s.version = '1.51.0' s.summary = 'Deeplink service API' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TIDeveloperUtils/TIDeveloperUtils.podspec b/TIDeveloperUtils/TIDeveloperUtils.podspec index 62bf96fc..00cb5431 100644 --- a/TIDeveloperUtils/TIDeveloperUtils.podspec +++ b/TIDeveloperUtils/TIDeveloperUtils.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TIDeveloperUtils' - s.version = '1.50.0' + s.version = '1.51.0' s.summary = 'Universal web view API' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TIEcommerce/TIEcommerce.podspec b/TIEcommerce/TIEcommerce.podspec index 46af1443..c3b053a7 100644 --- a/TIEcommerce/TIEcommerce.podspec +++ b/TIEcommerce/TIEcommerce.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TIEcommerce' - s.version = '1.50.0' + s.version = '1.51.0' s.summary = 'Cart, products, promocodes, bonuses and other related actions' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TIFoundationUtils/TIFoundationUtils.podspec b/TIFoundationUtils/TIFoundationUtils.podspec index 1ae0655b..98183c7d 100644 --- a/TIFoundationUtils/TIFoundationUtils.podspec +++ b/TIFoundationUtils/TIFoundationUtils.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TIFoundationUtils' - s.version = '1.50.0' + s.version = '1.51.0' s.summary = 'Set of helpers for Foundation framework classes.' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TIGoogleMapUtils/TIGoogleMapUtils.podspec b/TIGoogleMapUtils/TIGoogleMapUtils.podspec index 7f8ee7dc..f799cd0f 100644 --- a/TIGoogleMapUtils/TIGoogleMapUtils.podspec +++ b/TIGoogleMapUtils/TIGoogleMapUtils.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TIGoogleMapUtils' - s.version = '1.50.0' + s.version = '1.51.0' s.summary = 'Set of helpers for map objects clustering and interacting using Google Maps SDK.' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TIKeychainUtils/TIKeychainUtils.podspec b/TIKeychainUtils/TIKeychainUtils.podspec index f0a30835..d22109cf 100644 --- a/TIKeychainUtils/TIKeychainUtils.podspec +++ b/TIKeychainUtils/TIKeychainUtils.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TIKeychainUtils' - s.version = '1.50.0' + s.version = '1.51.0' s.summary = 'Set of helpers for Keychain classes.' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TILogging/TILogging.podspec b/TILogging/TILogging.podspec index e12e9b9e..03ac88c1 100644 --- a/TILogging/TILogging.podspec +++ b/TILogging/TILogging.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TILogging' - s.version = '1.50.0' + s.version = '1.51.0' s.summary = 'Logging for TI libraries.' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TIMapUtils/TIMapUtils.podspec b/TIMapUtils/TIMapUtils.podspec index d7ed6cb3..6c0a706a 100644 --- a/TIMapUtils/TIMapUtils.podspec +++ b/TIMapUtils/TIMapUtils.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TIMapUtils' - s.version = '1.50.0' + s.version = '1.51.0' s.summary = 'Set of helpers for map objects clustering and interacting.' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TIMoyaNetworking/TIMoyaNetworking.podspec b/TIMoyaNetworking/TIMoyaNetworking.podspec index 2af06524..0ef8a3b3 100644 --- a/TIMoyaNetworking/TIMoyaNetworking.podspec +++ b/TIMoyaNetworking/TIMoyaNetworking.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TIMoyaNetworking' - s.version = '1.50.0' + s.version = '1.51.0' s.summary = 'Moya + Swagger network service.' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TINetworking/TINetworking.podspec b/TINetworking/TINetworking.podspec index bd4ecc20..5e0bba93 100644 --- a/TINetworking/TINetworking.podspec +++ b/TINetworking/TINetworking.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TINetworking' - s.version = '1.50.0' + s.version = '1.51.0' s.summary = 'Swagger-frendly networking layer helpers.' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TINetworkingCache/TINetworkingCache.podspec b/TINetworkingCache/TINetworkingCache.podspec index bfadd0f1..0e947440 100644 --- a/TINetworkingCache/TINetworkingCache.podspec +++ b/TINetworkingCache/TINetworkingCache.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TINetworkingCache' - s.version = '1.50.0' + s.version = '1.51.0' s.summary = 'Caching results of EndpointRequests.' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TIPagination/TIPagination.podspec b/TIPagination/TIPagination.podspec index a99e7deb..af15b71b 100644 --- a/TIPagination/TIPagination.podspec +++ b/TIPagination/TIPagination.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TIPagination' - s.version = '1.50.0' + s.version = '1.51.0' s.summary = 'Generic pagination component.' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TISwiftUICore/TISwiftUICore.podspec b/TISwiftUICore/TISwiftUICore.podspec index b1f66557..e8f73430 100644 --- a/TISwiftUICore/TISwiftUICore.podspec +++ b/TISwiftUICore/TISwiftUICore.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TISwiftUICore' - s.version = '1.50.0' + s.version = '1.51.0' s.summary = 'Core UI elements: protocols, views and helpers.' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TISwiftUtils/TISwiftUtils.podspec b/TISwiftUtils/TISwiftUtils.podspec index 61a5f078..1451f5f8 100644 --- a/TISwiftUtils/TISwiftUtils.podspec +++ b/TISwiftUtils/TISwiftUtils.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TISwiftUtils' - s.version = '1.50.0' + s.version = '1.51.0' s.summary = 'Bunch of useful helpers for Swift development.' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TITableKitUtils/TITableKitUtils.podspec b/TITableKitUtils/TITableKitUtils.podspec index 15c646b7..a31eaac8 100644 --- a/TITableKitUtils/TITableKitUtils.podspec +++ b/TITableKitUtils/TITableKitUtils.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TITableKitUtils' - s.version = '1.50.0' + s.version = '1.51.0' s.summary = 'Set of helpers for TableKit classes.' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TITextProcessing/TITextProcessing.podspec b/TITextProcessing/TITextProcessing.podspec index 404f29ff..8813a18e 100644 --- a/TITextProcessing/TITextProcessing.podspec +++ b/TITextProcessing/TITextProcessing.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TITextProcessing' - s.version = '1.50.0' + s.version = '1.51.0' s.summary = 'A text processing service helping to get a text mask and a placeholder from incoming regex.' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TIUIElements/TIUIElements.podspec b/TIUIElements/TIUIElements.podspec index 103c020f..979a0bfc 100644 --- a/TIUIElements/TIUIElements.podspec +++ b/TIUIElements/TIUIElements.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TIUIElements' - s.version = '1.50.0' + s.version = '1.51.0' s.summary = 'Bunch of useful protocols and views.' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TIUIKitCore/TIUIKitCore.podspec b/TIUIKitCore/TIUIKitCore.podspec index 098ae299..1e6dc19f 100644 --- a/TIUIKitCore/TIUIKitCore.podspec +++ b/TIUIKitCore/TIUIKitCore.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TIUIKitCore' - s.version = '1.50.0' + s.version = '1.51.0' s.summary = 'Core UI elements: protocols, views and helpers.' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TIWebView/TIWebView.podspec b/TIWebView/TIWebView.podspec index 77cfa44a..7ef71d3e 100644 --- a/TIWebView/TIWebView.podspec +++ b/TIWebView/TIWebView.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TIWebView' - s.version = '1.50.0' + s.version = '1.51.0' s.summary = 'Universal web view API' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/TIYandexMapUtils/TIYandexMapUtils.podspec b/TIYandexMapUtils/TIYandexMapUtils.podspec index 0e3d3db0..5bd52978 100644 --- a/TIYandexMapUtils/TIYandexMapUtils.podspec +++ b/TIYandexMapUtils/TIYandexMapUtils.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'TIYandexMapUtils' - s.version = '1.50.0' + s.version = '1.51.0' s.summary = 'Set of helpers for map objects clustering and interacting using Yandex Maps SDK.' s.homepage = 'https://git.svc.touchin.ru/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/project-scripts/push_to_podspecs.sh b/project-scripts/push_to_podspecs.sh index 2bb93d07..7551756b 100755 --- a/project-scripts/push_to_podspecs.sh +++ b/project-scripts/push_to_podspecs.sh @@ -9,14 +9,23 @@ # Required environment variables: # SRCROOT - path to project folder. # +# Optional environment variables: +# MODULE_NAME - single module to push +# # Examples of usage: # SRCROOT=`pwd` ./project-scripts/push_to_podspecs.sh # -for module_name in $(cat ${SRCROOT}/project-scripts/ordered_modules_list.txt); do - bundle exec pod repo push https://git.svc.touchin.ru/TouchInstinct/Podspecs ${SRCROOT}/${module_name}/${module_name}.podspec "$@" --allow-warnings - - if [ $? -ne 0 ]; then - exit $? - fi -done +GIT_REPO_PATH="github.com:petropavel13/TestPodspecs" + +if [ -z "${MODULE_NAME}" ]; then + for module_name in $(cat ${SRCROOT}/project-scripts/ordered_modules_list.txt); do + bundle exec pod repo push "git@${GIT_REPO_PATH}.git" ${SRCROOT}/${module_name}/${module_name}.podspec "$@" --allow-warnings + + if [ $? -ne 0 ]; then + exit $? + fi + done +else + bundle exec pod repo push "git@${GIT_REPO_PATH}.git" ${SRCROOT}/${MODULE_NAME}/${MODULE_NAME}.podspec "$@" --allow-warnings +fi -- 2.40.1 From 13a5925443c9d3adead97f363e8496a482ca0383 Mon Sep 17 00:00:00 2001 From: Ivan Smolin Date: Fri, 28 Jul 2023 16:08:35 +0300 Subject: [PATCH 13/13] fix: review notes --- .../Contents.swift | 55 ++++++++----------- .../Containers/ContainerScrollView.swift | 2 +- docs/tibottomsheet/tibottomsheet.md | 53 +++++++----------- project-scripts/push_to_podspecs.sh | 2 +- 4 files changed, 47 insertions(+), 65 deletions(-) diff --git a/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/Pages/TIBottomSheet.xcplaygroundpage/Contents.swift b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/Pages/TIBottomSheet.xcplaygroundpage/Contents.swift index 3892076c..0813f0d0 100644 --- a/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/Pages/TIBottomSheet.xcplaygroundpage/Contents.swift +++ b/TIBottomSheet/TIBottomSheet.app/Contents/MacOS/TIBottomSheet.playground/Pages/TIBottomSheet.xcplaygroundpage/Contents.swift @@ -47,22 +47,18 @@ class PresentingViewController: BaseInitializableViewController { Вот пример настройки внешнего вида так, чтобы был видет dragView и headerView с левой кнопкой: */ -class CustomViewController: BaseModalViewController { - override var viewControllerAppearance: BaseAppearance { - let appearance = super.viewControllerAppearance - appearance.dragViewState = .presented(.defaultAppearance) - appearance.headerViewState = .presented(.make { - $0.layout.size = .fixedHeight(52) - $0.backgroundColor = .white - $0.contentViewState = .buttonLeft(.init(titles: [.normal: "Close"], - appearance: .init(stateAppearances: [ - .normal: .init(backgroundColor: .blue) - ]))) - }) - - return appearance - } +let customViewController = BaseModalViewController() +customViewController.viewControllerAppearance = BaseModalViewController.DefaultAppearance.make { + $0.dragViewState = .presented(.defaultAppearance) + $0.headerViewState = .presented(.make { + $0.layout.size = .fixedHeight(52) + $0.backgroundColor = .white + $0.contentViewState = .buttonLeft(.init(titles: [.normal: "Close"], + appearance: .init(stateAppearances: [ + .normal: .init(backgroundColor: .blue) + ]))) + }) } /*: @@ -70,11 +66,10 @@ class CustomViewController: BaseModalViewController { Раньше для настройки высоты контроллера необходимо было пользоваться свойствами `longFormHeight`, `shortFormHeight`. В базовом контроллере можно лишь передать список точек на которых контроллер должен будет задержаться: */ -class DetentsViewController: BaseModalViewController { - override var presentationDetents: [ModalViewPresentationDetent] { - [.headerOnly, .height(300), .maxHeight] - } -} + +let detentsViewController = BaseModalViewController() +detentsViewController.viewControllerAppearance.presentationDetents = [.headerOnly, .height(300), .maxHeight] + /*: - headerOnly будет сам пытаться вычеслить высоту хедера и dragView, показывая только их - height(_) будет показывать контроллер на переданной высоте @@ -86,24 +81,22 @@ class DetentsViewController: BaseModalViewController { Для контроля `DimmedView` (затемняющей view) есть отдельное свойство `dimmedView`. Эти классы позволяют настраивать поведение при тапе в затемнённую область и кастомизировать затемнение под ваши нужды. */ -class ShadowViewController: BaseModalViewController { - override var dimmedView: DimmedView? { - let dimmedView = PassthroughDimmedView() - dimmedView.hitTestHandlerView = view - dimmedView.configureUIView(appearance: .init(shadow: UIViewShadow(radius: 8, - color: .black, - opacity: 0.3)) - return dimmedView - } -} +let shadowViewController = BaseModalViewController() +let dimmedView = PassthroughDimmedView() +dimmedView.hitTestHandlerView = view +dimmedView.configureUIView(appearance: .init(shadow: UIViewShadow(radius: 8, + color: .black, + opacity: 0.3))) + +shadowViewController.dimmedView = dimmedView /*: ## Контроль закрытия `PanModalPresentable` не умеет в настройку закрытия контроллера, делая это самостоятельно через `dismiss(animated:completion:)`. Теперь можно настроить закрытие самостоятельно через свойства: `onTapToDismiss` и `onDragToDismiss`. - # Взаимедействие с PanModal + # Взаимодействие с PanModal Если нет необходимости или возможности использовать `BaseModalViewController`, вы все так же можете пользоваться протоколом `PanModalRepresentable`. Вот список изменений протокола: diff --git a/TIUIElements/Sources/Wrappers/Containers/ContainerScrollView.swift b/TIUIElements/Sources/Wrappers/Containers/ContainerScrollView.swift index fda07019..29e353ee 100644 --- a/TIUIElements/Sources/Wrappers/Containers/ContainerScrollView.swift +++ b/TIUIElements/Sources/Wrappers/Containers/ContainerScrollView.swift @@ -65,7 +65,7 @@ open class ContainerScrollView: BaseInitializeableScrollVie } extension ContainerScrollView: AppearanceConfigurable where View: AppearanceConfigurable, - View.Appearance: WrappedViewAppearance { + View.Appearance: WrappedViewAppearance { public func configure(appearance: DefaultWrappedViewHolderAppearance) { configureWrappedViewHolder(appearance: appearance) diff --git a/docs/tibottomsheet/tibottomsheet.md b/docs/tibottomsheet/tibottomsheet.md index 251cf60e..2e7e2173 100644 --- a/docs/tibottomsheet/tibottomsheet.md +++ b/docs/tibottomsheet/tibottomsheet.md @@ -49,22 +49,17 @@ class PresentingViewController: BaseInitializableViewController { Вот пример настройки внешнего вида так, чтобы был видет dragView и headerView с левой кнопкой: ```swift -class CustomViewController: BaseModalViewController { - override var viewControllerAppearance: BaseAppearance { - let appearance = super.viewControllerAppearance - - appearance.dragViewState = .presented(.defaultAppearance) - appearance.headerViewState = .presented(.make { - $0.layout.size = .fixedHeight(52) - $0.backgroundColor = .white - $0.contentViewState = .buttonLeft(.init(titles: [.normal: "Close"], - appearance: .init(stateAppearances: [ - .normal: .init(backgroundColor: .blue) - ]))) - }) - - return appearance - } +let customViewController = BaseModalViewController() +customViewController.viewControllerAppearance = BaseModalViewController.DefaultAppearance.make { + $0.dragViewState = .presented(.defaultAppearance) + $0.headerViewState = .presented(.make { + $0.layout.size = .fixedHeight(52) + $0.backgroundColor = .white + $0.contentViewState = .buttonLeft(.init(titles: [.normal: "Close"], + appearance: .init(stateAppearances: [ + .normal: .init(backgroundColor: .blue) + ]))) + }) } ``` @@ -73,11 +68,8 @@ class CustomViewController: BaseModalViewController { Раньше для настройки высоты контроллера необходимо было пользоваться свойствами `longFormHeight`, `shortFormHeight`. В базовом контроллере можно лишь передать список точек на которых контроллер должен будет задержаться: ```swift -class DetentsViewController: BaseModalViewController { - override var presentationDetents: [ModalViewPresentationDetent] { - [.headerOnly, .height(300), .maxHeight] - } -} +let detentsViewController = BaseModalViewController() +detentsViewController.viewControllerAppearance.presentationDetents = [.headerOnly, .height(300), .maxHeight] ``` - headerOnly будет сам пытаться вычеслить высоту хедера и dragView, показывая только их @@ -91,24 +83,21 @@ class DetentsViewController: BaseModalViewController { Для контроля `DimmedView` (затемняющей view) есть отдельное свойство `dimmedView`. Эти классы позволяют настраивать поведение при тапе в затемнённую область и кастомизировать затемнение под ваши нужды. ```swift -class ShadowViewController: BaseModalViewController { - override var dimmedView: DimmedView? { - let dimmedView = PassthroughDimmedView() - dimmedView.hitTestHandlerView = view - dimmedView.configureUIView(appearance: .init(shadow: UIViewShadow(radius: 8, - color: .black, - opacity: 0.3)) +let shadowViewController = BaseModalViewController() +let dimmedView = PassthroughDimmedView() +dimmedView.hitTestHandlerView = view +dimmedView.configureUIView(appearance: .init(shadow: UIViewShadow(radius: 8, + color: .black, + opacity: 0.3))) - return dimmedView - } -} +shadowViewController.dimmedView = dimmedView ``` ## Контроль закрытия `PanModalPresentable` не умеет в настройку закрытия контроллера, делая это самостоятельно через `dismiss(animated:completion:)`. Теперь можно настроить закрытие самостоятельно через свойства: `onTapToDismiss` и `onDragToDismiss`. -# Взаимедействие с PanModal +# Взаимодействие с PanModal Если нет необходимости или возможности использовать `BaseModalViewController`, вы все так же можете пользоваться протоколом `PanModalRepresentable`. Вот список изменений протокола: diff --git a/project-scripts/push_to_podspecs.sh b/project-scripts/push_to_podspecs.sh index 7551756b..0c3a95d1 100755 --- a/project-scripts/push_to_podspecs.sh +++ b/project-scripts/push_to_podspecs.sh @@ -16,7 +16,7 @@ # SRCROOT=`pwd` ./project-scripts/push_to_podspecs.sh # -GIT_REPO_PATH="github.com:petropavel13/TestPodspecs" +GIT_REPO_PATH="git.svc.touchin.ru/TouchInstinct/Podspecs" if [ -z "${MODULE_NAME}" ]; then for module_name in $(cat ${SRCROOT}/project-scripts/ordered_modules_list.txt); do -- 2.40.1