분류 전체보기 57

[iOS] 이미지 파일 Bitmap, Vector 방식 적재적소에 사용하기

Xcode로 개발하시면서 이미지 파일을 individual scales로 png파일을 넣을 때도 있고, single scale로 pdf파일을 넣어서 개발하신 적이 있으실겁니다. 하지만 문득 어느날 저도 모르게 single scale로 작업할 때도 있고, individual scales로 1x, 2x, 3x파일을 넣어 작업할 때도 있었습니다. 그래서 이번 포스팅에서는 이 두개의 차이점을 알아보고자 합니다. 이미지 표현 방식 이미지 표현 방식에는 비트맵(Bitmap)과 벡터(Vector)방식이 있습니다. 비트맵(Bitmap) 방식 비트맵 방식은 사각형의 픽셀이 모여 만들어진 이미지입니다. 그렇기 때문에 경계가 뚜렷하지 않고 확대했을 때 깨짐현상이 있습니다. 확장자로는 png, jpg, gif가 있습니다. 주..

iOS 2020.01.05

[iOS] UITableView에서 리로드할 때 스크롤 포지션 어긋나는 이슈

해당 이슈는 UITableView의 셀 높이들이 동적일 때 리로드할 때 스크롤 위치가 이상한 곳으로 설정되어집니다. 유연하고 부드러운 테이블뷰를 만들기 위해서는 heightForRowAt, estimatedHeightForRowAt 모두 적절히 지정되어야합니다. estimatedHeightForRowAt를 잘 지정해줘야 리로드할 때 예상한 셀 높이에 따라 스크롤 포지션이 정해집니다. 해결 방법 셀 높이를 저장할 프로퍼티를 추가하여 willDisplay에서 셀 높이를 저장하고, estimatedHeightForRowAt에서 저장한 셀 높이를 반환하여 해결. // MARK: - Property private var cellHeights: [IndexPath: CGFloat] = [:] // MARK: - w..

좋은 코드리뷰란?

리뷰할 코드는 가능한 300줄 이하로 작게 유지하기. 코드가 많을 경우 더 작은 덩어리로 나누는 습관 기르기. 너무 큰 작업을 커밋하기 보다는 작은 단위로 자주 커밋하기. PR보낼 때 목적을 분명하게 전달하기. 리뷰기간은 최대한 빠르게. PR에 설명이 부족하면 리뷰 시작 전 설명 구하기. (시간 절약할 수 있음) 좋은 리뷰어는 효율적인 코드를 작성하여 예제까지 제공하기. 결론 코드리뷰는 함께 성장하는 과정이라고 생각합니다. 모르는 것을 부끄러워하지 않고 서로 도움이 되고 건설적인 방식으로 피드백을 주고 받는 것이 중요!

Common 2020.01.05

[Github] UserInterfaceState.xcuserstate파일 Git Tracking 중단하기

Xcode를 이용하여 프로젝트를 진행하시다보면 스테이지 파일에 이 파일이 포함되어 있는 경우가 많으셨을겁니다. 도대체 UserInterfaceState.xcuserstate파일은 뭔가요? 이 파일은 workspace/project document layouts 상태를 저장하고 있는 파일입니다. Tracking에서 제외시켜도 상관 없나요? 이 파일은 로컬시스템 기반으로 데이터가 생성되고 쉽게 재구성되어 파일이 생성됩니다. 혼자 작업한다면 지속적으로 동기화해도 되지만, 협업을 진행하는 경우에는 이런 상태를 굳이 동기화시킬 필욘 없다고 생각합니다. Git에서 Tracking 제외 시키기 git rm --cache */UserInterfaceState.xcuserstate git commit -m "Remove..

Github 2020.01.05

[Swift] Extension(확장)으로 코드 가독성 올리기

