iyOmSd/Title: SwiftUI 21

[SwiftUI] ChipView(iOS16+, iOS16-) tag view 구현하기

2023.09.30 - [iyOmSd/Title: Swift] - [Swift] Multi Line Tag View 그리기 [Swift] Multi Line Tag View 그리기 SwiftUI만 하다가 UIKit을 하게될 일이 생겼는데 요구사항중하나가 뷰를 크기에 맞게 여러줄로 표현해주는 뷰에요 테그를 표현하는 뷰같은 곳에 많이 쓰이는 UI로 알고있어요 결과물 부터 보시죠! nsios.tistory.com UIKit을 사용하는경우는 여기서 확인가능합니다!! 저 글을 쓸땐 이 레이아웃을 chip이라고 부르는지 몰랐어요 ㅎ 간단하게 ChipView란? 균등한 너비를 가지는게아니라 컨텐츠의 크기에 fit하게 정렬되고 그 사이즈를 넘어간다면 아래로 이동되는 그러한 뷰입니다! 아래처럼요 이런 뷰가 ChipVie..

[SwiftUI] WWDC23 Demystify SwiftUI Performance

SwiftUI에 대한 성능적인 측면을 좀더 알아보고싶어서 찾아본 세션이에요 성능문제는 증상에서 부터 시작됩니다. 네비게이션 푸시가 느리거나 애니메이션이 끊기는현상이 보이거나 로딩 인디케이터가 뜨거나 등 현상이 일어날 때 증상을 보고 파악하게됩니다. 성능 문제가 있다는것을 파악하면 문제를 해결하는 첫단계는 측정이고 증상이 있음을 입증하고 증상의 원인을 파악합니다. 근본 원인을 파악한 후에는 최적화해서 문제를 해결합니다. 고친내용을 다시측정하고 입증하고 문제가 해결됬는지 확인합니다. 이를 반복하게 됩니다. 이 세션을 듣기위해서는 SwiftUI의 identity를 이해하고있어야하고 암시적, 명시적 identity가 어떻게다른지 view lifetime과 identity의 차이를 알고있어야한다고 하네요! 자세한..

[SwiftUI] StateObject init 생성자

