Skip to content

Commit 1c17972

Browse files
committed
[CM-1261] Add option to disable dismiss UI.
1 parent 0f9dd2b commit 1c17972

File tree

7 files changed

+108
-64
lines changed

7 files changed

+108
-64
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
//
2+
// BottomSheetController.swift
3+
// YBottomSheet
4+
//
5+
// Created by Dev Karan on 22/31/23.
6+
// Copyright © 2023 Y Media Labs. All rights reserved.
7+
//
8+
9+
import UIKit
10+
11+
extension BottomSheetController: UIViewControllerTransitioningDelegate {
12+
/// Returns the animator for presenting a bottom sheet
13+
public func animationController(
14+
forPresented presented: UIViewController,
15+
presenting: UIViewController,
16+
source: UIViewController
17+
) -> UIViewControllerAnimatedTransitioning? {
18+
BottomSheetPresentAnimator(sheetViewController: self)
19+
}
20+
21+
/// Returns the animator for dismissing a bottom sheet
22+
public func animationController(
23+
forDismissed dismissed: UIViewController
24+
) -> UIViewControllerAnimatedTransitioning? {
25+
BottomSheetDismissAnimator(sheetViewController: self)
26+
}
27+
}

Sources/YBottomSheet/BottomSheetController+Appearance.swift

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ extension BottomSheetController {
3232
///
3333
/// Only applicable for resizable sheets. `nil` means to use the content view's intrinsic height as the minimum.
3434
public var minimumContentHeight: CGFloat?
35-
35+
/// Whether the sheet is dismissible or not. Default is `true`.
36+
public var allowDismiss: Bool
37+
3638
/// Default appearance (fixed size sheet)
3739
public static let `default` = Appearance()
3840
/// Default appearance for a resizable sheet
@@ -49,6 +51,7 @@ extension BottomSheetController {
4951
/// - presentAnimationCurve: Animaiton during presenting.
5052
/// - dismissAnimationCurve: Animation during dismiss.
5153
/// - minimumContentHeight: Optional) Minimum content view height.
54+
/// - allowDismiss: Whether the sheet is dismissible or not.
5255
public init(
5356
indicatorAppearance: DragIndicatorView.Appearance? = nil,
5457
headerAppearance: SheetHeaderView.Appearance? = .default,
@@ -58,7 +61,8 @@ extension BottomSheetController {
5861
animationDuration: TimeInterval = 0.3,
5962
presentAnimationCurve: UIView.AnimationOptions = .curveEaseIn,
6063
dismissAnimationCurve: UIView.AnimationOptions = .curveEaseOut,
61-
minimumContentHeight: CGFloat? = nil
64+
minimumContentHeight: CGFloat? = nil,
65+
allowDismiss: Bool = true
6266
) {
6367
self.indicatorAppearance = indicatorAppearance
6468
self.headerAppearance = headerAppearance
@@ -69,6 +73,7 @@ extension BottomSheetController {
6973
self.presentAnimationCurve = presentAnimationCurve
7074
self.dismissAnimationCurve = dismissAnimationCurve
7175
self.minimumContentHeight = minimumContentHeight
76+
self.allowDismiss = allowDismiss
7277
}
7378
}
7479
}

Sources/YBottomSheet/BottomSheetController.swift

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,14 @@ public class BottomSheetController: UIViewController {
149149
didDismiss()
150150
return true
151151
}
152+
153+
/// Dismiss bottom sheet.
154+
/// - Parameter isCloseButton: whether close button is tapped or not.
155+
func didDismiss(isCloseButton: Bool = false) {
156+
if appearance.allowDismiss || isCloseButton {
157+
onDismiss()
158+
}
159+
}
152160
}
153161

154162
private extension BottomSheetController {
@@ -308,8 +316,8 @@ private extension BottomSheetController {
308316

309317
extension BottomSheetController: SheetHeaderViewDelegate {
310318
@objc
311-
func didDismiss() {
312-
onDismiss()
319+
func didCloseTapped() {
320+
didDismiss(isCloseButton: true)
313321
}
314322
}
315323

@@ -352,24 +360,6 @@ private extension BottomSheetController {
352360
}
353361
}
354362

355-
extension BottomSheetController: UIViewControllerTransitioningDelegate {
356-
/// Returns the animator for presenting a bottom sheet
357-
public func animationController(
358-
forPresented presented: UIViewController,
359-
presenting: UIViewController,
360-
source: UIViewController
361-
) -> UIViewControllerAnimatedTransitioning? {
362-
BottomSheetPresentAnimator(sheetViewController: self)
363-
}
364-
365-
/// Returns the animator for dismissing a bottom sheet
366-
public func animationController(
367-
forDismissed dismissed: UIViewController
368-
) -> UIViewControllerAnimatedTransitioning? {
369-
BottomSheetDismissAnimator(sheetViewController: self)
370-
}
371-
}
372-
373363
// Methods for unit testing
374364
internal extension BottomSheetController {
375365
@objc
@@ -392,6 +382,6 @@ internal extension BottomSheetController {
392382

393383
@objc
394384
func simulateDismiss() {
395-
didDismiss()
385+
didCloseTapped()
396386
}
397387
}

Sources/YBottomSheet/Protocols/SheetHeaderViewDelegate.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@
99
import Foundation
1010

1111
internal protocol SheetHeaderViewDelegate: AnyObject {
12-
func didDismiss()
12+
func didCloseTapped()
1313
}

Sources/YBottomSheet/SheetHeaderView/SheetHeaderView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ open class SheetHeaderView: UIView {
5151
required public init?(coder: NSCoder) { nil }
5252

5353
@objc private func closeButtonAction() {
54-
delegate?.didDismiss()
54+
delegate?.didCloseTapped()
5555
}
5656

5757
// For unit testing

Tests/YBottomSheetTests/BottomSheetControllerTests.swift

Lines changed: 60 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -130,40 +130,6 @@ final class BottomSheetControllerTests: XCTestCase {
130130
XCTAssertTrue(sut.indicatorContainer.isHidden)
131131
XCTAssertFalse(sut.isResizable)
132132
}
133-
134-
func test_onDimmer() {
135-
let sut = SpyBottomSheetController(title: "", childView: UIView())
136-
137-
XCTAssertFalse(sut.onDimmerTapped)
138-
XCTAssertFalse(sut.isDismissed)
139-
140-
sut.simulateOnDimmerTap()
141-
142-
XCTAssertTrue(sut.onDimmerTapped)
143-
XCTAssertTrue(sut.isDismissed)
144-
}
145-
146-
func test_onSwipeDown() {
147-
let sut = SpyBottomSheetController(title: "", childView: UIView())
148-
149-
XCTAssertFalse(sut.onSwipeDown)
150-
XCTAssertFalse(sut.isDismissed)
151-
152-
sut.simulateOnSwipeDown()
153-
154-
XCTAssertTrue(sut.onSwipeDown)
155-
XCTAssertTrue(sut.isDismissed)
156-
}
157-
158-
func test_onDidDismiss() {
159-
let sut = SpyBottomSheetController(title: "", childView: UIView())
160-
161-
XCTAssertFalse(sut.isDismissed)
162-
163-
sut.simulateDismiss()
164-
165-
XCTAssertTrue(sut.isDismissed)
166-
}
167133

168134
func test_dragging_worksIfResizable() {
169135
let sut = SpyBottomSheetController(title: "", childView: ChildView(), appearance: .defaultResizable)
@@ -324,6 +290,56 @@ final class BottomSheetControllerTests: XCTestCase {
324290
}
325291
}
326292

293+
extension BottomSheetControllerTests {
294+
func test_onDimmer() {
295+
let sut = SpyBottomSheetController(title: "", childView: UIView())
296+
297+
XCTAssertFalse(sut.onDimmerTapped)
298+
XCTAssertFalse(sut.isDismissed)
299+
300+
sut.simulateOnDimmerTap()
301+
302+
XCTAssertTrue(sut.onDimmerTapped)
303+
XCTAssertTrue(sut.isDismissed)
304+
}
305+
306+
func test_onSwipeDown() {
307+
let sut = SpyBottomSheetController(title: "", childView: UIView())
308+
309+
XCTAssertFalse(sut.onSwipeDown)
310+
XCTAssertFalse(sut.isDismissed)
311+
312+
sut.simulateOnSwipeDown()
313+
314+
XCTAssertTrue(sut.onSwipeDown)
315+
XCTAssertTrue(sut.isDismissed)
316+
}
317+
318+
func test_onDidDismiss() {
319+
let sut = SpyBottomSheetController(title: "", childView: UIView())
320+
321+
XCTAssertFalse(sut.isDismissed)
322+
323+
sut.simulateDismiss()
324+
325+
XCTAssertTrue(sut.isDismissed)
326+
}
327+
328+
func test_forbidDismiss() {
329+
let sut = SpyBottomSheetController(title: "", childView: UIView())
330+
sut.appearance.allowDismiss = false
331+
332+
XCTAssertFalse(sut.onSwipeDown)
333+
XCTAssertFalse(sut.onDimmerTapped)
334+
335+
sut.simulateOnDimmerTap()
336+
sut.simulateOnSwipeDown()
337+
338+
XCTAssertFalse(sut.onSwipeDown)
339+
XCTAssertFalse(sut.onDimmerTapped)
340+
}
341+
}
342+
327343
private extension BottomSheetControllerTests {
328344
func makeSUT(
329345
viewController: UIViewController,
@@ -368,19 +384,25 @@ final class SpyBottomSheetController: BottomSheetController {
368384
var onDimmerTapped = false
369385
var onDragging = false
370386

371-
override func didDismiss() {
387+
override func didDismiss(isCloseButton: Bool) {
372388
super.didDismiss()
373-
isDismissed = true
389+
if isCloseButton || appearance.allowDismiss {
390+
isDismissed = true
391+
}
374392
}
375393

376394
override func simulateOnSwipeDown() {
377395
super.simulateOnSwipeDown()
378-
onSwipeDown = true
396+
if appearance.allowDismiss {
397+
onSwipeDown = true
398+
}
379399
}
380400

381401
override func simulateOnDimmerTap() {
382402
super.simulateOnDimmerTap()
383-
onDimmerTapped = true
403+
if appearance.allowDismiss {
404+
onDimmerTapped = true
405+
}
384406
}
385407

386408
@discardableResult

Tests/YBottomSheetTests/SheetHeaderView/SheetHeaderViewTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ private extension SheetHeaderViewTests {
9191
}
9292

9393
extension SheetHeaderViewTests: SheetHeaderViewDelegate {
94-
func didDismiss() {
94+
func didCloseTapped() {
9595
isDismissed = true
9696
}
9797
}

0 commit comments

Comments
 (0)