안녕하세요. extension을 잘 사용하여 코드 가독성을 올릴 수 있는 방법을 간단하게 소개하려고 합니다. extension은 언제 사용하는가? extension(확장)은 기존 클래스, 구조체, 열거형, 프로토콜 타입에 새로운 기능을 추가할 때 사용합니다. 구성 및 예제 뷰컨트롤러는 많은 코드를 포함하고 있기 때문에 extension(확장)을 올바르게 사용하면 코드 구성을 크게 향상 시킬 수 있습니다. 일단 크게 Class Block, Private Extension, Protocol Extension 이렇게 분리할 것입니다. 1. Class Block 여기에는 private, public, 오버라이드 메소드, 생명주기 등 내부 메소드가 있는 부분입니다. final class ViewController..

Swift 2020.01.05

[Swift] 구조체란 무엇인가?

구조체란? 프로퍼티 값을 저장하거나 메소드를 제공하고 이것들을 캡슐화하여 표현하는 타입입니다. 구조체는 인스턴스가 값(Value) 타입입니다. 즉, 메모리가 공유되는 것이 아니라 인스턴스가 복사되는 것을 의미합니다. (원본을 변경해도 복사본에는 영향을 끼치지 않음) 특징 - 참조카운트가 없어서 메모리 관리에 안전하다. - 레퍼런스 타입이 아니여서 데이터 공유가 불가능하다. - Immutable 구현에 안전하다. - 상속이 불가능하다. - 클래스 보다 인스턴스 생성이 빠르다. 언제 쓰는 것이 좋은가? - 데이터를 참조하는 것 보다 복사하는 것이 합당할 때 - 데이터 공유가 필요 없는 경우 - 작고 간단한 데이터 - Immutable 구현이 필요한 경우 - 상속받거나 자신을 상속할 필요가 없을 경우

Swift 2020.01.03

[Swift] 델리게이트(Delegate) 패턴이란

델리게이트 패턴이란? 하나의 객체가 모든 일을 처리하는 것이 아니라 어떤 객체가 해야하는 일을 부분적으로 확장해서 대신 처리하는 것을 뜻합니다. 언제 사용해야하는가? 하나의 객체가 해야하는 일이 여러가지일 때 사용하는 것이 적합합니다. 그 외 객체간 소통할 수 있는 방법 Notification은 한 객체의 변화를 여러 객체들이 관찰해야하는 경우. 즉, 수신받는 객체가 많을 때 사용합니다. Closure같은 경우에는 콜백 블럭을 받기 위한 목적이 분명할 때. 즉, 내부의 블록을 호출시키는 코드를 읽고 다시 돌아와서 추적할 일이 없는 경우일 때 주로 사용합니다. 사용할 때 주의사항 Delegate 프로퍼티 변수를 약한 참조(weak)를 사용하지 않는다면 Strong Reference Cycle, 즉 메모리 ..

Swift 2020.01.03

[iOS] Bounds와 Frame의 차이점

UIView의 Instance Property 중 Frame 과 Bounds가 있는데 이 두개의 차이점에 대해서 알아보겠습니다. Frame https://developer.apple.com/documentation/uikit/uiview/1622621-frame frame - UIView | Apple Developer Documentation The frame rectangle, which describes the view’s location and size in its superview’s coordinate system. developer.apple.com SuperView의 좌표를 기준으로 View의 위치와 크기를 나타낸다. x, y 좌표를 변경하게 되면 자기 자신의 위치가 변경된다. Bounds..

iOS 2020.01.03

[iOS] Cocoa Touch, Foundation, UIKit Framework에 대해서

안녕하세요. 이번 글에서는 iOS 애플리케이션 개발환경 토대인 코코아 터치 프레임워크와 그 하위 레벨 프레임워크인 UIKit, Foundation에 대해 알아보려고 합니다. Cocoa Touch Framework https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/Cocoa.html Cocoa (Touch) Retired Document Important: This document may not represent best practices for current development. Links to downloads and other resources may no longer be va..

iOS 2020.01.03