일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 책후기
- contentInset
- 부트캠프
- 스타트업주니어로살아남기
- 야곰아카데미
- 독서후기
- Structures and Classes
- viewcontroller
- xcode
- roundingMode
- human interface guidelines
- SWIFT
- 독후감
- IOS
- Navigation
- mvvm
- UIResponder
- @available
- 아이폰
- 스위프트
- Codegen
- NumberFormatter
- NotificationCenter
- Mock
- delegation
- Info.plist
- Failed to register bundle identifier
- View Life Cycle
- SWIFTUI
- Modality
- Today
- Total
목록Software Engineering/iOS (76)
호댕의 iOS 개발

SwiftUI를 사용하다보면 꼭 보게 되는 것이 존재한다. import SwiftUI struct ContentView: View { var body: some View { Text("Hello World") } } View 프로토콜을 채택하게 되면 반드시 var body를 선언해야 하고 이는 연산 프로퍼티이며 some View 타입이다. 흠... 그런데 View면 View지 여기서 some View를 사용한다. 이유가 뭘까? 일단 some View로 선언한 타입 내에선 다양한 뷰를 나열하게 되면 뷰가 잘 그려진다. import SwiftUI struct ContentView: View { var body: some View { ZStack { Color(.black) Text("Hello World")..

앱에서 예상하지 못했던 비정상 강제 종료되는 상황을 트래킹하기 위해 Firebase의 Crashlytics를 많이 사용하게 된다. 사용자들에게 앱을 사용하다가 갑자기 앱이 종료되게 된다면 앱에 대한 신뢰도가 매우 떨어질 수 있기 때문에 이를 지속적으로 트래킹하고 문제의 원인이 된 부분을 해결해줘야 한다. Crashlytics는 Xcode의 dSYM 파일의 디버깅 정보를 이용해 어떤 코드에서 문제가 생겼는지에 대해 알려주게 된다. 구체적으로 보자면, dSYM 파일에는 앱의 바이너리 코드에서 사용하는 함수 / 변수 이름과 이에 대한 주소 정보가 포함한 Symbol Table이 존재하게 된다. 이를 매핑하여 어떤 함수에서 문제가 발생했는지 식별 가능 소스 코드에서 라인 번호와 바이너리 코드의 주소 간의 매핑 ..

무신사에서도 보면 상품 상세 화면이나 이벤트 화면에서 캡쳐를 하는 경우 상단에 공유를 할 수 있도록 하는 UI를 제공하고 있다. 이를 구현하기 위해선 사용자의 캡쳐 이벤트를 받아서 이때 위 이미지처럼 UI를 띄워줘야 할 것이다. 그럼 어떻게 이런 이벤트를 받을 수 있을까?! 캡쳐 이벤트 받기 이는 키보드가 나왔다가 dismiss되는 이벤트를 받는 것과 거의 유사하다. NotificationCenter를 활용하면 된다!! 해당 이벤트의 이름은 아래 프로퍼티에 정의되어 있다. UIApplication.userDidTakeScreenshotNotification 이름만 봐도 스크린샷 찍었을 때 이벤트를 알려주게 생겼다. 이후는 NotificationCenter를 사용하는 것과 동일하다. 캡쳐 이벤트를 인식했으..

App Group은 왜 필요한 것일까? 기존 앱과 Extension의 경우 각자 서로의 데이터 컨테이너를 가지고 있으며, 이에 직접 엑세스할 순 없다. 하지만 데이터 공유를 활성화 할 수는 있다! 바로 AppGroup을 통해서 말이다. 이를 활성화하게 되는 경우 NSUserDefaults API를 사용해서 사용자의 기본 설정에 대한 값에 엑세스를 할 수 있다. 즉 앱에서 UserDefaults로 저장해놓은 값을 Extension에서도 접근이 가능하게 되는 것이다. Extension Scenarios App Extension Programming Guide: Handling Common Scenarios App Extension Programming Guide developer.apple.com 위 그림처..

회사에서 이번에 위젯 도입을 고려하고 계셔서 호기롭게 해보고 싶다는 생각이 들었다. 아니 회사 프로젝트에서 SwiftUI도 사용해볼 수 있고 잠깐 찍먹만 해봤던 위젯을 개발해보면 너무 재밌을 것 같았기 때문이다. (지금도 위젯 재밌긴 하다... 하지만 지금 만난 문제는 재미없고 당황스러움밖에 없었다... ㅋ) 위젯에 대한 간단한 도입 방법과 설명은 요 글에서 이미 작성해놨다! (첨에는 기억이 안났는데 읽다보니 새록새록... 역시 기록은 중요하다) https://ho8487.tistory.com/61 [iOS] Widget 알아보기 (+ AppExtension) iOS 14 이후부터 위젯 기능을 사용할 수 있게 되었다. (물론... 안드로이드에선 진작 있긴 했지만... ) 위 아이패드 화면에서 흰 색 테두..

갑자기 앱을 실행하려고 하는데 요런 에러가 잔뜩 떴다. There is no XCFramework found at ~ 처음 이 문제를 만나면 굉장히 당황할 수 있다. 왜 얼마 전까지 정상적으로 빌드되던 소스코드들이 문제가 생기는거지 하고 말이다... 이전까진 전혀 문제 없이 빌드가 됐다면 File > Packages > Reset Pachage Caches를 해보자! 이러면 생각보다 간단하게 해결할 수 있다. 현재 Xcode 버전을 14.3을 사용하고 있는데 Rosetta를 끄고 테스트할 일이 있었다. 그래서 여느 때와 같이 Finder > 응용 프로그램으로 가서 Xcode를 우클릭한 후 정보 가져오기를 눌렀다. 아니 그런데 Open using Rosetta가 갑자기 사라진게 아닌가...?? 뭐지 싶어서..

다이나믹 아일랜드가 있는 iPhone 14 Pro와 iPhone 14 Pro Max의 경우 아래 이미지처럼 다이나믹 아일랜드 상단에 공간이 생기게 되었다. 일단 기존에는 노치 부분까지 화면에 꽉 채우기 위해 StatusBar의 높이만큼 collectionView의 contentInset.top을 음수로 줘서 위로 올라가도록 구현했었다. let statusBarHeight = window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0 collectionView.contentInset.top = -statusBarHeight 여기서 statusBarManager의 경우 iOS 13부터 사용이 가능한 프로퍼티이다. 하지만 다이나믹 아일랜드가 생기면서 ..

설정 화면을 리뉴얼하면서 각 Section 별로 Content, 즉 셀을 넣을 때 Inset을 줘야 했다. 다만 각 셀 별로 ContentInset이 들어가는 것이 아니라 처음과 마지막 셀의 top과 bottom에 inset을 줘야 했다. 셀 별로 Content Inset이 필요했다면 아주 간단하게 해결이 가능하다. 각각의 Cell에서 아래처럼 해주면 된다. override func layoutSubviews() { super.layoutSubviews() contentView.frame = contentView.frame.inset( by: UIEdgeInsets(top: 10, left: .zero, bottom: 10, right: .zero) ) } 기존 셀의 ContentView.frame에서 ..