Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Style] 바텀시트 제스처 따라 수정 #59

Open
wants to merge 4 commits into
base: juri
Choose a base branch
from

Conversation

hooni0918
Copy link
Collaborator

🔗 연결된 이슈

📄 작업 내용

  • 바텀시트 스크롤 영역따라 같이 올라가고 내려가기
  • 하단영역 여백 추가하여 맞추기
구현 내용 IPhone 15 pro IPhone SE
GIF

💻 주요 코드 설명

코드 설명할 파일 이름 (ex: HomeView)

  • 어쩌구저쩌구
.background(
                                    GeometryReader { itemGeometry in
                                        Color.clear.onAppear {
                                            if index == 0 {
                                                firstItemFrame = itemGeometry.frame(in: .named("scrollView"))
                                            }
                                        }
                                        .onChange(of: itemGeometry.frame(in: .named("scrollView"))) { _, newFrame in
                                            if index == 0 {
                                                firstItemFrame = newFrame
                                                
                                                // 첫 번째 셀의 위치에 따라 바텀시트 상태 변경
                                                let threshold: CGFloat = -30
                                                if newFrame.minY < threshold && currentStyle == .half {
                                                    withAnimation(.spring(response: 0.3, dampingFraction: 0.7)) {
                                                        currentStyle = .full
                                                    }
                                                } else if newFrame.minY > threshold && currentStyle == .full {
                                                    withAnimation(.spring(response: 0.3, dampingFraction: 0.7)) {
                                                        currentStyle = .half
                                                    }
                                                }
                                            }
                                        }
                                    }
                                )
                                Divider()
                            }
                        }
                        Color.clear.frame(height: 90)

첫 번째 셀의 위치를 지속적으로 모니터링
스크롤에 따른 셀의 위치 변화를 감지
위치에 따라 바텀시트의 상태(full/half)를 자동으로 전환

👀 기타 더 이야기해볼 점

현재 gif에는 16프로에서 약간 이상하게 나오는데 실제 실행시 추가 여백을 두어서 정상동작합니다.

@hooni0918 hooni0918 added feat 기능구현시 사용 Jihoon 나는지훈 labels Jan 15, 2025
@hooni0918 hooni0918 self-assigned this Jan 15, 2025
Copy link
Collaborator

@juri123123 juri123123 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

궁금해요

Comment on lines +110 to +111
VStack(spacing: 0) {
LazyVStack(spacing: 0) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

VStack 안에 LazyVStack을 넣은 이유가 있을까요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

다시 찾아보니 LazyStack으로 한번에 다 할수 있는거군요? 저는 원래 이렇게 사용해야한는줄 알앗어요ㅠ

@@ -177,6 +206,12 @@ struct BottomSheetListView: View {
}
}

struct ScrollOffsetPreferenceKey: PreferenceKey {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 친구가 하는 역할이 뭔가요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

원래 스크롤 오프셋 따라 0번째 셀의 위치를 조정햇었는데 현재는 geometry로 조정중이여서 필요없는 코드가 맞습니다

Comment on lines +109 to +146
ScrollView(showsIndicators: false) {
VStack(spacing: 0) {
LazyVStack(spacing: 0) {
ForEach(0..<20) { index in
BottomSheetListItem(
title: "상호명",
subTitle: "주소",
cellTitle: "제목 셀",
hasChip: true
)
.background(
GeometryReader { itemGeometry in
Color.clear.onAppear {
if index == 0 {
firstItemFrame = itemGeometry.frame(in: .named("scrollView"))
}
}
.onChange(of: itemGeometry.frame(in: .named("scrollView"))) { _, newFrame in
if index == 0 {
firstItemFrame = newFrame

// 첫 번째 셀의 위치에 따라 바텀시트 상태 변경
let threshold: CGFloat = -30
if newFrame.minY < threshold && currentStyle == .half {
withAnimation(.spring(response: 0.3, dampingFraction: 0.7)) {
currentStyle = .full
}
} else if newFrame.minY > threshold && currentStyle == .full {
withAnimation(.spring(response: 0.3, dampingFraction: 0.7)) {
currentStyle = .half
}
}
}
}
}
)
Divider()
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

style이 minimal 일 때는 List를 올리면 같이 올라가는데, half 일 때 List를 올리면 안 올라갑니다.
일부러 의도하신 부분 이신가요~?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

제가 의도한건 이게 맞긴합니다. 그런데 기획과 상의가 있어야 할것같아요 상의후 다시 말씀드리겟습니다

}
Color.clear.frame(height: 90)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

adjust 해주세요!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feat 기능구현시 사용 Jihoon 나는지훈
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[Style] 상단 네비게이션 부착
3 participants