일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- UIButton
- UIKit
- PyQt
- UITableView
- TableView
- Apple
- 어플리케이션
- Swift
- PyQt5
- graph
- button
- charts
- modal
- 그래프
- 라이브러리
- kotlin
- Chart
- library
- cocoapods
- 개발자
- Xcode
- 개발
- Storyboard
- Android
- androidstudio
- ios
- alamofire
- Python
- Chrats
- ui
- Today
- Total
목록iOS Dev/Swift (14)
Jiwift
FCM은 토큰이 아닌 토픽 방식으로 메세지를 주고 받을 수 있습니다. 평소에는 파이어베이스 라이브러리를 통해서 쉽게 구독해제를 할 수 있으나 코드를 가지고도 구독해제를 할 수 있습니다. (특별한 상황이 아니면 그냥 라이브러리에서 지원하는 기능을 사용하셔서 구현하세요.) 아래는 Swift 코드입니다.// 사용자의 FCM 토큰let token = "tokentokentoken" // 구독 해제하고 싶은 토픽let topic = "notice" // FCM 서버 키 파이어베이스 콘솔에서 확인 가능let serverKey = "fcm_server_key"// Request 생성let url = URL(string: "https://iid.googleapis.com/iid/v1:batchRemove..
[iOS/Swift] Enum을 사용한 TabBar Item 관리 안녕하세요. 이번에는 Enum을 사용해서 TabBarViewController의 TabBarItem을 관리하는 방법을 소개하려고합니다. Storyboard를 사용하면 필요 없을 수도 있습니다. 그리고 더 좋은 방법이 있을 수 있습니다. 읽어보시다 별로면 새로운 방법을 추천해주세요.!! 저는 Storyboard 없이 코드 베이스로 작업을하고있었습니다. import UIKitclass BaseTabBarController: UITabBarController, UITabBarControllerDelegate { override func viewDidLoad() { super.viewDidLoad() sel..
[iOS/Swift] 구조체를 JSON 형태로 변환하기 struct to json 안녕하세요. 오늘은 Codable로 구성된 Struct를 JSON으로 변경해 보겠습니다. struct AllUsersModel: Codable { let users: [UserModel] } struct UserModel: Codable { let name: String let age: Int } 우선 간단하게 Model을 두 개 만들었습니다. 사용자 정보를 담는 UserModel과 사용자를 담는 AllUsersModel로 구성했습니다. Codable을 채택하여 encode 할 수 있게 준비를 합니다. let users: [UserModel] = [UserModel(name: "오바마", age: 34), UserModel..
이번 글에서는 카메라와 앨범의 권한 요청 및 권한 확인하는 코드를 알아보겠습니다. iOS 14 이상을 기반으로 작성되었습니다. enum MediaPermissionType { case camera // 카메라 권한 유형 case album // 앨범 권한 유형 } MediaPermissionType 열거형을 선언해서 사용하도록 하겠습니다. 그렇게 중요한건 아니고 개발자마다 분기문을 작성하는 방법이 다르기 때문에 전체 코드를 보시고 취향것 하시면 됩니다. camera: 카메라 권한을 나타내는 열거형 케이스. album: 앨범(사진 라이브러리) 권한을 나타내는 열거형 케이스. static func requestPermission(type: MediaPermissionType, completion: @esca..
import UserNotifications struct NotificationPermissionCheck { /* 사용자의 알림 권한을 확인하고 결과를 완료 핸들러를 통해 반환합니다. - Parameter completion: 알림 권한 확인 결과를 처리할 완료 핸들러입니다. `true`는 알림 권한이 부여된 경우를 나타내고, `false`는 권한이 거부되거나 아직 결정되지 않은 경우를 나타냅니다. */ static func check(completion: @escaping (Bool) -> Void) { let current = UNUserNotificationCenter.current() current.getNotificationSettings { settings in switch settings...
안녕하세요. 오늘은 개인적으로 사용하기 위해서 작성한 코드를 공유하려고합니다. 앱 UI 달력에서 월을 선택하면 그 기준으로 전/후 몇개월 기간을 계산해서 서버로 보내야하는 코드가 필요해서 만들었습니다. 현재는 연/월이 기준이지만 조금만 수정하면 연/월/일까지 사용 가능한 코드라서 조금만 보시면 바로 이해하실겁니다. 아래는 코드입니다. // 특정일을 연/월을 기준으로 범위 구하기 static func getDateRange(year: Int, month: Int, past: Int = 0, future: Int = 1) -> (fromDuration: String, toDuration: String) { // 입력 받은 날짜로 Date 구성 let calendar = Calendar.current var ..
import UIKit // MARK: - UINavigationController 생성 static internal func createNavigationController(controller: UIViewController) -> UINavigationController { // 실제 첫 화면이 되는 ViewController 인스턴스 생성 let childViewController: UIViewController = controller // NavigationController을 사용할 경우, ViewController를 rootViewController로 갖는 NavigationController을 생성해야한다. let parentNavigationController: UINavigationCon..
Root View를 변경하기 위해서 사용했던 코드 두가지 방법을 공유합니다. 설명은 따로하지 않고, 제가 기록용으로 남기기 위해서 작성해둡니다. 응용을 통해서 원하는 방식으로 구현하세요...! import UIKit // MARK: - UIWindow의 rootViewController를 변경하여 화면전환 internal func changeRootViewController(newStoryboard: String, nextViewController: String) { DispatchQueue.main.async { let newStoryboard = UIStoryboard(name: newStoryboard, bundle: nil) let newViewController = newStoryboard.in..
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { if previousTraitCollection != nil { // 다크모드 라이트모드 변경후 수행 할 코드 if previousTraitCollection?.userInterfaceStyle == .dark { // 다크모드 상태입니다. } else { // 다트모드 상태가 아닙니다. } } } 다크모드를 변경을 감지하고 싶을때 사용하면 되는 코드입니다. UIView와 UIViewController를 상속받으면 사용 가능합니다.
우선 브릿지 삭제 방법은 forName자리에 삭제하고 싶은 userContentController 입력 self.loginWKView.configuration.userContentController.removeScriptMessageHandler(forName: "bridge") 사실 이건 나만이 겪을 것 같은 상황이다. 다른분들은 이런 상황이 당연하게 없겠지만.. 혹시나 해서 기록 웹이 이미 개발이 완료된 상태였다. 그 와중에 나는 하나의 ViewController에서 두개의 Webkit을 사용해야했고, 브릿지 이름 또한 똑같은 두 화면이었다. 해보면 바로 알겠지만 userContentController는 같은 이름을 두개의 브릿지에 등록할 수 없다. self.oneWk.configuration.use..
세상에 많은 앱들은 네이티브 + 웹으로 구성되어있다. 코어한 부분은 네이티브로.. 수정이 많지만 배포를 줄이고 싶은 경우, 이미 웹으로 만들어서 두번 작업하기 싫은 경우. iOS에서는 WebKit을 사용해서 네이티브 앱 안에서 웹을 보여준다. 단순하게 보여주는 것 뿐만 아니라 서로 소통하게 도와준다. 그게 바로 userContentController다. 적용은 너무 간단하다. self.loginWebKitView.configuration.userContentController.add(self, name: "bridge") 원하는 WebKit에 위 코드를 통해서 등록한다. name 자리에 웹에서 전송하는 브릿지와 동일해야한다. 위를 등록해두면 bridge라는 이름으로 메세지가 들어오게되고 그 안에 데이터를..
정답이 아닐 수 있습니다. 각자 상황에 맞는 방법을 찾아서 사용하시면 됩니다. 인터넷을 하다보면 새로운 창이 필요할 때가 있습니다. Nice 본인인증과 같은 상황이조. 근데 우리가 사용하는 앱들은 창이 여러개가 보여지지 않습니다. 대부분 사용하는 앱들은 회원가입을 진행하거나 물건을 구매할때 순차적으로 진행되는 화면을 보게됩니다. PC 환경 처럼 새로운 창을 띄우는 경우는 드물다고 봅니다.(기획에 따라 다름) 근데.. 역시 예외 상황은 꼭 생기고 PC 환경 처럼 새로운 탭을 열어서 작업이 필요한 경우가 있습니다. 이유는 모릅니다. 한가지 상황을 생각해봅시다. 어딘가에 회원가입을 웹뷰로 만드는 서비스가 있다고 생각합니다. (회원가입 부분은 프론트엔드 개발자가, 네이티브 WebKit과 브릿지 확인은 iOS 개..
카카오내비, TMAP(티맵)과 같은 볼륨 조절 iOS에서 어플리케이션을 만들다 볼륨을 조절해야하는 상황이 생겼다. 인터넷에서 제일 먼저 나오는 방법을 찾아서 적용하면 위 사진처럼 볼륨 조절 모양이 나오지만 원하는 결과는 이루었다. 하지만 기기 전체 볼륨이 조절되기 때문에 사용성에서는 많이 안좋다고 생각되어서 더 찾아보았다. class TTSManager { static let shared = TTSManager() private let synthesizer = AVSpeechSynthesizer() var volume: Float = 1.0 internal func play(_ string: String) { let utterance = AVSpeechUtterance(string: string) utt..
[iOS/Swift] 코드 실행 시간 확인 | 코드 동작 수행 시간 확인하기 let startTime = CFAbsoluteTimeGetCurrent() // 동작 수행 코드 let processTime = CFAbsoluteTimeGetCurrent() - startTime print(processTime) Swift로 코드를 작성하고 실행하면서 실행 시간을 확인하고 싶을 때 사용할 코드