[✨] 메인의 위/아래 바 구현
13
.idea/.gitignore
vendored
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
|
# Rider ignored files
|
||||||
|
/contentModel.xml
|
||||||
|
/projectSettingsUpdater.xml
|
||||||
|
/.idea.AcaMate_iOS.iml
|
||||||
|
/modules.xml
|
||||||
|
# Editor-based HTTP Client requests
|
||||||
|
/httpRequests/
|
||||||
|
# Datasource local storage ignored files
|
||||||
|
/dataSources/
|
||||||
|
/dataSources.local.xml
|
8
.idea/indexLayout.xml
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="UserContentModel">
|
||||||
|
<attachedFolders />
|
||||||
|
<explicitIncludes />
|
||||||
|
<explicitExcludes />
|
||||||
|
</component>
|
||||||
|
</project>
|
6
.idea/vcs.xml
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="" vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
BIN
AcaMate.xcodeproj/project.xcworkspace/xcuserdata/tanine.xcuserdatad/UserInterfaceState.xcuserstate
generated
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Bucket
|
||||||
|
uuid = "800DD51A-C089-4DC4-AE55-7F5ABD5C0AE7"
|
||||||
|
type = "1"
|
||||||
|
version = "2.0">
|
||||||
|
</Bucket>
|
|
@ -1,57 +0,0 @@
|
||||||
//
|
|
||||||
// LoginView.swift
|
|
||||||
// AcaMate
|
|
||||||
//
|
|
||||||
// Created by Sean Kim on 12/1/24.
|
|
||||||
//
|
|
||||||
|
|
||||||
import SwiftUI
|
|
||||||
|
|
||||||
struct LoginView: View {
|
|
||||||
@EnvironmentObject var alertController: AlertController
|
|
||||||
@Binding var naviState : NaviState
|
|
||||||
|
|
||||||
var body: some View {
|
|
||||||
VStack(spacing: 0) {
|
|
||||||
Image("Team_Icon")
|
|
||||||
.resizable()
|
|
||||||
.frame(width: 200, height: 200)
|
|
||||||
.background(.white)
|
|
||||||
.border(.black)
|
|
||||||
.padding(.bottom, 84)
|
|
||||||
Button {
|
|
||||||
|
|
||||||
} label: {
|
|
||||||
HStack(spacing: 12) {
|
|
||||||
Image("Kakao_Icon")
|
|
||||||
.resizable()
|
|
||||||
.frame(width: 32, height: 32)
|
|
||||||
Text("카카오 계정으로 시작하기")
|
|
||||||
.font(.nps(font: .regular, size: 16))
|
|
||||||
.foregroundStyle(Color(.Text.black))
|
|
||||||
}
|
|
||||||
.padding(12)
|
|
||||||
.background {
|
|
||||||
RoundedRectangle(cornerRadius: 12)
|
|
||||||
.foregroundStyle(Color(.Other.yellow))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Button {
|
|
||||||
alertController.alertData = SetAlertData().setTest()
|
|
||||||
alertController.showAlert.toggle()
|
|
||||||
// naviState.set(act: .MOVE,path: .Intro)
|
|
||||||
|
|
||||||
} label: {
|
|
||||||
Text("111111111")
|
|
||||||
}
|
|
||||||
.padding()
|
|
||||||
}
|
|
||||||
.fullView(.Normal.normal)
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//#Preview {
|
|
||||||
// LoginView()
|
|
||||||
//}
|
|
|
@ -9,7 +9,7 @@ import SwiftUI
|
||||||
import Combine
|
import Combine
|
||||||
|
|
||||||
|
|
||||||
|
/// 이거 위에 다른 뷰들이 위젯 느낌으로 계속 갈아 끼워지는거
|
||||||
struct NavigationView: View {
|
struct NavigationView: View {
|
||||||
@State private var naviState : NaviState = .init(act: .NONE, path: .Intro)
|
@State private var naviState : NaviState = .init(act: .NONE, path: .Intro)
|
||||||
@State private var history: [PathName] = [.Intro]
|
@State private var history: [PathName] = [.Intro]
|
||||||
|
@ -25,7 +25,7 @@ struct NavigationView: View {
|
||||||
case .Login :
|
case .Login :
|
||||||
LoginView(naviState: $naviState)
|
LoginView(naviState: $naviState)
|
||||||
case .Main:
|
case .Main:
|
||||||
EmptyView()
|
MainView(naviState: $naviState)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.onChange(of: naviState) { old, new in
|
.onChange(of: naviState) { old, new in
|
||||||
|
@ -41,30 +41,33 @@ struct NavigationView: View {
|
||||||
case .MOVE:
|
case .MOVE:
|
||||||
moveHistory(path: new.path)
|
moveHistory(path: new.path)
|
||||||
}
|
}
|
||||||
|
|
||||||
// LOG
|
// LOG
|
||||||
printLog("\(old.path) => \(new.path)")
|
printLog("\(old.path) => \(new.path)")
|
||||||
showHistory()
|
showHistory()
|
||||||
}
|
}
|
||||||
.fullView(.Normal.normal)
|
.fullDrawView(.Normal.normal)
|
||||||
.setAlert()
|
.setAlert()
|
||||||
.setNetwork()
|
.setNetwork()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// 경로에 한 단계 추가
|
||||||
private func addHistory(path: PathName) {
|
private func addHistory(path: PathName) {
|
||||||
history.append(path)
|
history.append(path)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// 가장 가까운 경로 삭제
|
||||||
private func popHistory() {
|
private func popHistory() {
|
||||||
history.removeLast()
|
history.removeLast()
|
||||||
naviState.set(act: .NONE, path: history.last ?? .NONE)
|
naviState.set(act: .NONE, path: history.last ?? .NONE)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// 경로 기록 전체 삭제
|
||||||
private func resetHistory(path: PathName) {
|
private func resetHistory(path: PathName) {
|
||||||
history.removeAll()
|
history.removeAll()
|
||||||
addHistory(path: path)
|
addHistory(path: path)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// 경로의 최상단 지우고, 새로 이동하는 경로로 설정
|
||||||
private func moveHistory(path: PathName) {
|
private func moveHistory(path: PathName) {
|
||||||
if path == .NONE {
|
if path == .NONE {
|
||||||
naviState.set(act: .RESET, path: history.first ?? .Main)
|
naviState.set(act: .RESET, path: history.first ?? .Main)
|
|
@ -67,8 +67,6 @@ struct IntroView: View {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.store(in: &cancellables)
|
.store(in: &cancellables)
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,7 +76,8 @@ struct IntroView: View {
|
||||||
.sink { action in
|
.sink { action in
|
||||||
if action == "updateNow" {
|
if action == "updateNow" {
|
||||||
exit(1)
|
exit(1)
|
||||||
//MARK: - TODO (앱스토어 이동 로직 넣을 것)
|
// MARK: TO-DO
|
||||||
|
// (앱스토어 이동 로직 넣을 것)
|
||||||
} else {
|
} else {
|
||||||
naviState.set(act: .RESET, path: .Login)
|
naviState.set(act: .RESET, path: .Login)
|
||||||
}
|
}
|
93
AcaMate/1. View/11. Intro & Login/LoginView.swift
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
//
|
||||||
|
// LoginView.swift
|
||||||
|
// AcaMate
|
||||||
|
//
|
||||||
|
// Created by Sean Kim on 12/1/24.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
struct LoginView: View {
|
||||||
|
@EnvironmentObject var alertController: AlertController
|
||||||
|
@Binding var naviState : NaviState
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
VStack(spacing: 0) {
|
||||||
|
Image("Team_Icon")
|
||||||
|
.resizable()
|
||||||
|
.frame(maxWidth: 200, maxHeight: 200)
|
||||||
|
.frame(width: 200, height: 200)
|
||||||
|
.background(.white)
|
||||||
|
.border(.black)
|
||||||
|
.padding(.bottom, 84)
|
||||||
|
/// 앱 아이콘 이미지
|
||||||
|
|
||||||
|
VStack(spacing: 16) {
|
||||||
|
Button {
|
||||||
|
// MARK: TO-DO
|
||||||
|
// 카카오 로그인 연동
|
||||||
|
naviState.set(act: .MOVE, path: .Main)
|
||||||
|
} label: {
|
||||||
|
HStack(spacing: 24) {
|
||||||
|
Image("Kakao_Icon")
|
||||||
|
.resizable()
|
||||||
|
.frame(width: 32, height: 32)
|
||||||
|
Text("카카오 계정으로 시작하기")
|
||||||
|
.font(.nps(font: .regular, size: 16))
|
||||||
|
.foregroundStyle(Color(.Text.black))
|
||||||
|
}
|
||||||
|
.frame(maxWidth: .infinity)
|
||||||
|
.padding(12)
|
||||||
|
.background {
|
||||||
|
RoundedRectangle(cornerRadius: 12)
|
||||||
|
.foregroundStyle(Color(.Other.yellow))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.frame(maxWidth: .infinity)
|
||||||
|
/// KAKAO 로그인 버튼
|
||||||
|
|
||||||
|
Button {
|
||||||
|
// MARK: TO-DO
|
||||||
|
// 애플 로그인 연동
|
||||||
|
} label: {
|
||||||
|
HStack(spacing: 24) {
|
||||||
|
Image(systemName: "apple.logo")
|
||||||
|
.resizable()
|
||||||
|
.accentColor(Color(.Text.white))
|
||||||
|
.frame(width: 32, height: 32)
|
||||||
|
|
||||||
|
Text("애플 계정으로 시작하기")
|
||||||
|
.font(.nps(font: .regular, size: 16))
|
||||||
|
.foregroundStyle(Color(.Text.white))
|
||||||
|
}
|
||||||
|
.frame(maxWidth: .infinity)
|
||||||
|
.padding(12)
|
||||||
|
.background {
|
||||||
|
RoundedRectangle(cornerRadius: 12)
|
||||||
|
.foregroundStyle(Color(.Text.black))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.frame(maxWidth: .infinity)
|
||||||
|
/// APPLE 로그인 버튼
|
||||||
|
}
|
||||||
|
.padding([.leading,.trailing], 28)
|
||||||
|
/// 버튼 조합
|
||||||
|
|
||||||
|
// 삭제
|
||||||
|
// Button {
|
||||||
|
// alertController.alertData = SetAlertData().setTest()
|
||||||
|
// alertController.showAlert.toggle()
|
||||||
|
// // naviState.set(act: .MOVE,path: .Intro)
|
||||||
|
//
|
||||||
|
// } label: {
|
||||||
|
// Text("111111111")
|
||||||
|
// }
|
||||||
|
|
||||||
|
}
|
||||||
|
.fullDrawView(.Normal.normal)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//#Preview {
|
||||||
|
// LoginView()
|
||||||
|
//}
|
39
AcaMate/1. View/12. Main/121. Button/BoxBtnView.swift
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
//
|
||||||
|
// BoxBtnView.swift
|
||||||
|
// AcaMate
|
||||||
|
//
|
||||||
|
// Created by TAnine on 2/4/25.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
struct BoxBtnView<Content: View>: View {
|
||||||
|
let width: CGFloat
|
||||||
|
let height: CGFloat
|
||||||
|
let action: VOID_TO_VOID?
|
||||||
|
|
||||||
|
@ViewBuilder let content: Content
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
Button{
|
||||||
|
guard let action = action else { return }
|
||||||
|
action()
|
||||||
|
} label: {
|
||||||
|
content
|
||||||
|
// if let image = image {
|
||||||
|
// image
|
||||||
|
// .resizable()
|
||||||
|
// .frame(width: width, height: height)
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#Preview {
|
||||||
|
BoxBtnView(width: 40, height: 40, action: nil){
|
||||||
|
VStack {
|
||||||
|
Text("Test1")
|
||||||
|
Text("Test2")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
56
AcaMate/1. View/12. Main/121. Button/CircleBtnView.swift
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
//
|
||||||
|
// ButtonView.swift
|
||||||
|
// AcaMate
|
||||||
|
//
|
||||||
|
// Created by TAnine on 2/4/25.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
struct CircleBtnView: View {
|
||||||
|
let title: String?
|
||||||
|
let image: Image
|
||||||
|
@Binding var isSelected: Bool
|
||||||
|
let isReverse: Bool
|
||||||
|
|
||||||
|
let action: VOID_TO_VOID?
|
||||||
|
|
||||||
|
var backColor: Color {isReverse ? Color(.Second.light) : Color(.Normal.normal)}
|
||||||
|
var tintColor: Color {isSelected ? Color(.Second.normal) : Color(.Disable.normal)}
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
Button{
|
||||||
|
guard let action = action else {return}
|
||||||
|
action()
|
||||||
|
} label: {
|
||||||
|
VStack(alignment: .center, spacing: 0) {
|
||||||
|
self.image
|
||||||
|
.resizable()
|
||||||
|
.renderingMode(.template)
|
||||||
|
.foregroundStyle(self.tintColor)
|
||||||
|
.frame(width: 24, height: 24)
|
||||||
|
if let title = self.title {
|
||||||
|
Text("\(title)")
|
||||||
|
.font(.nps(font: .bold, size: 6))
|
||||||
|
.tint(self.tintColor)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.padding()
|
||||||
|
.background {
|
||||||
|
if isReverse {
|
||||||
|
Circle()
|
||||||
|
.accentColor(self.backColor)
|
||||||
|
.frame(width: 48, height: 48)
|
||||||
|
.innerShadow(shape: Circle(), color: Color(.Text.black).opacity(0.75), blur: 8, x: 0, y: 4)
|
||||||
|
} else {
|
||||||
|
Circle()
|
||||||
|
.accentColor(self.backColor)
|
||||||
|
.frame(width: 48, height: 48)
|
||||||
|
.shadow(color: Color(.Text.black).opacity(0.75), radius: 8, x: 4, y: 8)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
45
AcaMate/1. View/12. Main/121. Button/SimpleBtnView.swift
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
//
|
||||||
|
// SimpleBtnView.swift
|
||||||
|
// AcaMate
|
||||||
|
//
|
||||||
|
// Created by TAnine on 2/4/25.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
struct SimpleBtnView: View {
|
||||||
|
let title: String?
|
||||||
|
let image: Image?
|
||||||
|
let font: Font?
|
||||||
|
let width: CGFloat
|
||||||
|
let height: CGFloat
|
||||||
|
|
||||||
|
let action: VOID_TO_VOID?
|
||||||
|
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
Button{
|
||||||
|
guard let action = action else { return }
|
||||||
|
action()
|
||||||
|
} label: {
|
||||||
|
if let title = title, let font = font {
|
||||||
|
Text("\(title)")
|
||||||
|
.font(font)
|
||||||
|
.tint(Color(.Second.dark))
|
||||||
|
.frame(width: width, height: height)
|
||||||
|
}
|
||||||
|
else if let image = image {
|
||||||
|
image
|
||||||
|
.resizable()
|
||||||
|
.frame(width: width, height: height)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#Preview {
|
||||||
|
SimpleBtnView(title: "체크 합니다", image: Image(.BottomBar.home),
|
||||||
|
font: .nps(font: .bold, size: 12),
|
||||||
|
width: 40, height: 40,
|
||||||
|
action: nil)
|
||||||
|
}
|
79
AcaMate/1. View/12. Main/BottomView.swift
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
//
|
||||||
|
// BottomView.swift
|
||||||
|
// AcaMate
|
||||||
|
//
|
||||||
|
// Created by TAnine on 2/4/25.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
struct BottomView: View {
|
||||||
|
@State private var isHomeSelected: Bool = true
|
||||||
|
@State private var isManagementSelected: Bool = false
|
||||||
|
@State private var isChattingSelected: Bool = false
|
||||||
|
@State private var isCalendarSelected: Bool = false
|
||||||
|
@State private var isEtcSelected: Bool = false
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
HStack(spacing: 0){
|
||||||
|
Spacer(minLength: 1)
|
||||||
|
CircleBtnView(title: "홈", image: Image(.BottomBar.home),
|
||||||
|
isSelected: $isHomeSelected, isReverse: false,
|
||||||
|
action: {
|
||||||
|
btnAllFalse()
|
||||||
|
isHomeSelected.toggle()
|
||||||
|
})
|
||||||
|
Spacer(minLength: 1)
|
||||||
|
|
||||||
|
CircleBtnView(title: "학습 관리", image: Image(.BottomBar.management),
|
||||||
|
isSelected: $isManagementSelected, isReverse: false,
|
||||||
|
action: {
|
||||||
|
btnAllFalse()
|
||||||
|
isManagementSelected.toggle()
|
||||||
|
})
|
||||||
|
Spacer(minLength: 1)
|
||||||
|
CircleBtnView(title: "채팅", image: Image(.BottomBar.chatting),
|
||||||
|
isSelected: $isChattingSelected, isReverse: false,
|
||||||
|
action: {
|
||||||
|
btnAllFalse()
|
||||||
|
isChattingSelected.toggle()
|
||||||
|
})
|
||||||
|
Spacer(minLength: 1)
|
||||||
|
CircleBtnView(title: "일정", image: Image(.BottomBar.calendar),
|
||||||
|
isSelected: $isCalendarSelected, isReverse: false,
|
||||||
|
action: {
|
||||||
|
btnAllFalse()
|
||||||
|
isCalendarSelected.toggle()
|
||||||
|
})
|
||||||
|
Spacer(minLength: 1)
|
||||||
|
CircleBtnView(title: "더보기", image: Image(.BottomBar.etc),
|
||||||
|
isSelected: $isEtcSelected, isReverse: false,
|
||||||
|
action: {
|
||||||
|
btnAllFalse()
|
||||||
|
isEtcSelected.toggle()
|
||||||
|
})
|
||||||
|
Spacer(minLength: 1)
|
||||||
|
}
|
||||||
|
.padding([.top],12)
|
||||||
|
.background {
|
||||||
|
Rectangle()
|
||||||
|
.foregroundStyle(Color(.Normal.dark))
|
||||||
|
.ignoresSafeArea(edges: .bottom)
|
||||||
|
}
|
||||||
|
.frame(maxWidth: .infinity)
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private func btnAllFalse() {
|
||||||
|
isHomeSelected = false
|
||||||
|
isManagementSelected = false
|
||||||
|
isChattingSelected = false
|
||||||
|
isCalendarSelected = false
|
||||||
|
isEtcSelected = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#Preview {
|
||||||
|
BottomView()
|
||||||
|
}
|
34
AcaMate/1. View/12. Main/MainView.swift
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
//
|
||||||
|
// MainView.swift
|
||||||
|
// AcaMate
|
||||||
|
//
|
||||||
|
// Created by TAnine on 2/4/25.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
import Combine
|
||||||
|
|
||||||
|
struct MainView: View {
|
||||||
|
@EnvironmentObject var alertController: AlertController
|
||||||
|
@State var cancellables: Set<AnyCancellable> = []
|
||||||
|
@Binding var naviState : NaviState
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
VStack(spacing: 0) {
|
||||||
|
TopView(titleName: "Name")
|
||||||
|
|
||||||
|
Spacer()
|
||||||
|
|
||||||
|
BottomView()
|
||||||
|
.frame(maxWidth: .infinity)
|
||||||
|
|
||||||
|
// .backgroundStyle(Color(.Normal.dark))
|
||||||
|
// .safeAreaInset(edge: .bottom, spacing: 0) {
|
||||||
|
// Color(.Normal.dark)
|
||||||
|
//// .frame(height: 0)
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
// .fullDrawView(Color(.Normal.dark))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
43
AcaMate/1. View/12. Main/TopView.swift
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
//
|
||||||
|
// TopView.swift
|
||||||
|
// AcaMate
|
||||||
|
//
|
||||||
|
// Created by TAnine on 2/4/25.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
struct TopView: View {
|
||||||
|
@State var titleName: String = ""
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
HStack(alignment: .center, spacing: 0) {
|
||||||
|
SimpleBtnView(title: nil, image: Image(.TopBar.face), font: nil, width: 40, height: 40, action: {
|
||||||
|
|
||||||
|
})
|
||||||
|
.padding(EdgeInsets(top: 12, leading: 24, bottom: 12, trailing: 12))
|
||||||
|
|
||||||
|
Text("\(titleName)")
|
||||||
|
.tint(Color(.Text.disabled))
|
||||||
|
.font(.nps(font: .bold, size: 20))
|
||||||
|
Spacer()
|
||||||
|
|
||||||
|
SimpleBtnView(title: nil, image: Image(.TopBar.face), font: nil, width: 40, height: 40, action: {
|
||||||
|
|
||||||
|
})
|
||||||
|
.hidden()
|
||||||
|
|
||||||
|
}
|
||||||
|
.background {
|
||||||
|
Rectangle()
|
||||||
|
.foregroundStyle(Color(.Other.cell))
|
||||||
|
.ignoresSafeArea(edges: .top)
|
||||||
|
}
|
||||||
|
.frame(maxWidth: .infinity)
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#Preview {
|
||||||
|
TopView(titleName: "Name")
|
||||||
|
}
|
|
@ -16,6 +16,7 @@ public let API_URL: String = "https://acamate.ipstein.myds.me"
|
||||||
// MARK: - TYPEALIAS
|
// MARK: - TYPEALIAS
|
||||||
typealias VOID_TO_VOID = () -> ()
|
typealias VOID_TO_VOID = () -> ()
|
||||||
|
|
||||||
|
|
||||||
// MARK: - VARIABLE
|
// MARK: - VARIABLE
|
||||||
public var APPSTORE_URL = "https://itunes.apple.com/app/"
|
public var APPSTORE_URL = "https://itunes.apple.com/app/"
|
||||||
public var KEYBOARD_UP_HEIGHT: CGFloat = 46.0
|
public var KEYBOARD_UP_HEIGHT: CGFloat = 46.0
|
||||||
|
|
|
@ -46,7 +46,8 @@ struct AlertModifier: ViewModifier {
|
||||||
}
|
}
|
||||||
|
|
||||||
extension View {
|
extension View {
|
||||||
func fullView(_ backColor: Color) -> some View {
|
/// View에 전체적으로 색 입히기
|
||||||
|
func fullDrawView(_ backColor: Color) -> some View {
|
||||||
return self
|
return self
|
||||||
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
||||||
.background(backColor)
|
.background(backColor)
|
||||||
|
@ -68,4 +69,14 @@ extension View {
|
||||||
.navigationBarBackButtonHidden(true)
|
.navigationBarBackButtonHidden(true)
|
||||||
.toolbar(.hidden, for: .navigationBar)
|
.toolbar(.hidden, for: .navigationBar)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func innerShadow<S: Shape> (shape: S, color: Color, lineWidth: CGFloat = 6, blur: CGFloat, x: CGFloat, y: CGFloat) -> some View {
|
||||||
|
return self.overlay {
|
||||||
|
shape
|
||||||
|
.stroke(color, lineWidth: lineWidth)
|
||||||
|
.offset(x: x, y: y)
|
||||||
|
.blur(radius: blur)
|
||||||
|
.mask(shape.fill(LinearGradient(gradient: Gradient(colors: [.black, .clear]), startPoint: .topLeading, endPoint: .bottomTrailing)))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
BIN
AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Calendar.imageset/Calendar.png
vendored
Normal file
After Width: | Height: | Size: 636 B |
12
AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Calendar.imageset/Contents.json
vendored
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "Calendar.png",
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
BIN
AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Chatting.imageset/Chatting.png
vendored
Normal file
After Width: | Height: | Size: 543 B |
12
AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Chatting.imageset/Contents.json
vendored
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "Chatting.png",
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
},
|
||||||
|
"properties" : {
|
||||||
|
"provides-namespace" : true
|
||||||
|
}
|
||||||
|
}
|
12
AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Etc.imageset/Contents.json
vendored
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "Etc.png",
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
BIN
AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Etc.imageset/Etc.png
vendored
Normal file
After Width: | Height: | Size: 635 B |
12
AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Home.imageset/Contents.json
vendored
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "Home.png",
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
BIN
AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Home.imageset/Home.png
vendored
Normal file
After Width: | Height: | Size: 604 B |
12
AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Management.imageset/Contents.json
vendored
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "Management.png",
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
BIN
AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Management.imageset/Management.png
vendored
Normal file
After Width: | Height: | Size: 577 B |
BIN
AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Back.imageset/Back.png
vendored
Normal file
After Width: | Height: | Size: 587 B |
12
AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Back.imageset/Contents.json
vendored
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "Back.png",
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
},
|
||||||
|
"properties" : {
|
||||||
|
"provides-namespace" : true
|
||||||
|
}
|
||||||
|
}
|
12
AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Edit.imageset/Contents.json
vendored
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "Edit.png",
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
BIN
AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Edit.imageset/Edit.png
vendored
Normal file
After Width: | Height: | Size: 684 B |
12
AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Face.imageset/Contents.json
vendored
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "Face.png",
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
BIN
AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Face.imageset/Face.png
vendored
Normal file
After Width: | Height: | Size: 2.2 KiB |
12
AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Market.imageset/Contents.json
vendored
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "Market.png",
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
BIN
AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Market.imageset/Market.png
vendored
Normal file
After Width: | Height: | Size: 535 B |
12
AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Person.imageset/Contents.json
vendored
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "Person.png",
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
BIN
AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Person.imageset/Person.png
vendored
Normal file
After Width: | Height: | Size: 1.2 KiB |
12
AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Plus.imageset/Contents.json
vendored
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "Plus.png",
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
BIN
AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Plus.imageset/Plus.png
vendored
Normal file
After Width: | Height: | Size: 261 B |
12
AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Save.imageset/Contents.json
vendored
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "Save.png",
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
BIN
AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Save.imageset/Save.png
vendored
Normal file
After Width: | Height: | Size: 844 B |
12
AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Setting.imageset/Contents.json
vendored
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "Setting.png",
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
BIN
AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Setting.imageset/Setting.png
vendored
Normal file
After Width: | Height: | Size: 2.3 KiB |
BIN
AcaMate/6. Resources/Images/BottomBar/Calendar.png
Normal file
After Width: | Height: | Size: 636 B |
BIN
AcaMate/6. Resources/Images/BottomBar/Chatting.png
Normal file
After Width: | Height: | Size: 543 B |
BIN
AcaMate/6. Resources/Images/BottomBar/Etc.png
Normal file
After Width: | Height: | Size: 635 B |
BIN
AcaMate/6. Resources/Images/BottomBar/Home.png
Normal file
After Width: | Height: | Size: 604 B |
BIN
AcaMate/6. Resources/Images/BottomBar/Management.png
Normal file
After Width: | Height: | Size: 577 B |
BIN
AcaMate/6. Resources/Images/TopBar/Back.png
Normal file
After Width: | Height: | Size: 587 B |
BIN
AcaMate/6. Resources/Images/TopBar/Edit.png
Normal file
After Width: | Height: | Size: 684 B |
BIN
AcaMate/6. Resources/Images/TopBar/Face.png
Normal file
After Width: | Height: | Size: 2.2 KiB |
BIN
AcaMate/6. Resources/Images/TopBar/Market.png
Normal file
After Width: | Height: | Size: 535 B |
BIN
AcaMate/6. Resources/Images/TopBar/Person.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
AcaMate/6. Resources/Images/TopBar/Plus.png
Normal file
After Width: | Height: | Size: 261 B |
BIN
AcaMate/6. Resources/Images/TopBar/Save.png
Normal file
After Width: | Height: | Size: 844 B |
BIN
AcaMate/6. Resources/Images/TopBar/Setting.png
Normal file
After Width: | Height: | Size: 2.3 KiB |