Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions vien/VienStarbucks/VienStarbucks.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -329,6 +329,7 @@
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_ASSET_PATHS = "\"VienStarbucks/Preview Content\"";
DEVELOPMENT_TEAM = VRLZVZ52F5;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = VienStarbucks/Info.plist;
Expand Down Expand Up @@ -358,6 +359,7 @@
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_ASSET_PATHS = "\"VienStarbucks/Preview Content\"";
DEVELOPMENT_TEAM = VRLZVZ52F5;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = VienStarbucks/Info.plist;
Expand Down
68 changes: 68 additions & 0 deletions vien/VienStarbucks/VienStarbucks/Pay/CustomPagingSlider.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
// CustomPagingSlider.swift
// CustomSlider
//
// Created by 이은정 on 5/31/25.
//

import SwiftUI

//Paging Slider Data Model
struct Item: Identifiable {
private(set) var id: UUID = .init()
var color: Color
var title: String
var subtitle: String
}


//Content View
struct CustomPagingSlider<Content: View, TitleContent: View, Item:RandomAccessCollection>: View where Item: MutableCollection, Item.Element: Identifiable {
// Customization Properties
var showsIndicators: ScrollIndicatorVisibility = .hidden
var showPagingControl: Bool = true
var titleScrollSpeed : CGFloat = 0.6
var pagingControlSpacing: CGFloat = 20
var spacing: CGFloat = 10

@Binding var data: Item
@ViewBuilder var content: (Binding<Item.Element>) -> Content
@ViewBuilder var titleContent: (Binding<Item.Element>) -> TitleContent
var body: some View {

VStack(spacing: pagingControlSpacing){
ScrollView(.horizontal){
HStack(spacing: spacing) {
ForEach($data) { item in
VStack(spacing: 0) {
titleContent(item)
// .frame(maxWidth: .infinity)
// .visualEffect { content, geometryProxy in content
// .offset(x: scrollOffset(geometryProxy))
// }

content(item)
}
.containerRelativeFrame(.horizontal)
}
}

}
///Adding Paging
.scrollTargetLayout()
}
.scrollIndicators(showsIndicators)
.scrollTargetBehavior(.viewAligned)
}


// func scrollOffset(_ proxy: GeometryProxy) -> CGFloat {
// let minX = proxy.bounds(of: .scrollView)?.minX ?? 0
//
// return -minX * min(titleScrollSpeed, 1.0)
// }
}


#Preview {
ContentView()
}
10 changes: 10 additions & 0 deletions vien/VienStarbucks/VienStarbucks/Pay/PayModel.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import SwiftUI

struct PayModel: Identifiable {
let id = UUID()
var cardName: String
var balance: Int
var cardNumber: String
var expireTime: String
var imageName: String
}
48 changes: 48 additions & 0 deletions vien/VienStarbucks/VienStarbucks/Pay/PayView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import SwiftUI

struct PayView: View {
@StateObject private var viewModel = PayViewModel()

var body: some View {
VStack(alignment: .leading, spacing: 20) {
Text("Pay")
.font(.largeTitle.bold())
.padding(.leading, 20)

CustomPagingSlider(data: $viewModel.cards) { $item in
Image(item.imageName)
.resizable()
.scaledToFit()
.frame(width: 250, height: 150)
.cornerRadius(10)
} titleContent: { $item in
VStack(spacing: 8) {
Text(item.cardName)
.font(.subheadline)
.foregroundColor(.gray)

Text("\(item.balance)원")
.font(.title2.bold())

Text(item.cardNumber)
.font(.caption)
.foregroundColor(.gray)

Text("μΉ΄λ“œ 유효 μ‹œκ°„ \(item.expireTime)")
.font(.caption2)
.foregroundColor(.green)
}
.frame(maxWidth: .infinity)
}
.frame(height: 260)
.padding(.horizontal)

Spacer()
}
.padding(.top)
}
}

#Preview {
PayView()
}
8 changes: 8 additions & 0 deletions vien/VienStarbucks/VienStarbucks/Pay/PayViewModel.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import SwiftUI

class PayViewModel: ObservableObject {
@Published var cards: [PayModel] = [
PayModel(cardName: "μ•„λ¬΄μΉ΄λ“œ A", balance: 999, cardNumber: "****-****-1234", expireTime: "03:00", imageName: "pay/StarbucksCard"),
PayModel(cardName: "μ•„λ¬΄μΉ΄λ“œ B", balance: 10000, cardNumber: "****-****-5678", expireTime: "04:00", imageName: "pay/StarbucksCard")
]
}
30 changes: 30 additions & 0 deletions vien/VienStarbucks/VienStarbucks/Shop/OffsetModifier.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import SwiftUI

struct OffsetModifier: ViewModifier {
@Binding var offset: CGFloat
var returnromStart: Bool = true
@State private var startValue: CGFloat = 0

func body(content: Content) -> some View {
content
.overlay(
GeometryReader { proxy in
Color.clear
.preference(key: OffsetKey.self, value: proxy.frame(in: .named("SCROLL")).minY)
.onPreferenceChange(OffsetKey.self) { value in
if startValue == 0 {
startValue = value
}
offset = value - (returnromStart ? startValue : 0)
}
}
)
}
}

struct OffsetKey: PreferenceKey {
static var defaultValue: CGFloat = 0
static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) {
value = nextValue()
}
}
Loading