2021 Monthly I Learned - kirseia/study GitHub Wiki
2021. 12
- SwiftUI ์์ ๋ณด์ด๋ ์์ญ clipping ์ .clipped() ์ด๊ณ , ํฐ์น ์์ญ clipping ์ contentShape ๋ฅผ ์ฌ์ฉํ๋ค.
- ์ด๋ฏธ์ง๊ฐ ๊ฐ๋ก๋ก๊ธธ์ด์ .clipped() ๋ฅผ ์ฌ์ฉํด์ ์ค์์ผ๋ ํฐ์น ์์ญ์ด ๋ค๋ฅธ ๋ฒํผ์ ์นจ๋ฒํด์ ํฐ์น๊ฐ ์๋๋ ์ด์๊ฐ ์์์ (.clipped() ํ๊ณ .contentShape() ๋ฅผ ๊ฐ์ด ์ฌ์ฉํด์ ํด๊ฒฐ)
- SF Symbols - symbolVariant(_:) methods (from iOS15)
2021. 11
- Open Font License - OFL, SIL Open Font License
- ํฐํธ ์์ ํ ํ๋งค๋ ๊ธ์ง, ์์ ์ ์ด์ฉ๋ ๊ฐ๋ฅ, ์ ์๊ถ์ ๋ช ์ ํ์ (๋ผ์ด์ ์ค ํ ์คํธ ํฌํจ ์ฒ๋ฆฌ)
- Disable dark mode for an entire app
- SwiftUI ์ ๋๋ฉ์ด์ ๊ตฌํ
- Apple Login - Firebase ์ฐ๋ํ๊ธฐ
- iOS 15์ ์ถ๊ฐ๋ ๊ธฐ๋ฅ๋ค, 2
- TimelineView ๋๋ฌธ์ ์ฐพ์๋ด. TimelineView ์ํ
- Framework -> Swift Package Manager๋ก ๋ณํํ๊ธฐ
- ๋ณํ์ ์ข ์ ๋งค, spm init ํด์ source ์ด๋์ฒ๋ฆฌํ๋๊ฒ ๋ ๋น ๋ฅด๊ฒ ๋ณํ ๊ฐ๋ฅ, project ๋ก ๋ง๋๋๊ฑด deprecated ๋์.
- ๋ง๋ค๊ธฐ1 , ๋ง๋ค๊ธฐ2
- Dark mode best practices
- CoreData Performance Tips
- CoreData Database types - private / shared / public
2021. 10
- Swift ํต์ฌ ์ ๋ฆฌ
- SwiftUI - A/B ์์ A์ ๋ทฐ ์ฌ์ด์ฆ๋ฅผ B ์ฌ์ด์ฆ์ ๋์ผํ๊ฒ ๋ง์ถ๊ธฐ
- ์ฑ ์ถ์ ํ์ฉํ๊ธฐ ์ค์
- KeyPath
2021. 9
- SwiftUI Bottom Sheet
- iOS 15 ๋ถํฐ ์ง์ํ๋ ๊ธฐ๋ฅ
- Swift Algorithm, Swift Collections - ํ์ฉ
- iOS CPU Exception ๋์
- ์ ํ์์น Runtime Session ๊ด๋ จ ์ ๋ฆฌ
- Swift ์ ์ถ๊ฐ๋ Actor
- race condition ์ ๋ง๊ธฐ ์ํ ๊ฒ, class ๋์ actor ๋ฅผ ์ฐ๊ณ , ์ฌ์ฉ์ async/await ์ ํจ๊ป ์ฐ๊ฒ ๋๋ค.
- iOS 15์ ์ถ๊ฐ๋ SwiftUI 'task' ๊ธฐ๋ฅ
- ๋ทฐ๊ฐ ๋ํ๋ ๋ ๋น๋๊ธฐ ์์ ์ ์ํํ๋ ๋ธ๋ญ, ๊ธฐ์กด onAppear ๋ ๋ทฐ ์ฃผ๊ธฐ ๋๋ฌธ์ ๊น๋ค๋ก์ด ๋ถ๋ถ์ด ์์
- iOS 13 ์์ onChange(of: perform:) ์ฌ์ฉํ๊ธฐ
- Nested View Alert in same View - SwiftUI
- SwiftUI - @ViewBuilder
- Group / AnyView ๋์ ์ @ViewBuilder ๋ฅผ ํ์ฉํ์
- SwiftUI Alert
- SwiftUI ์์ debug pring ์ฌ์ฉํ๊ธฐ
- ์ฑ์คํ ์ด์์ ์ ๋ฃ์ฑ์ ํ๋งคํ๊ธฐ - ํต์ ํ๋งค์ ์ ๊ณ , ์ฌ์ ์ ๋ฑ๋ก๋ฒํธ ํ์
- ๋คํฌ๋ชจ๋๋ฅผ ์ดํด๊ฐ๊ธฐ ์ํ ๋์์ธ ๊ฐ์ด๋ 1 , 2
- ๊ฐ๋ฐ ๋ ์ํ๊ธฐ, ์ค๊ธ์๋ก ๊ฐ๊ธฐ ์ํ 8๊ฐ์ง ๋ฐฉ๋ฒ
2021. 8
2021. 7
- TextKit2
- ์ด๊ฑด ๋์ค์ ๊ผญ ๋ค์ ์ฝ์ด๋ด์ผํ ๋ฏ...
- SPM ๋ง๋ค๊ธฐ / ๊ณต์ ํ๊ธฐ / ์ฌ์ฉํ๊ธฐ
- SKStoreReviewController ์ฌ์ฉ
- ์ฑ ๋ฆฌ๋ทฐ๋ ์ฌ์ฉ์๊ฐ ๋ง์กฑ์ค๋ฌ์ ํ๋ ์์ ์ ์ฒดํฌํด์ (์ฑ ์คํ ํ์๋ผ๋๊ฐ, ํน์ ์ด๋ฒคํธ nํ ๋ฐ๋ณต์ ๋ฑ) ๋ฆฌ๋ทฐ ์์ฒญ์ ํ๋๋ก ํด์ผ ํจ
2021. 6
- SwiftUI - .refreshable modifier ์ถ๊ฐ (ios15)
- async / await ๊ตฌ๋ฌธ์ ํ์ฉํด์ refreshable ์ด ์ถ๊ฐ๋์
- ํ๊ฒฝ๋ณ์ - @Environment(.refresh) private var action - ๋ ์ถ๊ฐ๋จ
- CLLocationButton ๊ณต์๋ฌธ์, ํ์ฉ
- ์์น ์ ๋ณด ์ผํ์ฑ ์์ฒญ์ ๋ํ ์๋ก์ด ๋ฒํผ์ด iOS15์ ์ถ๊ฐ๋จ, ๋งค๋ฒ ์์น ์ ๋ณด๋ฅผ ์์ฒญํ๊ธฐ ์ข์, ํ๋ฒ ๊ฑฐ์ ํด๋ ์ฌ์ฉ์๊ฐ ๋ค์ ํญํ๋ฉด ๋ค์ ๋ฌผ์ด๋ด์ค๋ค.
- Custom Type Codable ๋ง๋ค๊ธฐ
- CodableByTransform extension ์ผ๋ก ๋ง๋ค์ด์ ์ข ๋ ์ฝ๊ฒ ์ฒ๋ฆฌ
- SwiftUI - SearchBar ์ถ๊ฐํ๊ธฐ
- .searchable(...) modifier ๋ฅผ ํตํด์ ์ฝ๊ฒ ๊ตฌํ ๊ฐ๋ฅ
- ์ ๊ทผ์ฑ ๊ตฌํ - iOS15
- xcode ํ๋ฆฌ๋ทฐ์์๋ ์ ๊ทผ์ฑ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ ๊ฐ๋ฅํด์ก๊ณ , ์๋ก์ด ์ ๊ทผ์ฑ ๊ด๋ จ ๊ธฐ์ / ํจ์๊ฐ ์ถ๊ฐ๋จ
- ์ ํ ๊ฑด๊ฐ๋ง 3๊ฐ์ง ๋ฐ์ดํฐ ์ ๊ทผ
- AsyncImage - (ios15 ์ด์)
- Apple Watch Complication Templates
- Firebase App Check - ์ฑ ๋ณด์ ํ์ธ
- Firebase Fastlane์ผ๋ก iOS ์ฑ ๋ฐฐํฌ
2021. 5
- ์๊ธฐ๊ฐ๋ฐ์์ ์ฑ์ฅ์ผ๊ธฐ - ์ ๊ทผ์ฑ ์ ๋ฆฌ
- CoreGraphics Pattern
- Apple Watch Haptic feedback
- ์ ๊ทผ์ฑ - ๋ค์ด๋๋ฏน ํ์ ํฐํธ - more
- Playground ์์ swiftUI ๋ฅผ ํ๋ฆฌ๋ทฐ ํ๋ ๋ฒ
- Resource SPM 2
- thread safety in swift
- iOS Search API 2
2021. 4
- WatchKit App / WatchKit App Extension ์ฐจ์ด?
- info.plist privacy ์ค์ ์ค๋ฅ - ํ ์คํธ์ฉ์ด๋ผ๊ณ ํด๋ 12๊ธ์ ์ดํ๋ฅผ ์ฐ๋ฉด ์๋ฌ๋จ
- Resources for learning SwiftUI
- ์ธ์ฑ ๊ฒฐ์ ๋ผ์ด์ผ์ค ์ฒ๋ฆฌ(๊ฒ์ฆ)
- Color & Contrast
2021. 3
- Async ImageLoader - combine
- Combine discover - ์ํฐํด ๋ชจ์
- ์ ๊ทผ์ฑ ์ง์๊ตฌํ
- ๋งฅ dmg ํ์ผ ๋ฐฐํฌํ๊ธฐ
2021. 2
- SwiftUI Custom Slider
- SwiftUI best practices
- Realm ์ ์ฌ์ฉํ SwiftUI ๊ฐ๋ฐ
- SwiftUI View Lifecycle
- Fastlane ํํ ๋ฆฌ์ผ(?)
- CollectionViewLayout ํ๋ฉด ํ์ ์์๋ง invalidateLayout() ์ ์ฉํ๊ธฐ
- AVAsset ํ์ผ์ด ์ฌ๋ก์ฐ๋ชจ์ ์์์ธ์ง ํ์ธํ๊ธฐ - Ref. https://medium.com/@xcadaverx/avfoundation-cmtimemapping-c3521d4da6b1
var isSlowMotionVideo: Bool {
guard let segments = avasset.tracks(withMediaType: .video).last?.segments else {
return false
}
if segments.count <= 1 {
return false
}
return segments.contains { (segment) -> Bool in
let timeMapping = segment.timeMapping
// 0.5๋ฐฐ์ ์ดํ์ ๊ฐ์ ๊ฐ์ง๊ฒ ์๋ค๋ฉด
return (timeMapping.target.duration.seconds / timeMapping.source.duration.seconds) > 2.0
}
}
- Navigation in SwiftUI
- AVMutableCompositionTrack.scaleTimeRange ์ค๋ฅ
let sourceTimeRange = CMTimeRange(start: .zero, duration: CMTime(value: 30, timeScale: 30))
let ratedCompositionDuraiton = CMTime(Value: 17, timeScale: 30)
try videoCompositionTrack.insertTimeRange(sourceTimeRange, of: videoAssetTrack, at: startTime)
videoCompositionTrack.scaleTimeRange(CMTimeRange(start: startTime, duration: sourceTimeRange.duration),
toDuration: ratedCompositionDuration)
์ด๋ผ๊ณ ํ์ ๋ videoCompositionTrack.timeRange.duration != ratedCompositionDuration ์ด ๋์ค๋ ๊ฒฝ์ฐ๊ฐ ๊ฐํน ์์.
์๋ฅผ ๋ค์ด, videoCompositionTrack.timeRange.duration์ด CMTime(value: 5666666667, timeScale: 1000000000)
์ด๋ ๊ฒ ๋์ค๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ, ํฌ๊ฒ ๋ฌธ์ ๊ฐ ์๋๋๊ฒ์ฒ๋ผ ๋ณด์ด๋, ์ด ๋ค์ ํธ๋์ insert ํ ๋ startTime ์ ์ ๊ฐ์ ๋ฐ์ํด์ค์ผ ํจ
๋๋, ์์
ํธ๋์ด ๋น๋์ค ๊ธฐ์ค์ผ๋ก ๋ฃ์ด์ค์ผ ํ๋๋ฐ ์ด ๊ฐ์ ๋๋ ๊ฒฝ์ฐ ์ถ๊ฐ์ ์ธ ๋ณด์ ์ด ํ์ํ๋ค
2021. 1
- SwiftUI Property Wrapper ์ ํ๋ฒ !
- Form ์์ ํค๋ณด๋ ์ฌ๋ผ์์๋ offset ์์ - SwiftUI List ๊ฐ์ด๋
- SwiftUI Segmented Progress bar ๋ง๋ค๊ธฐ
- iOS ์ฑ ์ฉ๋ ์ค์ด๊ธฐ
- iOS Code signing ์ค๋ช
- SwiftUI var body ๋ด๋ถ์์ switch ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ค
- Multicast Delegate
- ์ฌ๋ฌ๊ฐ์ delegate ๋ฅผ ๋ฑ๋กํ๋๋ฐ array๋ก ๊ด๋ฆฌํ ๊ฒฝ์ฐ ๊ฐ๊ฐ์ object๋ weak reference ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค (NSHashTable.weakObjects())
- WeakWrapper ๋ฅผ ํ์ฉํ ๋ฐฉ๋ฒ
- iOS ๋ณด์ด์ค์ค๋ฒ ์ ๊ทผ์ฑ ๊ด๋ จ ์ ๋ฆฌ 1, 2, 3, Audit ๊ธฐ๋ฅ
- iOS์์ ์๋ฆฌ์ ๋ํ ์ ๊ทผ์ฑ ๊ฐ๋ฐ์ ํด๋ณธ์ ์ด ์์ด์ ์กฐ์ฌํด๋ดค์. ์๊ฐ๋ณด๋ค ํด์ค์ผ ํ ๊ฒ ๋ง๋ค.;