일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
- 클린 코드
- UITextView
- swiftUI
- clean architecture
- 리펙터링
- Clean Code
- ribs
- uiscrollview
- combine
- uitableview
- 리펙토링
- Refactoring
- collectionview
- swift documentation
- map
- rxswift
- 스위프트
- tableView
- HIG
- 리팩토링
- SWIFT
- 애니메이션
- Observable
- UICollectionView
- RxCocoa
- Human interface guide
- MVVM
- Xcode
- ios
- Protocol
- Today
- Total
목록전체 글 (1622)
김종권의 iOS 앱 개발 알아가기
* 가끔 개발을 하다가 commit파일에 DS_Store라는 파일이 보이는데 이 글에서 그것이 무엇인지 알아보기DS_Store란?DS_Store(Desktop Services Store)란 Mac 운영체제에서 디렉토리에 관한 *메타 데이터를 저장된 파일저장하는 *메타 데이터 아이콘 위치보기 설정 (예: 아이콘 보기, 목록 보기, 갤러리 보기 등)창 크기 및 위치디렉토리에 대한 기타 사용자 정의 설정이런 정보는 개발할때는 불필요하므로 개발 디렉토리에는 gitignore를 활용하여 DS_Store를 제외시켜주기DS_Store 만들어보기DS_Store에 관한 개념을 위에서 알아보았듯이 운영체제에서 자동으로 생성해주는데 정확히 어떻게 자동생성되는지 테스트하여 이해하기1) Finder를 사용하여 디렉토리를 열기..
Sticky 헤더 구현 아이디어LazyVStack의 pinnedViews 파라미터에 [.sectionHeaders]를 넣을 수 있는데 이 값을 사용하면 sticky header 구현이 매우 용이LazyVStack(pinnedViews: [.sectionHeaders])위 옵션을 주고 Section에 뷰를 넣으면 그 뷰가 sticky로 자동으로 동작됨ScrollView { LazyVStack(pinnedViews: [.sectionHeaders]) { // 상단 콘텐츠 VStack { Text("Top Content") .font(.largeTitle) .padding() ..
뷰 정렬 개념아래 코드를 보면 흔히 사용되는 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:)는 ..
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..
커스텀 뷰cornerRadius가 들어간 버튼을 만들어야할 때, SwiftUI에서는 두 가지 방법이 존재1) RoundedButton 뷰 만들기2) ViewModifier로 정의하고 뷰에 이 modifier 등록하기SwiftUI에서는 ViewModifier를 두어서, 커스텀 뷰 뿐만이 아닌 커스텀 스타일을 사용하는곳에서 간편하게 사용할 수 있도록 설계cornerRadius가 들어간 버튼의 스타일은 여러곳에서 사용할 수 있으므로 ViewModifier로 추상화하기커스텀 뷰를 만드는 것이 아닌, 커스텀 스타일을 만드는 것ViewModifier로 커스텀 스타일 만들기ViewModifier로 만들기 전에 커스텀뷰로 먼저 만들어보면 아래처럼 만들기가 가능하지만 단순히 스타일을 적용하고 여러 버튼에 재사용하려는 목..
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를 사용하면 뷰 앞쪽에 배치되므로 뷰가 가려..
ScrollViewSwiftUI에서는 ScrollView를 사용할 때, UIKit에서 제공하는 UIScrollView와는 아래 정보 확인이 바로 어려움reachToBottom (스크롤이 바닥에 도달했는지)contentOffset (얼만큼 스크롤을 진행했는지)위 정보를 알 수 있으려면 ScrollView를 감싸서 따로 계산하여 정보 획득이 가능reachToBottom과 contentOffset 구하는 아이디어ScrollView를 감싸서 구현하고, 아래처럼 사용하는쪽에서는 CustomScrollView에 클로저로 콘텐츠 뷰들을 넣을 수 있도록 구현 var body: some View { VStack { CustomScrollView( frameHeight: 300, ..
PreferenceKey일종의 키 이며, 이 키를 이용하여 특정 값을 변경될때마다 관찰할 수가 있음PreferenceKey로 데이터를 뿌리면, 이 데이터에 관심있는 쪽에서 해당 PreferenceKey로 옵저빙이 가능가장 대표적인 사용 방법은 자식뷰 -> 부모뷰로 데이터를 넘길때 사용UIKit에서는 델리게이트나 closure로 넘기지만 SwiftUI에서는 PreferenceKey라는 것이 존재사용방법ex) 자식뷰에서 TextView에 데이터가 입력될때마다 부모 뷰에 전달하고 싶은 경우?자식뷰 준비struct ChildView: View { @State private var inputText = "" var body: some View { VStack { ..