일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Human interface guide
- tableView
- Protocol
- uiscrollview
- clean architecture
- collectionview
- swiftUI
- Clean Code
- Observable
- swift documentation
- 애니메이션
- 리펙터링
- 리펙토링
- ribs
- Refactoring
- Xcode
- 리팩토링
- SWIFT
- RxCocoa
- HIG
- map
- 클린 코드
- UICollectionView
- combine
- rxswift
- UITextView
- 스위프트
- uitableview
- MVVM
- ios
- Today
- Total
목록전체 글 (1639)
김종권의 iOS 앱 개발 알아가기
키보드와 safeAreaSwiftUI를 사용하면 키보드가 등장할 때 safeArea의 영역이 변경됨키보드가 올라올 때 별다른 처리가 없어도 키보드가 올라올 때 safeArea가 동적으로 키보드 위로 변하면서 같이 올라가는 것 전체 코드) struct ContentView: View { @State private var text = "" var body: some View { VStack { Spacer() Text("safeArea 예제") .padding() TextField("여기에 텍스트를 입력하세요", text: $text) .textFiel..
gesture 동작 개념gesture는 거의다 아는 것이지만, 특성이 존재gesture가 즉각 이벤트가 감지되지 않고 일정 시간 0.3초 정도의 딜레이를 두고 그동안 입력된 이벤트를 총괄하여 어떤 제스처인지 파악만약 2번 탭 제스쳐와, 1번 탭 제스쳐가 같이 등록되어 있다면 ex) 2번 탭 제스쳐와, 1번 탭 제스쳐가 같이 등록된 케이스gesture는 일정 딜레이를 두고 감지되므로, 2번 탭했을 때 첫번째 탭에 바로 1중 탭 제스쳐가 감지되지 않고 2중 탭 제스쳐가 감지됨빠르게 2번 탭하면 2중 탭 이벤트만 감지되고, 1번만 탭하면 1중 탭 이벤트만 감지.gesture(TapGesture(count: 2).onEnded { message = "Tap twice!" boxColor = .oran..
컨텐츠 크기만큼 크기 조절 방법ex) 내부 컨텐츠만큼 크기가 조절되지 않는 경우struct ContentView: View { var body: some View { HStack { Text("Test") .font(.largeTitle) RoundedRectangle(cornerRadius: 12) .fill(Color.blue) } }}(왼쪽 Text 높이만큼 오른쪽 파란색 뷰의 세로 길이를 맞추는 방법?)fixedSize(horizontal:vertical:)을 사용하면 콘텐츠 크기만큼 크기 고정이 가능struct ContentView: View { ..
키보드와 동시에 뷰 올리기"키보드와 텍스트필드 거리가 최소 50은 유지해주세요"키보드가 올라가는 동시에, 키보드 상단과 텍스트 필드 하단의 거리가 최소 50이상 되도록하는 방법?ex) 스크롤 처리를 해주지 않으면 키보드가 올라가고 아무런 처리가 없는 경우 텍스트필드가 영역이 가려짐키보드와 동시에 뷰 올리는 방법autolayout을 사용한다면 keyboard safe area를 사용하거나 scrollView.contentInset.bottom를 동적으로 수정해주어도 되지만 다른 방법이 존재키보드가 올라갈 때, 텍스트필드의 maxY좌표와 키보드의 높이를 계산해서 scrollView.setContentOffset(_:animated:)를 사용해도 자연스럽게 동작구현뷰 준비뷰를 레이아웃 구성하는 부분은 핵심부분..
convert란?상대좌표를 구하고 싶을때 사용하는 것"특정 뷰를 기준으로, y좌표가 얼마나 떨어져 있는가?""aView의 (0, 0) 좌표는 디바이스 전체 화면을 기준으로 좌표값이 무엇일까?"ex) aView.origin의 좌표가 디바이스의 origin으로 부터 얼마나 떨어져 있는가?self.view관점에서 aView.origin은 얼마나 떨어져 있는가를 구할 때는 aView.origin으로만 구할 수가 없음이럴때 convert(_:to:)함수를 사용하여 계산이 가능좌표의 원점이 될 기준이 되는 뷰는 to 파라미터에 넘기기let aView = { let v = UIView(frame: CGRect(x: 100, y: 100, width: 200, height: 200)) v.background..
1. Canvas 개념 (그림 그리기, Path)2. Canvas 사용 방법 (fill, stroke) 이전 글에서 알아본 대로 (아래처럼 Canvas를 선언하여 사용 준비)struct ContentView: View { var body: some View { Canvas( opaque: true, colorMode: .linear, rendersAsynchronously: false ) { context, size in context.opacity = 0.3 ... } .frame(width: 300, height: 500) }}fill을 사용..
1. Canvas 개념 (그림 그리기, Path)2. Canvas 사용 방법 (fill, stroke)Canvas 개념SwiftUI에서 2D 그래픽을 그리기 위해 사용되는 뷰View타입이므로 아래처럼 선언하여 사용이 가능인수로 주어지는 context와 size를 사용하여 그림을 그리는 것struct ContentView: View { var body: some View { Canvas( opaque: true, colorMode: .linear, rendersAsynchronously: false ) { context, size in context.opacity = 0.3 ...
플러그인 패턴핵심 기능을 변경하지 않고도 새로운 기능을 추가하거나 확장할 수 있도록 하는 구조적 패턴유연성과 확장성이 높다는 장점플러그인 패턴 구조ex) 계산기 로직을 플러그인 패턴으로 만들기PluginManager가 있고 여기서는 핵심 기능을 담당하며, 이곳에 추가하고 싶은 기능(플러그인)들을 등록하고 실행할 수 있는 관리자 역할let pluginManager = PluginManager()플러그인 인스턴스를 만들어서 플러그인에 등록let additionPlugin = AdditionPlugin()let multiplicationPlugin = MultiplicationPlugin()pluginManager.registerPlugin(additionPlugin)pluginManager.registerP..