분류 전체보기 67

Wrapped Image Text

흔히 워드를 사용하면 이미지를 글자저럼 취급하여 이미지를 글자 왼쪽이나 중간 사이사이에 배치하는 구성을 확인할 수 있다. iOS에서는 어떻게 구현해야 할지 고민해보다 기사앱을 다뤄보다 직접 구현해본 내용을 정리하려 한다. 보통 아래와 같은 이미지처럼 구성된다. 구성은 아래와 같다. 구현방안 1. 처음 생각한 방안으로는 UILabel의 UIAttachment클래스를 사용하여 이미지를 추가할 수 있는 옵션이 존재하여 AttributedString의 속성으로 image를 넣어주었다. 하지만 구현결과 이미지를 글자하나의 크기로 인식하여 이미지가 커지게 되면 이미지의 하단라인 기준으로 글자가 이어지게 되어 원하던 구현 화면구성이 되지않았다. -구현 실패 2. textView의 속성에 혹시 답이있을지 고민하다 Te..

swift 2022.10.10

Biometric Authentication

Biometric Authentication(생체인증) 흔히 간단하게 로그인하거나 비밀번호를 입력해야할 경우 생체인증(Touch ID, Face ID)을 많이 사용한다. 생체인증에 대해 간단하게 구현해보려고 한다. Local Authentication 생체인증을 사용하려면 LocalAuthentication Framework를 사용하여 구현한다.(iOS8이상부터 사용 가능) LAContext(인증 정책 및 접근권한을 설정)을 사용하여 구현 evaluatePolicy(_ policy: LAPolicy, localizedReason: String, reply: @escaping (Bool, Error?) -> Void) LAContext의 메서드로 policy정책과 인증메세지, 콜백으로 인증성공여부와 Err..

swift 2022.08.31

DropDown 오픈소스 라이브러리 만들기

cocoapods, SPM등 오픈소스 라이브러리들을 많이 사용해 보면서 오픈소스 라이브러리에 관심이 생겼고 직접 만들어 보고싶다는 생각이 들었다. 만들어볼 라이브러리는 DropDown으로 이전 프로젝트에서 iOS에서 기본적으로 제공해주지 않아 외부 라이브러리를 사용했던 기억이 있는데 이번 기회에 custom하게 만들어 사용해보도록 하겠다. 라이브러리 만들기 먼저 프로젝트를 만들 경로로 이동하여 pod lib create '라이브러리이름' 으로 생성 $ pod lib create '라이브러리이름' 위와같이 만들면 아래와 같이 기본 설정에 대해 묻고 용도에 맞게 설정한다. 생성하면 아래와 같이 프로젝트가 생성되며 Example for DropDownSw에서 테스트도 가능하다. Pods-Development ..

swift 2022.08.10

XcodeGen으로 프로젝트 관리하기

XcodeGen 팀프로젝트안에서 버전관리시 폴더 그룹변경 및 리소스 변경 시 [프로젝트명].xcodeproj 파일의 변경사항이 올라가면서 서로 충돌나는 경우가 종종 있다. xcodeproj파일은 xml로 이루어져 있어 직접 충돌을 해결할 수 도 있지만 워낙 복잡하게 변경사항이 바뀔 시 충돌해결하는데 꼬일수가 있고 휴먼에러가 발생할 수 있다. 이 때 XcodeGen을 사용하여 프로젝트를 관리하면 xcodeproj파일이 각자 빌드하여 사용하기 때문에 충돌날 일이 줄어들어 팀프로젝트시 빠르게 협업할 수 있는 큰 장점이 된다. 이외에도 target별로 dependency를 관리하거나 프로젝트 Settings를 project.yml에서 한번에 관리할 수 있는 장점이 있다. XcodeGen설치 $ brew inst..

Xcode 2022.07.25

Custom ScrollPaging

Custom ScrollPaging UICollectionViewFlowLayout의 targetContentOffset을 overriding 하여 paging 설정 targetContentOffset(forProposedContentOffset:, withScrollVelocity:) 파라미터인 forProposedContentOffset, withScrollingVelocity 사용 forProposedContentOffset: 스크롤하고 난 뒤의 적절한 offset을 사용 withScrollingVelocity: Scroll에 따른 velocity(왼쪽 스크롤 -, 오른쪽 스크롤 +) CollectionView Paging예시 class SnappingCollectionViewFlowLayout: ..

swift 2022.06.05

RxDataSources

RxDataSources TableView, CollectionView를 Section을 사용해서 정의가능한 프레임워크 Rx를 사용한 반응형 데이터 적용 cellForRowAt을 사용하지 않고 cell데이터 지정 Link Section정의 RxDataSource에 사용될 DataType은 SectionModelType을 준수 items는 cell데이터 타입 등록 struct SectionOfMain { var items: [Item] } extension SectionOfMain: SectionModelType { typealias Item = MainCellData init(original: Self, items: [Item]) { self = original self.items = items } } ..

swift 2022.05.07

RxFlow

RxFlow란 Reactive Flow Coordinator패턴을 기반으로 하는 iOS 네비게이션 프레임워크 Coordinator패턴을 RxSwift에 녹여낸 라이브러리 RxFlow의 장점 스토리보드를 unit단위로 분리하여 UIViewController의 재사용 가능 네비게이션 흐름에 따라 다양한 방식으로 UIViewController를 나타낼 수 있음 DI(의존성 주입)을 쉽게 구현 가능 UIViewController로부터의 모든 네비게이션 메커니즘 제거 반응형 프로그래밍 사용 증대 모든 네비게이션 케이스의 주요한 부분을 선언적으로 표현 가능 어플리케이션을 논리적인 블록으로 분리 Coordinator패턴과의 차이 Coordinator패턴의 특징 UIViewController부터의 네비게이션 코드 제거..

RxSwift 2022.03.30

RxSwift UnitTest 해보기(RxTest, RxNimble)

프로젝트 목표 프로젝트의 아키텍처는 MVVM패턴에 RxSwift를 적용한 구조(참고) RxTest와 RxNimble을 사용하여 스트림에 테스트 값을 주입하여 expect로 output(Count값)비교 프로젝트 구조 -, +버튼으로 값을 count하는 간단한 프로젝트 ViewModelType 선언 protocol ViewModelType { associatedtype Input associatedtype Output func transform(input: Input) -> Output } ViewModel 구조 ViewModelType을 채택하는 ViewModel 선언 class CountViewModel: ViewModelType { let disposeBag = DisposeBag() struct I..

swift 2022.03.10