
.background( Color.white .shadow(color: .gray.opacity(0.2), radius: 10, x: 0, y: 0) .mask(Rectangle().padding(.top, -20)))Button의 그림자는 이렇게 단순하게 background와 shadow를 이용하면 됐다. 하지만 TabView는 이렇게 해도 동작하지 않는다. 해결 방법import Foundationimport UIKitimport SwiftUIextension UITabBarController { open override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() tabB..
Combine이란?반응형 프로그래밍의 개념을 기반으로 개발된 프레임워크시간 경과에 따른 값을 처리하기 위한 통합된 선언적 API반응형 프로그래밍데이터 스트림과 변화의 전파에 관련된 선언형 프로그래밍 패러다임이다.데이터 스트림 : 시간에 따라 만들어진 일련의 이벤트 ex) 탭 이벤트 스트림선언형 프로그래밍명령형 프로그래밍 선언형 프로그래밍 명령형 프로그래밍선언형 프로그래밍How(어떻게)What(무엇)코드가 어떻게 작업을 수행해야 하는지결과에 집중하고 구체적인 행위를 감춤행위를 정의하고 행위에 데이터를 전달핵심 개념들Publisher : 값을 방출하거나, 완료 이벤트나 실패 이벤트를 전할 수 있다.Just() : 단일 값을 즉시 생산하는 Publisher. 에러 타입은 항상 Never이다.Future() :..

SplashView 작성 // SplashView.swift struct SplashView: View { var body: some View { VStack { Image("flo-splash") .resizable() // .aspectRatio(contentMode: .fill) .edgesIgnoringSafeArea(.all) } } } ContentView 작성 // ContentView.swift struct ContentView: View { @State private var showMainView = false var body: some View { VStack { if showMainView { PlayerView() } else { SplashView() .onAppear { Disp..
String에 index로 접근 let index = str.index(str.startIndex, offsetBy: i) let char = str[index] 공백을 기준으로 문자열 나누기 let strs = str.split(separator: " ") 부분문자열 구하기 let subStr1 = t[startIndex.. 정수 대문자, 소문자 변경 let lowerStr = str.lowercased() // -> 소문자 let upperStr = str.uppercased() // -> 대문자 캐릭터 ↔ 아스키코드 변경 // A ~ Z : 65 ~ 90 // a ~ z : 97 ~ 122 let asciiIntValue = Int(char.asciiValue!) // 캐릭터 -> 아스키 let c..

이렇게 자동스크롤이 되는 배너를 구현하려고 한다. 일단 배너는 의외로 간단하게 구현할 수 있다. TabView로 구현하면 된다! 배너 구현 코드 // BannerView.swift var body: some View { TabView { ForEach(viewModel.banners, id: \\.self) { banner in Image(banner.image) .resizable() .scaledToFill() } } .tabViewStyle(.page) } TabView에 .tabViewStyle(.page)를 이용하면 된다. 자동 스크롤 구현 코드 // BannerView.swift @State private var currentIndex = 0 var body: some View { TabVie..