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

ScrollView안에 Spacer 적용하는 케이스ScrollView안에 Spacer를 잘 활용해야하는 아래와같은 경우가 존재ex) button은 항상 디바이스 하단에 떠 있고, 그 뒤에 스크롤되는 2개의 텍스트가 있는 경우 ("iOS앱 개발 알아가기", "jake") 상단의 Text가 짧을때는, "jake" Text는 하단 SafeArea로 부터 56만큼 간격 유지상단의 Text가 길어져서 스크롤이 많이 가능하게되면 "jake"는 스크롤 영역이므로 스크롤 밑쪽에 위치상단이 짧은 텍스트상단이 긴 텍스트f구현방법은 상단 Text와 하단 Text 사이에 Spacer()를 넣고, 하단 패딩을 주는 방법이 있는데, ScrollView안에 Spacer()를 그대로 사용하면 동작하지 않음ex) ScrollView안..

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..