[TIL #37] 2023 / 07 / 18 앱을 처음 시작할 때, 나타나는 튜토리얼 화면을 만들어 보려 합니다. 보통 튜토리얼 화면을 만드는 방법으로는 UIScrolView 또는 UIPageViewController를 사용하여 만들 수 있습니다. 여기서 만약, 그냥 UIScrolView를 통해 만들게 되면, 기능을 구현하는 방식은 비슷하지만 레이아웃을 잡을 때, 생각보다 골치 아프더라고요. (스크롤 가능한 콘텐츠를 보여주기 때문에, 콘텐츠의 크기, 위치, 스크롤 영역 등을 정확한 설계가 필요) 그리고 UIScrolView는 보이는 영역(View Port)을 제외하고도 모든 페이지들이 메모리에 올라가기 때문에, 많은 페이지를 보여줄 때는 비효율 적일 수 있습니다. 예를 들어, [page1, page2, ..
[TIL #36] 2023 / 07 / 12 앱 내에서 Web을 보여주는 방법을 간단히 정리해보려 합니다. 크게 3가지 방법으로 Web을 보여줄 수 있습니다. 1. Safari 앱 직접 사용 2. SFSafariViewController 사용 3. WKWebView 사용 Safari 앱 직접 사용 직접, Safari App을 실행하여 Web을 보여주는 방식입니다. @objc func buttonHandler(_ sender: UIButton) { switch sender.currentTitle { case "Safari App": guard let url = URL(string: "https://www.apple.com"), UIApplication.shared.canOpenURL(url) else { ..
[Swift/ TIL #36] 2023 / 07 / 11 이전에 이미 메일 보내는 기능을 구현을 해봤었는데, 오랜만에 다시 구현하려니 헷갈려서 간단히 정리한 뒤, 다시 사용하려고 이렇게 정리합니다. 사용방법은 공식문서 에 자세히 설명이 돼있어요. 시작 이렇게 버튼을 만들어줬고 버튼을 클릭하면 mail을 보내는 기능을 만들어 보려합니다. class ViewController: UIViewController { lazy var button: UIButton = { let button = UIButton(configuration: .filled()) button.frame = CGRect(x: 150, y: 400, width: 100, height: 50) button.setTitle("문의 사항", for..
[Swift/ TIL #34] 2023 / 07 / 06 Protocol의 요구사항들을 enum의 case로 적용시키는 방법 및 기본적으로 사용되는 enum에 Protocol을 채택하여 사용하는 방법을 알아봅시다. 처음 보는 선언 방식 열거형에 프로토콜을 채택하는 방법 중, 처음 보는 선언 방법이 있어 간단히 적어보려 합니다. (Protocol의 요구사항들을 enum의 case로 적용시켜 나열시키는 방법입니다.) 설명은 주석을 참고해 주세요. (제가 이해한 대로 적은 거라 틀린 내용이 있을 수 있습니다) 그리고 조금 더 자세한 정보를 알고 싶다면 밑에 참고 링크들을 참고해 주세요. // Swift 5.3 에서 도입 protocol DataProtocol { // Self 자기 자신을 반환 (아래 Enu..
[Swift/ TIL #33] 2023 / 06 / 29 흠, 깃 커밋 내용은 최대한 자세히 쓰기만 하면 되는 줄 알았는데, 완전히 잘못하고 있었습니다. 뭐, 혼자 할 때는 크게 문제없겠지만, 나름의 개발자 사이에서 관습적으로 통용되는 규칙이 있더라고요. 나중의 협업을 위해서 간단하게라도 정리를 해보려 합니다. 많은 개발자 분들이 Udacity Git Commit Message Style Guide 를 참고하더라고요. Git Commit Message Convention 깃은 코드 형상 관리 도구로써, 파일의 변경사항을 기록하여 추적이 용이하게 만들어주는 도구죠. 만약, 코드에 문제가 발생 시, 문제 지점(변경 이력)을 추적하여 이전 버전으로 파일을 복구해줘야 합니다. 그런데 커밋 내용이 규칙적(일관적)..
[Swift/ TIL #32] 2023 / 06 / 26 ~ 2023 / 06 / 27 오늘은 탭바 아이템을 클릭할 때, 슬라이드 효과 같은 애니메이션 효과를 만들어 보려고 합니다. (뷰 컨트롤러 전환 애니메이션) 탭바 애니메이션 예전에 만들어 만들어 둔, 탭바에 애니메이션을 적용시켜 보겠습니다. 일단 탭바 애니메이션 적용을 위해, 처음으로 할 작업은 탭바 델리게이트를 채택해 주는 겁니다. class WorldTimeViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() self.tabBarController?.delegate = self // 커스텀으로 탭바컨트롤러를 만들어줬으면, 이런식으로 하겠죠. // ..
[TIL #31] 2023 / 06 / 23 iOS13부터 다크모드가 도입되었습니다. 라이트 및 다크모드 적용하는 방법들을 알아봅시다. Info.plist로 적용 방법 기본적인 사용 방법으로는 Info.plist에서 Appearance를 통해 스타일을 정해주는 겁니다. Value값을 통해 원하는 스타일을 선택할 수 있습니다. (Light, Dark) 앱 내에서 Appearance 적용 방법 Info.plist 대신, SceneDelegate 및 UIViewController에서도 코드를 통해 Appearance을 변경해 줄 수 있습니다. 바로, overrideUserInterfaceStyle를 이용하여 다크 및 라이트 모드 변경이 가능합니다. window에서 전역 설정 화면이 생성되는 시점인 SceneD..
[TIL #30] 2023 / 06 / 14 ~ 2023 / 06 / 18 현재 프로젝트에서 하위 뷰와 상위 뷰가 겹쳐지게 만들었습니다. 그런데 상위 뷰(아래에 위치한 뷰)를 배경색만 clear로 해주면 터치가 될 줄 알았는데, 안되더라고요... 해결 방법을 찾아보다가, hitTest와 point란 놈들을 통해 각 하위 뷰의 터치 이벤트를 전달이 되더라고요. 그래서 이렇게, 한번 정리를 해보려고 합니다. 하단의 참고 링크들을 참고하여, 제 생각을 정리해 봤습니다. hitTest 공식문서에서는 hitTest를 이렇게 설명하고 있습니다. "현재 뷰(UIView)의 뷰 계층 구조에서, 자기 자신(self)을 포함하고, 지정된 지점(터치된 Point)을 포함하는 가장 먼 자식 뷰(?)를 반환합니다."라고 되어있..
[TIL #28] 2023 / 06 / 13 간단히 AlertController 사용방법 및 CustomAlertViewController를 만들어 볼 예정입니다. UIAlertController 사용자에게 각각의 상황에 맞게 알림 및 경고로 사용자에게 알려 상호작용을 할 수 있는 컨트롤러입니다. 3개의 파라미터와 UIAlertAction만 만들어 주면, UIAlertController를 바로 사용할 수 있습니다. 먼저 UIAlertController를 생성 시, 필요한 파라미터들은 title, message, preferredStyle이 있습니다. title 알람의 제목 message 알람의 본문 내용 및 추가 설명 preferredStyle 알람창의 스타일을 정합니다. alert, actionShee..
[TIL #28] 2023 / 06 / 10 키보는 내리는 방법들을 소개하겠습니다. touchesBegan 사용 touchesBegan은 새로운 터치가 입력될 때, 호출되는 메서드입니다. View 같은 곳에서 그냥 간편하게 사용할 수 있는 방법입니다. override func touchesBegan(_ touches: Set, with event: UIEvent?) { self.view.endEditing(true) } 아래 메서드로도 키보드를 닫을 수 있습니다. override func touchesBegan(_ touches: Set, with event: UIEvent?) { view.resignFirstResponder() } UITapGestureRecognizer 사용 UITapGestureR..