목록iOS (30)
Jimmy's iOS
func getStatusBarHeight() -> CGFloat { var statusBarHeight: CGFloat = 0 if #available(iOS 13.0, *) { let window = UIApplication.shared.windows.filter {$0.isKeyWindow}.first statusBarHeight = window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0 } else { statusBarHeight = UIApplication.shared.statusBarFrame.height } return statusBarHeight }
iOS 에서 스크린샷 기능은 OS 단에서 일어나는 것이기 때문에 스크린샷 기능 자체를 막는 것은 불가능하다. 하지만 스크린샷이나 녹화 기능을 이용할 때를 캡쳐해서 알림을 주는 기능은 가능하다. UIApplicationUserDidTakeScreenshotNotification 으로 스크린 샷을 감지 가능하다. UIScreen.captureDidChangeNotification 으로 녹화 감지가 가능하다. 녹화 같은 경우 캡쳐를 할때를 캐치해서 화면을 가리는게 가능하지만 스크린샷은 캐치하는 순간보다 먼저 찍히기 때문에 화면을 가리는게 불가능 하고 캐치한 순간 앨범에 저장된 마지막 이미지를 지우는 방법도 있는데 이건 사용자가 앨범 권한을 허락 해야 가능하기 때문에 완벽하게 막는건 힘들다고 한다. 1) App..

보통 프로젝트를 하면서 한 곳(ex. ViewController) 에 너무 많은 역할을 하는 코드들이 있으면, 코드의 가독성을 방해하고 여러 팀원들끼리 협업도 힘들어 진다. 해외에서는 이런것을 ‘Massive View Controller’ 즉, View Controller 한곳에 방대한 역할을 하는 코드들이 많다는 뜻이다. 이 문제에 대한 대안으로 여러가지의 iOS Design Pattern (아키텍처 패턴) 이 있다. MVC MVVM MVP Viper ... 1. MVC 패턴 Model(모델), View(뷰), Controller(컨트롤러) 로 구성. Model에서는 애플리케이션에서 사용할 데이터들을 관리하고, View는 유저 인터페이스를 표현 및 관리한다. Controller는 View와 Model의..
iOS4 까지는 ios 기기의 고유 넘버를 UDID 를 사용하였으나 iOS5 부터는 보안상의 이유로 UDID(Unique Device Identifier) 가 사라지고 UUID (Universally Unique Identifier) 의 사용을 권장하고 있다. UUID 란 UUID 는 Universally Unique IDentifier 의 약자이고 범용 고유 식별자 라고 한다. Vender 에 따라 값을 가지게 되는데 IdentifierForVender 는 벤더 식별자 라고 한다. 앱이 달라도 Organization Identifier 가 같은 앱이면 identifierForVender 가 같다. Organization Identifier 가 같은 앱이 없다면 초기화된 값이 저장된다. UUID 의 특징..
ComparisonResult 는 enum 타입이고 그 안에는 3가지 case 가 있다. @frozen public enum ComparisonResult : Int { case orderedAscending = -1 // 왼쪽 피연산자가 오른쪽 피연산자보다 작을때 case orderedSame = 0 // 왼쪽 피연산자와 오른쪽 피연산자가 같을때 case orderedDescending = -1 // 왼쪽 피연산자가 오른쪽 피연산자보다 클때 } swift 의 compare 메소드는 ComparisonResult 타입을 리턴한다. 이에 대한 정확한 설명은 제드님의 블로그를 참고! ComparsionResult 를 활용해서 앱 업데이트 기능을 만들어보자. 1. 먼저 String Extension 을 만들어..
이번에는 collectionView 를 활용하여 이벤트 배너처럼 구현해 보았는데 끝이 없이 계속 돌아가도록 해보았다. 이런걸 Coursel CollectionView 라고 하는데 여기서 Coursel 은 '회전목마' 라는 뜻으로 끝이 없이 계속 돌아간다는 의미이다. 어떻게 collectionView 를 이용하여 무한히 도는 것을 구현할지 생각해본 결과 간단하게 생각해보면 보여지는 데이터가 있다면 그 데이터의 마지막 항목에서 오른쪽으로 스크롤시 다음 항목을 다시 첫번째로 또는 그 데이터의 처음 항목에서 왼쪽으로 스크롤시 다음 항목을 다시 마지막번째로 강제 이동을 시킨다는 것이다. 다시 한번 쉽게 설명을 하자면 보여주고 싶은 이벤트 배너 아이템이 1, 2, 3 이 있다고 가정을 해보자. 총 데이터는 실제 데..

Localization 이란 iOS 앱에서 표시되는 텍스트, 이미지, 날짜, 가격 및 통화기호를 나라별로 다르게 표시될 수 있게 구현하는 국제화를 위한 최적화 방법 이다. Localization 을 프로젝트에 추가해보기 1. 프로젝트에서 cmd + n 을 눌러 Strings File 을 추가해준다. 2. 프로젝트 설정에서 Info -> Localizations 에서 추가하고 싶은 언어를 추가해준다. 3. 다시 Strings 파일로 돌아와서 유틸리티 영역에 Localize.. 버튼을 눌러 활성화를 시켜준다. 4. Localize 버튼을 누르면 어떤 언어를 활성화 할건지 선택을 하게 되는데 여기서는 한국어와 영어만 연습을 해봤기 때문에 두 언어 모두 활성화를 해준다. 5. 이렇게 활성화를 하면 Strings..
1. NSAttributedString 텍스트 자체에 스타일 (색상, 자간, 행간 등) 을 설정할 수 있는 텍스트 타입이다. 활용 예) let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.lineSpacing = 6 // 텍스트의 속성 설정 let attributes : [NSAttributedString.Key : Any] = [ .font : UIFont.systemFont(ofSize : 20.0, weight : .semibold), .paragraphStyle : paragraphStyle, .foregroundColor : UIColor.systemPink ] // 내가 원하는 text 생성후 let text = NSAttributed..

1. MainViewController 에 스크롤뷰와 스택뷰가 있는 뷰를 만든다. import UIKit import SnapKit class MainViewController : UIViewController { //MARK: - Properties private let mainContentsView = MainContentsView() } 2. 이제 스크롤뷰와 스택뷰 그리고 스택뷰 안에 들어갈 뷰들이 있는 MainContentsView 를 만들어 준다. import UIKit class MainContentsView : UIView { //MARK: - Properties let scrollView : UIScrollView = { let view = UIScrollView() return view ..
앱에서 특정 가로모드 또는 세로 모드만을 지원하게끔 하려면 AppDelegate 에서 supportedInterfaceOrientationsFor window 메소드를 이용해서 내가 원하는 모드만 적어주면 된다. class AppDelegate: UIResponder, UIApplicationDelegate { // 세로모드만 지원 func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { return UIInterfaceOrientationMask.portrait } // 가로모드만 지원 func application(_ app..