일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 애니메이션
- 리펙터링
- uiscrollview
- Refactoring
- UICollectionView
- MVVM
- Protocol
- map
- SWIFT
- Human interface guide
- 리펙토링
- UITextView
- combine
- 리팩토링
- ribs
- swift documentation
- collectionview
- ios
- HIG
- uitableview
- Clean Code
- rxswift
- swiftUI
- clean architecture
- Observable
- 스위프트
- tableView
- RxCocoa
- Xcode
- 클린 코드
- Today
- Total
목록전체 글 (1650)
김종권의 iOS 앱 개발 알아가기

Protocol 활용하여 모델 구성하는 방법프로토콜의 기능이 여러가지 있지만 그중에 모델을 구성할 때 유용하게 사용이 가능한 프로젝트에서 여러명의 개발자들이 동시에 일을 진행할때, 모델에 대한 구성을 어떻게 할 것인지 의사결정을 할때도 프로토콜을 활용하면 중복 모델 최소화가 가능사용하는 쪽에서 필요한 정보들을 Protocol로 정의하고 공통 모델에 이 Protocol을 준수하는 방법ex) Cafe라는 정보를 가지고 있는 모델과 API가 아래와 같은 경우struct Cafe { /// 카페 이름 let name: String /// 카페 위치 (주소) let location: String /// 영업 시간 (예: "08:00 AM - 10:00 PM") let..

부모 뷰와 자식 뷰 사이의 애니메이션 처리 원리토글 버튼이 있고 이걸 누를때마다 Text의 문자가fade효과를 내면서 새로 등장하는 애니메이션을 준다고 한 경우 아래처럼 작성이 가능struct ContentView: View { @State var toggle = false var body: some View { VStack { Button("updown Toggle") { toggle.toggle() } Text(toggle ? "is toggled" : "not toggled") .animation(.smooth(duration: 1), val..
뷰 주입받는 방법 3가지 특성단점 1. generics최적화 유지, 타입 안전뷰 타입이 고정됨⭐ 추천2. AnyView동적 뷰 변경 가능성능 저하 가능성⚠️ 가능하면 피할 것1. generics 방법View를 준수하는 타입으로 한정하여, 제네릭을 선언하는 방식최적화가 유지되는 장점// 주입받은 뷰를 표시하는 컨테이너struct ContainerView: View { let content: Content var body: some View { VStack { Text("현재 뷰") .font(.headline) content } .padding() .background(Color...

Spacer(minLength:) 개념Spacer 컴포넌트는 유연적으로 늘어나도록 설계되어 공백 처리를 쉽게하기 위한 컴포넌트공백을 주려고 할 때, 구체적인 수치를 주어서 공백을 유지시키는 케이스가 있고, 공백은 최소 몇 이상만 유지하는 UI를 구현하는 경우가 있는데, 공백을 최소 유지시키려고 할 때 Spacer를 사용하는 것Spacer(minLength:)는 컴포넌트 우선순위가 높아서, 다른 콘텐츠가 길어졌을때 minLength만큼은 침범하지 않게끔 하는 성격이 있음Spacer를 사용할 때 실수하는 점Spacer(minLength:)는 단어 그대로 minLength값을 받아서 최소 크기만 유지시키고 동적으로 늘어나는 컴포넌트때때로 공백을 고정시키려고 할 때 Spacer(minLength:)를 사용하고 ..

그라데이션 넣는 방법SwiftUI의 LinearGradient를 사용하여 그라데이션 적용LienearGradient는 단어 그대로 선형적인 그라데이션이며, 3가지의 init이 존재@available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *)@frozen public struct LinearGradient : ShapeStyle, View, Sendable { public init(gradient: Gradient, startPoint: UnitPoint, endPoint: UnitPoint) public init(colors: [Color], startPoint: UnitPoint, endPoint: UnitPoint) public init(..

if, else 문을 쓰는 케이스만약 아래처럼 버튼을 눌렀을 때 특정 뷰에 애니메이션을 주어야하는 경우?구현 아이디어뷰를 만들 때 if, else문이 없이 아래처럼 animation을 주는 방법도 존재버튼이 눌릴때마다 isFlipped 값을 변경@State var isFlipped = falseText("🚀 SwiftUI Power!") .font(.largeTitle) .fontWeight(.bold) .foregroundColor(isFlipped ? .blue : .purple) .scaleEffect(isFlipped ? 1.5 : 0.5) .rotationEffect(.degrees(isFlipped ? 360 : -180)) .opacity(isFlipped ..

SwiftUI에서 키보드 높이 구하는 방법Combine을 사용하지 않으면 KeyboardInfo라는 클래스에서 기존 UIKit방식대로 NotificationCenter로 등록하는 방법이 있음public class KeyboardInfo: ObservableObject { public static var shared = KeyboardInfo() @Published public var height: CGFloat = 0 private init() { NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardChanged), name: UIApplication.keyboardWillS..

deprecated 옵션 기초 개념만약 새로운 함수가 필요하여 기존에 사용하던 함수는 deprecated되었다는 의미를 개발자에게 주고 싶은 경우 아래처럼 @availble(*, deprecated)를 사용하여 알려주는 방법이 존재class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() deprecatedFunc() deprecatedFunc2() } @available(*, deprecated) func deprecatedFunc() { } @available(*, deprecated, message: "새로운 A ..