SwiftUI에서는 .sheet 를 iOS13부터 지원하고 있지만,sheet의 크기 조절을 하여 BottomSheet처럼 사용하기 위한 presentationDetents는 iOS16부터 지원됨. iOS16 미만 버전을 타겟으로 하는 BottomSheet의 필요성이 있음. 구현 요구사항- content에 viewModifier를 통해 bottomSheet를 붙일 수 있고,- bottomSheet는 상단의 핸들을 가지고 있고, 하단에 sheetContent를 주입받을 수 있어야 함.- bottomSheet는 sheetContent의 높이+핸들의 높이 만큼 높이를 가지되, bottomSheetTopOffset을 받아서 화면높이-bottomSheetTopOffset를 최대 높이로 가짐.- bottomSheet..
이전 글에서도 그렇고,뷰의 사이즈를 알고 싶을 때 GeometryReader를 사용하는데, GeometryReader 내부에 뷰를 그리고 싶지는 않을 때아래와 같은 방식으로 background에 GeometryReader를 넣어 구현함. struct FramePractice: View { @State var size: CGSize = .zero var body: some View { Text("Size: \(size.debugDescription)") .padding() .background(Color.orange) .background( // padding된 Text 뷰의 크기를 알기 위한 방법 ..
SwiftUI의 DisclosureGroup과 OutlineGroup은 iOS14.0부터 사용할 수 있는 뷰. DisclosureGroup과 OutlineGroup은 각각 아래와 같이 생김.둘다 계층이 있는 리스트 형식을 지원.똑같이 생겼..지만 구현 및 동작에서 약간의 차이가 있음. DisclosureGroupDisclosureGroup은isExpanded라는 Binding을 받아서, 동적으로 그룹을 열거나 닫도록 컨트롤할 수 있음.그리고 자식뷰로 DisclosureGroup을 또 넣어서 계층을 더 표현할 수 있음.struct DisclosureGroupPractice: View { let data = ["Hello", "World"] let subData = ["Enjoy", "Develo..
SwiftUI의 View의 .frame viewModifier에 대해 정리. 이전 글(https://swifty-cody.tistory.com/157)에서 정리했듯이,.frame viewModifier는 View의 제약사항이 아닌 또다른 View임을 인식한다는 전제로 설명. .frame(width: height:alignment:)가장 기본적이고 익숙한 frame.해당 View에게 고정사이즈를 제안하기 위함. A라는 View에 frame을 적용했을 때,A의 상위에 해당 frame(width, height)의 View를 적용하고,이 frame View가 A에게 해당 사이즈만큼 차지하도록 제안하는 것이 기본 흐름.그리고 A가 제안된 크기 내에서 실제로 차지할 사이즈를 정해서 frame View에게 알려줌.그..
SwiftUI의 .gesture viewModifier에 대한 정리 .gesture viewModifierSwiftUI에서는 제스쳐를 적용하고 싶은 View에 .gesture를 적용struct GestureTest: View { var body: some View { VStack { Text("GestureTest") } .gesture( // 여기에 GestureMask를 작성 ) }.gesture에 GestureMask를 정의해서 적용.GestureMask에는 DrageGesture, TapGesture, LongPressGesture가 있음.DragGesture드래그 제스쳐 적용 예시.DragGest..
SwiftUI의 lineBreakMode에 대해 생각해 볼 점.SwiftUI의 Text는 기본적으로 lineBreakMode가 byWordWrapping인 것처럼 보임. 하지만 SwiftUI의 lineBreak 규칙을 100% 믿으면 안 될 수도 있음.가끔 byWordWrapping이라고 하기엔 이해되지 않는(?) 줄 바꿈도 보이는데.예를 들어 아래와 같은 코드에서"주변에 유기견을 보호하고"까지 작성하면 한 줄로 표시가 되다가,struct LineBreakTest: View { var body: some View { Text("주변에 유기견을 보호하고") .textStyle(style: .B30, color: .hex000000) .padding(..
(WWDC19 Building Custom Views with SwiftUI를 정리한 글입니다. 스압 주의) 위 화면에는 사실 3가지 View가 존재.View 계층구조 최하단에 Text("Hello, World!") 가 있고,항상 body, Text와 동일한 경계를 갖는 ContentView가 있음.그리고 디바이스의 SafeAreaInset을 제외한 RootView가 존재. 여기에서 body를 갖는 최상위View = ContentView는 항상 '레이아웃 중립'이라고 불리는 레이어.해당 bounds는 body의 bounds에 의해 정의됨. ContentView의 bounds = body의 bounds. 그래서 실제로 우리가 관심을 가져야할 View는 RootView와 body내부의 View(Text)만..
(WWDC24 What's new in Swift 영상을 정리: https://www.youtube.com/watch?v=17fZZ1v_N2U&list=WL&index=10) NonCopyable TypesSwift에서는 값타입, 참조타입 모두 기본적으로 복사가 가능함.Non Copyable Types는 이런 복사 가능성을 제한 시킬 수 있음. 파일의 예시.파일과 같은 고유 시스템 리소스는 자동으로 close하는 deinit을 사용해서 nonCopyable 구조체로 표현할 수 있음.이 표현은 동일한 파일을 여러 곳에서 write하는 런타임 문제를 방지시켜주고,자동으로 정리해주지 않으면 발생할 수 있는 메모리누수 문제도 해결해줌.struct File: ~Copyable { private let fd: C..
https://developer.apple.com/documentation/swiftui/geometryreader GeometryReader | Apple Developer DocumentationA container view that defines its content as a function of its own size and coordinate space.developer.apple.com GeometryReader의 필요성SwiftUI로 개발을 하다 보면 애플에서 의도한 대로(?) 디바이스의 사이즈, 혹은 부모View의 사이즈를 전혀 생각하지 않고도 대부분 원하는 화면을 그려가게 되지만. 부모View의 사이즈를 알고 해당 좌표계에 따라서 그리고 싶을 수 있음. GeometryReader는 자식V..
basicText는 아래와 같이 modifier들을 사용가능.struct SwiftUIView: View { var body: some View { Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus tempus sem at congue varius. Nunc vulputate purus eros, vitae venenatis turpis blandit in.") .bold() // 볼드체 .italic() // 이텔릭 .strikethrough(true, color: .blue) // 취소선 .underline(true,..
SwiftUI의 뷰 계층에서 UIKit을 사용하기 위한 방법으로 UIViewRepresentable, UIViewControllerRepresentable 을 제공. (https://swifty-cody.tistory.com/44) 반대로 UIKit 뷰 계층에서 SwiftUI를 사용하기 위한 방법으로 UIHostingViewController를 제공함. https://developer.apple.com/documentation/swiftui/uihostingcontroller UIHostingController | Apple Developer DocumentationA UIKit view controller that manages a SwiftUI view hierarchy.developer.apple...
유니코드와 UTF전 세계 모든 문자를 전산에서 일관된 표현으로 다룰 수 있도록 설계된 산업표준. 유니코드를 실제로 저장하는 방식은 UTF. 유니코드 스칼라크기가 가변적인 String 문자열을 하나하나 개별적으로 접근하기 위한 방법. Unicode기반 21-bit 코드. UTF-32랑 거의 동일. 하나 이상의 Unicode Scalar가 모여 Character를 이룸.let code = 0xAC00 let scalar = UnicodeScalar(code)! let string = "\(scalar)" // 가 let 가 = "\u{AC00}" // 가 한글 유니코드주로 쓰이는 한글 유니코드초성 19개 1100(4352) ~ 1112(4370) 중성 21개 1161(4449) ~ 1175(4469) 종성 ..
localizedStandardCompare(_:)localizedStandardCompare(_:) documentFinder의 파일 정렬처럼 String을 비교해주는 메서드. 예시아래는 기존 sorted() 메서드의 예시.let fileNames = [ "파일이름 100.txt", "파일이름 5.txt", "파일이름 20.txt"]let sortedFileName = fileNames.sorted()sortedFileName .forEach { print($0) } 결과파일이름 (100).txt파일이름 (20).txt파일이름 (5).txt 하지만 우리가 파일 정렬에서 원하는 건 파일명 뒤의 숫자가 텍스트 순서가 아닌 Integer의 순서로 정렬이 되는 것을 원..
(WWDC22) Hello Swift Charts(WWDC22)Swift Charts: Raise the bar Swift Charts FrameworkApple이 디자인한 Chart를 만들기 위한 Framework.SwiftUI와 동일한 선언적 문법. Mark차트에서 각 항목에 대한 요소를 Mark라고 함.위 그림에서 Mark는 Bar Mark.import Chartsimport SwiftUIstruct StylesDetailsChart: View { var body: some View { Chart { BarMark( x: .value("Name", "Cachapa"), y: .value("Sales", 90..
TCA가 앱 개발에서 해결하고자 하는 것상태(State) 관리: 간단한 값 타입들로 어플리케이션의 상태를 관리하는 방법, 상태를 공유를 통해 화면에서 일어나는 변화(Mutation)를 다른 화면에서 즉시 관측(Observe)하는 방법을 제공.합성(Composition): 기능을 여러 개의 독립된 모듈로 추출하는 방법, 이 모듈을 다시 합쳐서 거대한 기능을 작은 컴포넌트의 집합으로 구성하는 방법을 제공.사이드 이펙트(Side Effects): 어플리케이션 바깥세상과 접촉하는 작업을 테스트할 수 있고 이해하기 쉽게 작성하는 방법을 제공.테스팅(Testing): 아키텍처 내부의 기능을 테스트하는 방법뿐만 아니라 여러 파트로 구성된 기능의 통합 테스트를 작성하는 방법, 사이드 이펙트가 어플리케이션에 끼치는 영향..