iOS 개발

    [UIView] 정말 예쁜 blur Effect

    [UIView] 정말 예쁜 blur Effect

    iOS7 에서였나?? 어느순간부터 애플에서 뒷 배경을 흐리게 하면서 그 위에 다른 view를 띄워서 계층감을 주는 UI를 주력으로 밀었죠..ㅎㅎ 저는 그때 대학입시를 준비하고 있었는데, 학원에 설치되어있는 아이패드를 보면서 갑자기 UI디자인이 너무 바뀌어서 며칠동안을 아이패드 앞에서 이것저것 만져봤던 기억이 있습니다ㅎㅎ 뭔가 밋밋한 미완성의 느낌이 나면서도 예뻤던 느낌... 아니 어떻게 이렇게 확 바뀐 UI를 출시할 수 있지?? 시장반응이 무섭지 않나? 라는 생각도 해봤었습니다. 하지만 정말 예쁘다고 생각했고, 그때만큼은 아니지만, 지금도 이 효과를 쓰면 정말 예뻐질 것 같은 순간들을 만납니다. 이번에 작업했던 앱에서는 이렇게 도형을 클릭하면 도형의 상세정보가 나오는데, 뒤에 블러처리를 하니 정말 예쁜 ..

    [Swift] App 첫 로딩을 감지하는 법 (first loading detection)

    [Swift] App 첫 로딩을 감지하는 법 (first loading detection)

    앱의 최초실행을 감지하는 방식은 중요합니다. 첫 실행을 할 때 회원가입을 유도하거나, 유저에 대한 정보를 받아오거나, 도움말을 띄워주는 등의 작업을 수행해야 하기 때문입니다. 유저의 첫 로딩은 UserDefault를 이용해서 감지합니다. 로직은 매우 간단합니다. bool type의 userDefaults 값은 처음 생성될 때, default로 Flase값을 가지고 있습니다. 생성된 이후에는 이미 가지고 있는 값을 계속 가지고 옵니다. let launchedBefore = UserDefaults.standard.bool(forKey: "launchedBefore") 이렇게 앱을 실행할때 가장 먼저 실행되는 init page에 다음과 같은 변수를 선언합니다. 이 변수는 "lauchedBefore"이라는 ke..

    [Swift] 앱 안에서 메일 보내기

    [Swift] 앱 안에서 메일 보내기

    앱 안에서 메일을 보내는 방법은 다음과 같아요!! canSendMail을 통해, 메일을 보낼 수 있는 상태인지를 확인합니다. 만약에!! Mail 앱이 안깔려있거나 하면 메일을 못보내겠죠?? 그럼 canSendMail이 False로 들어가서 메일 전송 실패를 내뱉습니다. MFMailComposeViewController 은 이미 그 자체로 메일을 보내는 틀을 완성해 놓고 있어서, 우리는 메일 보낼 주소, 제목, 내용 정도만 미리 적어놓고, func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) 이 함수를 통해 메일 보내는걸 성공하고 나..

    [GestureRecognizer] Gesture 잘 사용하기 - 동시에 여러 gesture 사용하기, 주의점

    [GestureRecognizer] Gesture 잘 사용하기 - 동시에 여러 gesture 사용하기, 주의점

    제스처를 사용하는 방법은 간단합니다. 자! 저는 지금부터 infoView라는 제가 만든 View에 왼쪽으로 Swipe했을 때 어떤 동작이 실행되도록 해보겠습니다!! 먼저 우리는 제스처 인식기를 만들어주어야 합니다. let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(infoviewSwipeLeft)) 여기서 만든 제스처 인식기는 제스처가 인식되면 infoviewSwipeLeft 라는 @objc 함수를 실행합니다!!! 이 함수의 내용은 우리가 구현하기 나름이겠죠?? 자 그럼 어떤 제스처이냐?? 우리는 UISwipeGestureRecognizer라는 제스처 인식기를 만들었죠? 그러면 이 제스처 인식기의 방향을 다음과 같이 설정해줄..

    [UICollectionView] View를 하나씩 넘기기, 여러개씩 넘기기

    [UICollectionView] View를 하나씩 넘기기, 여러개씩 넘기기

    우리가 보는 많은 앱들에는 CollectionView가 생각보다 핵심적인 기능으로 들어가는 경우가 많습니다. Netfilx 앱에서 옆으로 밀어서 영화를 탐색할 때, coupang에서 찜한 목록 등을 볼 때 등 컬렉션 뷰는 테이블 뷰가 하는 일을 모두 할 수 있으면서도 레이아웃까지 가지고 있어서 수직 스크롤 뿐만 아니라 수평 스크롤도 가능합니다. 하지만 아래 앱처럼, 하나씩 넘기는 건 어떻게 구현할 수 있을까요?? 하나씩 넘기고, 현재 내가 보고 있는 collectionView의 index가 어떤 인덱스인지까지 확인하는 방법은 무엇일까요? 일단 주우우우욱 스크롤이 되는 collectionView는 만들 수 있을 겁니다. tableView를 만들 수 있다면, 분명히 쉽게 가능할 것입니다. 하지만 지금 내가 ..

    [CoreData] Coredata 자체를 sort 할 수 있을까?

    [CoreData] Coredata 자체를 sort 할 수 있을까?

    내부적으로 어떻게 저장되는지에 대해서 작성하자. 그리고 항상 빼내고 나서 sort 해서 사용하는지? 데이터 자체를 sort 된 채로 가지고 있을 수는 없는지? 누군가는 linked list를 제안함. https://stackoverflow.com/questions/2744997/default-sorting-with-core-data Default Sorting with Core Data This could well be a real stupid question, but I can't seem to sort my Core Data fetched results in the order they were saved to the persistent store. Effectively, I don't want to ..

    [Swift] appDelegate 참조 안전하게 하기

    [Swift] appDelegate 참조 안전하게 하기

    우리는 종종 App delegate에서 선언된 instance들을 사용해야 할 때가 있다. 보통은 다음과 같이 강제추출을 사용하게 된다. UIApplication.shared.delegate as! AppDelegate 하지만, 우리의 두뇌에서 괜찮다고 외쳐도 강제추출을 쓰는 것은 좋지 않다. (사바사 상바상 이라고는 하지만, 멘토님께 쓰지 않는 습관을 들이는게 좋다고 배웠다.) 설명은 다음의 persistentContainer를 가져오는 예시를 통해서 하겠다. App Delegate 에는 persistentContainer가 다음과 같이 선언되어 있을 것이다. import UIKit import CoreData @main class AppDelegate: UIResponder, UIApplication..

    [UIImageView] image 색 변경하기

    [UIImageView] image 색 변경하기

    우리가 이런 system Image의 색을 자유롭게 변경할 수 있듯이, 우리가 직접 넣은 이미지도 색을 변경할 수 있다. 방법은 다음과 같다. 1. 먼저 Image를 template Image 상태로 rendering해준다. template 상태에서 tint color을 수정해줄 수 있다. testImageView.image = UIImage(named: "TEST_IMAGE")?.withRenderingMode(.alwaysTemplate) 2. 이제 image의 tint color을 자유롭게 수정할 수 있다. testImageView.tintColor = .blue image의 색을 변경하는 아주 간단한 코드를 만들어보았다. import UIKit class ViewController: UIViewC..

    [Swift UI] @State에 대한 아주 얕은 고찰

    [Swift UI] @State에 대한 아주 얕은 고찰

    @State는 구조체 내부의 값을 변경할 수 있도록 해주는 역할을 합니다. 기본적으로 우리는 struct가 한번 생성되면, 내부에서 값을 바로 변경할 수는 없었죠? C++과 같은 여러 객제지향 언어에서 구조체 안의 변수값을 변경해주 역할을 하는 함수를 mutating 키워드로 선언했던 기억을 떠올리면 쉬울 거에요! 근데 왜 mutating이 있는데, 굳이 변수 앞에 @State를 쓸까요? 답은 재참조에 있습니다!! mutating func으로 변경된 변수는 View가 destroy 되는 순간, 다시 초기값으로 돌아가게 됩니다ㅎㅎ 하지만 @State 변수의 경우 view가 destroy 된 이후에도 해당 값을 재참조한다는 차이점이 있습니다. 조금더 자세히 설명하자면 @State 키워드 변수는 실제로 값이 ..