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)만..
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...
(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): 아키텍처 내부의 기능을 테스트하는 방법뿐만 아니라 여러 파트로 구성된 기능의 통합 테스트를 작성하는 방법, 사이드 이펙트가 어플리케이션에 끼치는 영향..
WWDC의 Demystify SwiftUI를 정리한 내용입니다.SwiftUI는 선언적UI로서 고수준의 앱이 원하는 것을 Describe하면 SwiftUI가 이를 구현하는 방법을 정확히 결정.대부분의 경우 잘 작동하지만, 예상하지 못한 동작을 하는 순간은 생겨나는데,이런 순간에 원하는 결과를 얻기 위해 SwiftUI가 뒤에서 무엇을 하는지 이해하는 것이 도움이 됨. SwiftUI가 코드를 볼때 무엇을 보는가Identity: SwiftUI가 앱의 여러 업데이트에서 element를 동일하거나 별개로 인식하는 방법Lifetime: SwiftUI가 시간이 지남에 따라 View와 데이터의 존재를 추적하는 방법의존성: SwiftUI가 인터페이스를 업데이트해야하는 시기와 이유를 이해하는 방법위 세가지 개념이 Swift..
Platforms State of the Union을 훝고 갑니다. 추후 각 세션 정리 예정입니다. Swift Swift Macros Boilerplate 코드를 좀 더 깔끔하게 만들어 줄 수 있는 방법입니다. 위처럼 @가 붙은 attribute일 수도 있고, 독립적으로 #이 붙은 형태일 수도 있습니다. 이 #URL Macro는 URL을 초기화하여 언래핑시켜주는 코드인데, 해당 Macro에서 Expand Macro를 통해 확인이 됩니다. 그 뿐만 아니라 유효한 URL String인지도 컴파일 타임에 체크해주고, 올바른 코드를 작성할 수 있도록 커스텀 피드백을 할 수 있게 해줍니다. fetchContent(_:completion:) 함수에 async/await을 사용하고 싶을 땐, 위처럼 @AddAsync..
Xcode 14.3이 릴리즈되면서 Swift 5.8도 업데이트되었습니다. 변경점들을 간단하게 정리해봅니다. Function back deployment (SE-0376) @backDeployed(before:) attribute를 통해 이전 버전의 프레임워크에서 새 API를 사용할 수 있게 해줍니다. 함수에 대한 코드를 앱의 바이너리에 작성 후 런타임 시 검사하여 수행됩니다. 사용자가 적절한 새 OS를 사용하는 경우 시스템 자체 버전의 함수가 사용되고, 아닌 경우 앱 바이너리에 복사된 버전에 대신 사용됩니다. 단, @backDeployed는 함수, 메서드, 서브스크립트, 계산프로퍼티에만 적용됩니다. 당연하게도 만능으로 새 기능을 이전 OS에서 쓸 수 있게 한다던가 하는건 아닌거죠. 아래는 예시입니다. @..