이글을 쓰게된 동기는... 정말 아무렇지않게 습관처럼 코드를 작성하다가 겪은 이슈를 공유하려 합니다! StateObject를 사용할 때 어떻게 알고 사용하시나요? 보통은 ObservedObject랑 비교를 하면서 ownership이 다르다 뷰의 생명주기와 별개다 별도로 저장돼서 사용된다 뷰의 수명동안 새로운 인스턴스를 한번만 생성한다 정도로 알고 사용하는거라고 생각해요 그래서 ObservedObject와 차이를 두며 사용을 하곤하는것 같아요! (저도 이랬던거같네요... ㅎ) 이렇게 사용하다보면 간혹 만나는 문제점이 생겨요 struct StartView: View { @State private var selectedNum: Int = 10 var body: some View { ScrollView { La..

[SwiftUI] Charts 실전편 (feat. iOS16+ apple framework)

2023.06.29 - [iyOmSd/Title: SwiftUI] - [SwiftUI] Charts 이론편 (feat. iOS16+ apple framework) [SwiftUI] Charts 이론편 (feat. iOS16+ apple framework) 슬슬 미니멈버전이 16이 되는 시대가 다가오고 있는 만큼 iOS16 부터 사용할 수 있는 내장 프레임워크인 Charts 를 알아보려고 합니다! 간단하게 이론적인 부분위주로 어떻게 쓰이고 사용할 수 있는 nsios.tistory.com 을 통해서 기본적인 사용법을 익혔으니 이젠 직접 구현해보면서 다양한 케이스를 확인하려고해요! 기본적인것들만 알아볼게요 BarMark 간단한 BarChart부터 뜯어볼까요 struct Case1: Identifiable { ..

[SwiftUI] Charts 이론편 (feat. iOS16+ apple framework)

슬슬 미니멈버전이 16이 되는 시대가 다가오고 있는 만큼 iOS16 부터 사용할 수 있는 내장 프레임워크인 Charts 를 알아보려고 합니다! 간단하게 이론적인 부분위주로 어떻게 쓰이고 사용할 수 있는지 쓰윽 볼까요? 웅장합니다 이런 모든 차트를 구현할 수 있다고 하네요 차트프레임워크는 SwiftUI와 동일한 선언적 구문을 사용하여 차트를 시각화합니다 Mark와 Property의 조합으로 다양한 차트를 구현할 수 있다고 하네요 이처럼 어떤 Mark를 고르는지, 어떤 프로퍼티를 고르는지에 따라 정말 많은 차트가 생길 것 같네요 Marks and composition 차트에서 여섯개의 파란색 직사각형을 Mark라고합니다 Mark는 데이터를 나타내는 그래픽요소이고 각각 하나의 막대는 Bar Mark입니다. 이..

[SwiftUI] NavigationStack

안녕하세요! SwiftUI에서 항상 느꼇던 불편한점중 하나가 네비게이션이였는데요 이를 해결해주는게 나온지 좀 됐지만 이제 해보려합니다! (진작에 나왔을 녀석이여야 했는데...) iOS16 타겟을 쓸일이 없지만... 곧 쓸 지도 모르니까요! 😁 타입은 새롭지만 저희한텐 익숙합니다 push pop되는 그런 인터페이스를 나타내기때문이죠! 이것말고도 NavigationSplitView 타입도 있어요 mac이나 iPad에서 사용하는 다중열을 보여줄 때 사용하는 타입이죠 NavigationSplitView은 스킵하고 오늘은 NavigationStack을 알아보려합니다 이전에는 NavigationLink를 이용한 방식으로 var body: some View { NavigationView { NavigationLink..

[SwiftUI] 분리된 프레임워크(모듈) 리소스(Font, Color, Image)접근

개발하면서 경험했던 이슈를 공유겸 기록하려고합니다 Tuist를 사용해서 개발하면서 UI모듈을 나누게됬어요 UI가 분리되었으니 리소스에 해당하는 이미지, 컬러, 폰트같은 요소들이 UI모듈에 정의되고 다른곳에서 꺼내쓰는 방식으로 사용하죠 위의 그림기준으로 Feature에서 평소와같이 UI를 import해서 사용하게된다면 실행에 오류는없지만 원하는 리소스를 가져올 수 없는걸 확인할 수 있어요 이유는 프레임워크를 분리했기때문에 번들이 분리되어있기때문이에요 먼저 컬러와 이미지에 대해서 정리할게요 결론부터 말하자면 컬러와 이미지는 해결방법이 동일해요 Bundle을 정하고 가져오는 방식이에요 우선 일반적으로 UI모듈에 정의된 컬러에 접근하게된다면 아래와 같은 로그를 만날 수 있습니다. No color named 'n..

[SwiftUI] Widget LiveActivity (feat. Dynamic Island) 잠금화면 기능

LiveActivity가 무엇이냐..? 잠금화면에서 확인할 수 있는 실시간 액션같은 기능이에요 대표적인 예로 배달의 민족에서 사용하고있어요 배달 시키면 이런거 잠금화면에서 볼수있죠? 네 이런겁니다~! 이걸 오늘 해보려고 합니다! ActivityKit 을 사용해요 iOS16.1+ 부터 사용가능하구요! 위젯과 같이 만들어줘야하는 녀석이에요 프로젝트를 만들고 File > New > Target 에 widget을 선택하면 아래와같은 창이뜨는데 Include Live Activity 체크박스를 클릭해줘야합니다! 그러면 관련된 기본 템플릿이 쫙해서나올거에요 plist에가서 Supports Live Activities값을 YES로 권한 설정해줘야 사용가능합니다! 여기까지 셋팅을 끝냈으면 코딩만 남았네요 struct ..

[SwiftUI] @FocusState

iOS15+에서 지원되는 프로퍼티래퍼에요 포커스되는 상태를 관리할 수 있는 타입이에요 대표적으로 텍스트필드에서 자주쓰이죠 텍스트필드를 포커스했을때, 리턴했을때를 구분해야하는데 iOS15 미만에선 onCommit, onEditingChanged 를 통해서 관리했지만 iOS15+ 부터는 @FocusState와 onSubmit onChange를 이용해요 예시를 만들어봤어요 struct TextFieldTest: View { @frozen enum FocusType: Hashable { case textfield1 case textfield2 } @State private var text: String = "" @FocusState private var focus: FocusType? var body: some..

[SwiftUI] TextField Placeholder

swiftUI버전별로 달라서 버전별로 알아볼게요 iOS15 미만인경우 아쉽게도 placeholder에대한 별다른 지원이없어요! ㅠ 그래서 직접만들어 써야하고 글을쓴 목적이기도하죠 기본적인 TextField의 생성자는 아래그림과같아요 title: placeholder역할이에요 text값이없을때 여기에넣어준 string이 보여요 text: 텍스트필드의 값이에요 추가로 이런형태도있죠 onCommit: 리턴버튼 누를시에 실행되는 동작이에요 onEditingChanged: 작성을 시작했는지 끝냈는지 상태변화를 나타내요. textfield를 눌러서 작성을 시작하면 true 리턴해서 포커스를 벗어나면 false를 반환해요 (참고로 onCommit, onEditingChanged는 iOS16에서 deprecated될 ..