일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- swift documentation
- RxCocoa
- Observable
- Protocol
- UICollectionView
- combine
- clean architecture
- 리펙토링
- Refactoring
- Clean Code
- SWIFT
- 스위프트
- rxswift
- uiscrollview
- tableView
- UITextView
- collectionview
- uitableview
- swiftUI
- MVVM
- HIG
- 리팩토링
- ios
- 클린 코드
- ribs
- Xcode
- Human interface guide
- map
- 애니메이션
- 리펙터링
- Today
- Total
목록ios (1094)
김종권의 iOS 앱 개발 알아가기
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cntnPF/btsKVAOxrob/zntYzWUyKFEngOrQE5IMr1/img.png)
커스텀 뷰 만들기간단한 커스텀 뷰의 경우는 단순히 데이터만 받아서 그 데이터에 맞게끔 뷰가 그려지지만, 데이터와 특정 뷰를 주입하여 그 뷰도 커스텀 뷰의 하나가 되도록 설계도 가능뷰를 주입받는 형태로 구현해야하는데 좋은 방법은? 아래에서 계속뷰를 주입받는 형태로 구현하는 테크닉ex) 예제로 사용할 뷰: 상단에 header 타이틀 형태가 있고 하단에는 배열로 넣어준 뷰들이 보여지는 뷰struct ContentView: View { var body: some View { CustomView(title: "상단 타이틀", items: [1,2,3]) { item in Text("item: \(item)") } }}1) 사용하는 쪽에서 만들 뷰에 필요한 데..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/ujFjW/btsKKzxDNWY/boo698Bx3GL1JEmT8IQwsK/img.gif)
Sticky 헤더 구현 아이디어LazyVStack의 pinnedViews 파라미터에 [.sectionHeaders]를 넣을 수 있는데 이 값을 사용하면 sticky header 구현이 매우 용이LazyVStack(pinnedViews: [.sectionHeaders])위 옵션을 주고 Section에 뷰를 넣으면 그 뷰가 sticky로 자동으로 동작됨ScrollView { LazyVStack(pinnedViews: [.sectionHeaders]) { // 상단 콘텐츠 VStack { Text("Top Content") .font(.largeTitle) .padding() ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cVMXMR/btsKDcasm69/7FoAXfk1CrSMgTYlFkaeVK/img.png)
뷰 정렬 개념아래 코드를 보면 흔히 사용되는 VStack 컴포넌트와 .frame 함수를 사용하여 아래처럼 구현했으나 잘못 구현된 코드UI는 의도된 대로 나올 수 있을지라도 추후에 수정할 때 잘못 적용될 확률이 큼ex) UI들을 좌측 정렬을 기준으로 배치하도록 구현된 코드VStack(alignment: .leading) { Image(systemName: "globe") .resizable() .frame(width: 30, height: 30) .foregroundStyle(.tint) Text("Hello, world!")}잘못 구현된 점은 개념을 알아보고 아래에서 확인VStack과 frame의 alignmentVStack(alignemnt:)는 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/Gtnoo/btsKDCl750z/mIbZGirYKSTKloSWuR9s7k/img.png)
changeCount 개념아이폰 사용자가 복사, 클립보드 제거 등의 UIPasteBoard 관련 수정 작업을 하면 애플에서 수정 기록을 기록하는데, 이 기록하는 변수가 changeCount@available(iOS 3.0, *)open class UIPasteboard : NSObject, @unchecked Sendable { open class var general: UIPasteboard { get } open var changeCount: Int { get } // 코드에서는 아래처럼 접근 가능UIPasteBoard.general.changeCount주의할 점)공식 문서에는 0으로 초기화 되는 시점 유저가 기기를 재시작하면 된다고 하는데, 재시작해도 0으로 초기화되지 않음ex) UIPa..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/VblHj/btsKtFEF9MJ/t1z7DeocqBwEAXpsSa47X1/img.png)
커스텀 뷰cornerRadius가 들어간 버튼을 만들어야할 때, SwiftUI에서는 두 가지 방법이 존재1) RoundedButton 뷰 만들기2) ViewModifier로 정의하고 뷰에 이 modifier 등록하기SwiftUI에서는 ViewModifier를 두어서, 커스텀 뷰 뿐만이 아닌 커스텀 스타일을 사용하는곳에서 간편하게 사용할 수 있도록 설계cornerRadius가 들어간 버튼의 스타일은 여러곳에서 사용할 수 있으므로 ViewModifier로 추상화하기커스텀 뷰를 만드는 것이 아닌, 커스텀 스타일을 만드는 것ViewModifier로 커스텀 스타일 만들기ViewModifier로 만들기 전에 커스텀뷰로 먼저 만들어보면 아래처럼 만들기가 가능하지만 단순히 스타일을 적용하고 여러 버튼에 재사용하려는 목..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/supfH/btsKujHr05v/dbE6xdt6ae9Kei2UlcEeu1/img.png)
SwiftUI의 bacgrkound와 overlaybackground와 overlay 옵션 모두 특정 뷰에 겹치게 뷰를 배치할 때 사용하는 메소드차이점은 background은 뷰 뒤에, overlay는 뷰 앞쪽에 배치 중첩됨ex) background를 사용하면 뷰 뒷쪽에 배치됨struct ContentView: View { var body: some View { VStack { Text("Hello, world!") .background { Color.blue } } .padding() }}ex) overay를 사용하면 뷰 앞쪽에 배치되므로 뷰가 가려..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/ZXvSx/btsKmiOtTtZ/WnxTj0legucC6BpKf3gDek/img.gif)
ScrollViewSwiftUI에서는 ScrollView를 사용할 때, UIKit에서 제공하는 UIScrollView와는 아래 정보 확인이 바로 어려움reachToBottom (스크롤이 바닥에 도달했는지)contentOffset (얼만큼 스크롤을 진행했는지)위 정보를 알 수 있으려면 ScrollView를 감싸서 따로 계산하여 정보 획득이 가능reachToBottom과 contentOffset 구하는 아이디어ScrollView를 감싸서 구현하고, 아래처럼 사용하는쪽에서는 CustomScrollView에 클로저로 콘텐츠 뷰들을 넣을 수 있도록 구현 var body: some View { VStack { CustomScrollView( frameHeight: 300, ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/d0c8gX/btsKkbjuVBl/7liPNEb4OvI1RA5sMCC7kk/img.png)
PreferenceKey일종의 키 이며, 이 키를 이용하여 특정 값을 변경될때마다 관찰할 수가 있음PreferenceKey로 데이터를 뿌리면, 이 데이터에 관심있는 쪽에서 해당 PreferenceKey로 옵저빙이 가능가장 대표적인 사용 방법은 자식뷰 -> 부모뷰로 데이터를 넘길때 사용UIKit에서는 델리게이트나 closure로 넘기지만 SwiftUI에서는 PreferenceKey라는 것이 존재사용방법ex) 자식뷰에서 TextView에 데이터가 입력될때마다 부모 뷰에 전달하고 싶은 경우?자식뷰 준비struct ChildView: View { @State private var inputText = "" var body: some View { VStack { ..