forXifLess / LinkNavigator

🌊 Easy & Powerful navigation library in SwiftUI
Other
397 stars 29 forks source link

feat: Added detent sheet #43

Closed WallabyStuff closed 2 months ago

WallabyStuff commented 2 months ago

Sheet에 detent를 설정할 수 있는 옵션을 추가하였습니다.

사용방법은 LinkNavigatorProtocol > detentSheet() 또는 SingleLinkNavigator > _detentSheet() 의 주석 도큐멘트에서 확인할 수 있습니다.

또한 01-SingleBasic 예제의 HomeView에서 아래와 같이 사용 예제를 확인할 수 있습니다.

      Button(action: {
        if #available(iOS 15.0, *) {
          navigator.detentSheet(
            linkItem: .init(pathList: ["page1", "page2"]),
            isAnimated: true,
            detents: [.medium(), .large()],
            cornerRadius: 24,
            largestUndimmedDetentIdentifier: .none,
            prefersScrollingExpandsWhenScrolledToEdge: true,
            prefersGrabberVisible: false,
            prefersEdgeAttachedInCompactHeight: true,
            widthFollowsPreferredContentSizeWhenEdgeAttached: false,
            selectedDetentIdentifier: .none)
        } else {
          navigator.sheet(linkItem: .init(pathList: ["page1", "page2"]), isAnimated: true)
        }
      }) {
        Text("open Page 2 as Detent Sheet")
          .foregroundColor(.purple)
      }


01-SingleBasic 동작 예시

detented_sheet


도전과제

코드에서 보시다시피 detentSheet은 detent에서 사용할 수 있는 옵션을 많은 파라미터로 받고있습니다. 그러나 꼭 필요하지 않은 옵션이 많아서 default value를 제공하는 편이 LinkNavigator를 사용하는 클라이언트 입장에서 사용성 증대 및 혼동을 피할 수 있지 않을까 생각합니다. 하지만 parameter default value를 제공하기 위해서 detentSheet만 LinkNavigatorProtocol을 extension 하여 제공하기에 기존 protocol에 정의된 함수들에 대한 default value 제공 일관성을 해 하는 것 같아서 유지보수 측면에서도 고려해 보아야 할 사항 같습니다.

WallabyStuff commented 2 months ago

마지막 도전과제에 대한 추가 의견 남깁니다.

기존에 LinkNavigatorType에서 path와 item을 따로 받았던 것을 LinkNavigatorProtocol 에서 item을 optional로 받을 수 있게 LinkItem 이라는 구조체로 캡슐화 하는 방식으로 변경했던 것처럼 Detent에 사용되는 option들도 DetentOption 이란 구조체로 캡슐화해서 불필요한 옵션들을 생략할 수 있도록 제공할 수 있을것 같다는 생각이 문득 듭니다.

어떻게 생각하시나요?

interactord commented 2 months ago

보내주신 아이디어에 매우 놀랍고.. 굉장합니다.

파라미터가 많은 부분에 있어서 고민하는 부분으로서는 저도 매우 공감이 가는군요...

고민의 대한 한가지 아이디어와 제안이 있습니다.

아이디어는 다음과 같습니다.

detentSheet: DetentSheetType 이러게.. 하나의 Struct로 뺴면 어떨까 합니다.

navigator.detentSheet( linkItem: .init(pathList: ["page1", "page2"]), isAnimated: true, configuration: DetentSheetConfiguration = .default)

이부분에 대해서.. @WallabyStuff 님의 생각은 어떠신가요?

WallabyStuff commented 2 months ago

사용하는 입장에서 훨씬 직관적이고 명료한 것 같네요! 너무 좋은 아이디어 같습니다👍

제안해 주신대로 수정해서 다시 올려볼게요!

(남은 추석 즐거운 시간 되세요~😆)

interactord commented 2 months ago

잘부탁드립니다. 🙇🏻

WallabyStuff commented 2 months ago

@interactord amend 하여 변경사항 적용했습니다! 시간 괜찮으실 때 확인 한 번 부탁드려요 🙏

interactord commented 2 months ago

감사합니다.

머지관련사항은 금주내로 처리하도록 하겠습니다.

감사합니다. 🙏