일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Android
- PyQt
- alamofire
- cocoapods
- Xcode
- Python
- androidstudio
- button
- library
- charts
- UITableView
- UIKit
- kotlin
- Storyboard
- ui
- 개발
- 어플리케이션
- 라이브러리
- Apple
- 개발자
- PyQt5
- modal
- graph
- Swift
- Chrats
- ios
- UIButton
- 그래프
- Chart
- TableView
- Today
- Total
목록나의 공부 (317)
Jiwift
snapkit에서는 inset과 offset이 있습니다. 둘은 비슷하면서도 많이 헷갈리기도 합니다. 저는 offset을 자주 사용하고 있긴 한데 둘의 차이점은 적용 대상의 안을 기준으로 하느냐 바깥을 기준으로 하느냐의 따라서 양수와 음수가 달라집니다. 사실 사용하다 보면서 그냥 익혀가는 게 더 빠르긴 합니다. // UI private func setUI() { // 슈퍼 View에 파랑색 View 추가 self.view.addSubview(self.myView) self.view.addSubview(self.secondView) // SnapKit 적용 self.myView.snp.makeConstraints { make in make.top.equalToSuperview() make.leading.eq..
매우 간단한 높이와 너비를 적용하는 방법을 알아보도록 하겠습니다. 지난번에는 equalTo를 사용해서 컴포넌트를 적용했습니다. 상/하/좌/우를 적용하면서 높이와 너비는 자동적으로 적용되게 하였습니다. 아주 간단한 높이, 너비 설정 코드 2줄로 빠르게 보고 넘어가겠습니다. // SnapKit 적용 self.myView.snp.makeConstraints { make in make.height.equalTo(200) make.width.equalTo(200) } equalTo를 사용해서 바로 높이와 너비를 지정해 줍니다. 이러면 코드가 적용되게 되는데, 사진과 코드를 비교하면 200이 제대로 적용된 것을 알 수 있습니다. 조심해야 할 점은 상수로 적용을 하고 오토레이아웃을 적용하는 것입니다. // SnapK..
equalTo() 이번에는 equalToSuperview 다음으로 equalTo를 배워 보도록 하겠습니다. 지난번에 알아본 equalToSuperview는 상위 뷰를 기준으로 레이아웃을 적용했다면 equalTo는 원하는 대상을 기준으로 적용하게 됩니다. // SnapKit equalToSuperview 적용 self.myView.snp.makeConstraints { make in make.top.equalToSuperview() make.bottom.equalToSuperview() make.leading.equalToSuperview() make.trailing.equalToSuperview() } // SnapKit equalTo 적용 self.myView.snp.makeConstraints { m..
equalToSuperview() 자신의 상위뷰와 똑같게 하겠다는 것, 위에 예시 코드를 보면 top, bottom, leading, trailing을 나의 SuperView와 똑같이 하겠다는 말입니다. (사용하다 보면, 개인적인 생각으로는 "똑같다~"라는 말도 맞지만, "기준으로 하겠다~"라는 말도 되는 것 같아요) 예시를 보면 최상위 View에 myView를 추가해서 부모 -자식 관계가 형성되었습니다. 이로서 myView는 부모 View를 기준으로 옵션들이 설정될 것입니다. 만약 저기에 View를 하나 더 추가하면 어떻게 될까요? // UI private func setUI() { // 슈퍼 View에 파랑색 View 추가 self.view.addSubview(self.myView) self.myV..
SnapKit 사용 중에 제일 기본기 UI 컴포넌트를 추가하도록 하겠습니다. UIView를 추가할 줄 안다면 다른 애들도 똑같이 사용 가능합니다. 다만 SnapKit이 아닌 UI마다 가진 고유 옵션들은 다를 수 있겠죠?? 제일 옵션을 줄게 없는 UIView에 backgroundColor를 Blue로 설정하여 추가하도록 하겠습니다. import SnapKit 원하는 사용 위치에서 라이브러리를 추가합니다. // UIView 선언 lazy var myView: UIView = { let view: UIView = UIView() view.backgroundColor = .blue return view }() 일단 아무 기능을 하지 않지만 파란색을 나타내는 UIView도 선언합니다. private func se..
주말에 아주 재미있는 이야기가 뉴스에서 나왔다. 바로 샘 올트먼 해고와 이직 관련이다. 세상을 떠들석하게 만든 ChatGPT를 등장하게 만든 OpenAI의 CEO이다. 사건의 발달은 간단하다. 울트먼이 OpenAI를 떠난다는 뉴스와 함께 시작되었다. 처음에는 별 관심이 없었으나, 마이크로소프트 주식을 가지고 있는 입장에서 관심이 생기기 시작했다. 마이크로소프트는 OpenAI에게 약 12조원을 투자하고, 최근 OpenAI 발표인 "데브데이"에서 마이크로소프트 CEO인 사티아 나델라도 특별 게스트로 나올정도로 두 회사는 가까운 사이로 지내고있다... 그리고 애저를 잘 써주고 있기 때문에 더욱더 관심이 생기게되었다. 정확하지는 않지만 뉴스 헤드라인 순서를 나열해보려고 한다. 뉴스 제목만 나온 순서대로 나열했습..
사진 한 장으로 설명 가능한 Rosetta 실행, 1. Xcode 실행 2. Product -> Destination -> Destination Architectures -> Show Rosetta Destinations 3. 끝 시뮬레이터 리스트를 열어보면 Rosetta 목록을 확인할 수 있습니다. ARM을 지원하지 않는 라이브러리가 있어서 맨날 실제 단말기로만 테스트하던 분들은 이 방법을 통해서 시뮬레이터로 실행을 시켜 보실 수 있습니다.
안녕하세요. 이번에는 iOS 앱의 처음 실행하는 경우에만 실행하는 로직들을 다루기 위한 글을 작성하려고 합니다. 이게 말이 iOS이지 사실 어느 프로그래밍을 하던 사용되는 방식을 비슷할 것이라고 봅니다. 다양한 방법이 있겠지만, 저는 UserDefatuls를 사용한 방법으로 진행할 것입니다. // 결과를 저장하는 함수 static func setIsFirstLaunch() { // UserDefaults에 값을 저장 let defaults = UserDefaults.standard defaults.set(true, forKey: "isFirstLaunch") } // 결과를 받아오는 함수 static func getIsFirstLaunch() -> Bool { let defaults = UserDefau..
https://m.search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=%EB%84%A4%EC%9D%B4%EB%B2%84+%EB%A7%9E%EC%B6%A4%EB%B2%95+%EA%B2%80%EC%82%AC%EA%B8%B0 네이버 맞춤법 검사기 : 네이버 통합검색 '네이버 맞춤법 검사기'의 네이버 통합검색 결과입니다. m.search.naver.com 문선, 블로그 포스팅, 과제 등 글을 작성하다 보면 맞춤법을 틀릴 수가 있습니다. 이런 상황에 맞춤법을 검사하고 싶은데, 어떻게 해야 할까요? 바로 네이버 맞춤법 검사기입니다. 검사기를 통해서 내가 입력한 글들의 맞춤법을 확인하고 교정해 보세요. 틀리기 쉬운 맞춤법 중에는 안/..
UIPasteboard.general.string = "저장 내용" 정말 간단한 코드면 원하는 내용을 복사할 수 있습니다. 원하는 버튼을 선택했을 때, 원하는 로직이 동작했을 때 위 코드를 사용해서 내용을 복사를 구현할 수 있습니다. UIPasteboard.general.image = UIImage(systemName: "car") 원하는 이미지도 이렇게 해서 복사 가능합니다.
macOS 맥 Sonoma 시작프로그램 관리 추가 제거 맥에서 시스템 부팅시 자동 실행되는 앱들을 추가하고 제거하는 방법 우선 "시스템 설정"을 실행 시스템 설정 좌측 메뉴에서 "데스크탑 및 Dock" 선택하고 설정들 중에서 "기본 웹 브라우저"를 변경. 설정하기 전에 Safari가 아닌 다른 사용하고 싶은 브라우저가 설치되어있어야함.
macOS 맥 Sonoma 시작프로그램 관리 추가 제거 맥에서 시스템 부팅시 자동 실행되는 앱들을 추가하고 제거하는 방법 우선 "시스템 설정"을 실행합니다. "일반 -> 로그인 항목"으로 이동을 해줍니다. 여기서 "로그인 시 열기" 항목을 추가하고 제거할 수 있습니다. 추가하고 싶은 항목은 응용프로그램에서 앱을 선택하면 가능합니다.
안녕하세요. 이번에는 아이폰에서 웹 서버를 열 수 있게 해주는 GCDWebServer를 알아보려고 합니다. 사실 저도 많이 제대로 알지는 못하지만, 조금이나마 정보를 공유해 누군가는 필요할 수 있게 하려고 글을 작성하고 있습니다. swisspol/GCDWebServer: The #1 HTTP server for iOS, macOS & tvOS (also includes web based uploader & WebDAV server) (github.com) GitHub - swisspol/GCDWebServer: The #1 HTTP server for iOS, macOS & tvOS (also includes web based uploader & WebDAV server) The #1 HTTP serve..
[iOS/Swift] Firebase Crashlytics 에러 로그 수집 Apple, Android, Flutter, Unity를 위한 강력한 비정상 종료 보고 솔루션으로 앱 문제에 대한 명확하고 활용 가능한 분석 정보를 확인해 보세요. 구글 Firebase 상품 안에는 Crashlytics라는 에러 로그 수집 서비스가 있습니다. 가벼운 실시간 비정상 종료 보고 도구로 앱 품질을 저하하는 안정성 문제를 추적하고 우선순위를 지정하고 문제를 해결하는 데 도움이 됩니다 이미 구글 문서도 잘 되어 있지만 사진과 함께 설치와 사용법을 알아보도록 하겠습니다. 우선 파이어베이스와 앱을 연동하지 않은 분들은 앞에 글을 읽어주시기 바랍니다. 글 순서 1. 설정 2. 사용법 3. 안될 때 SPM을 사용해서 설치하도록 하..
[iOS/Swift] Firebase - 앱과 기본 연동하기(콘솔, info.plist) 구글 Firebase 기능을 사용하기 위해서는 콘솔을 통해서 앱을 연결시켜주어야 합니다. 어떤 기능을 사용하던 제일 첫 단계이니 모두 공통적으로 적용됩니다. 앱과 파이어베이스를 연동하기 위해서는 Bundle identifier를 필요로 합니다. Xcode에서 프로젝트 타겟으로 이동하여 번들을 확인하고 복사해 주세요. 현재 글 기준으로는 'com.jitaekim.FFFCCCMMM'입니다. 구글 파이어베이스 사이트로 이동합니다. Firebase Console (google.com) 여기서는 프로젝트를 생성할 수 있는데, 우선 적용하고자 하는 서비스 이름으로 프로젝트를 생성하고 나면 위 사진과 같은 프로젝트 페이지가 나옵..
Realm이라는 라이브러리를 SPM을 통해서 설치하려고 했는데, Could not be resolved 라는 메시지가 발생했습니다.. Add Anyway가 있긴 했지만 뭔~가 찜찜했습니다. 찾아보니 CocoaPods을 사용하라는 말도 있긴했는데, 저는 설치 버전 바꿔줌으로써 해결했습니다. 라이브러리들 같은 경우 깃허브를 통해서도 버전을 볼 수 있으니 확인해 보세요. Dependency Rule 수정을 통해 해결
[iOS/Swift] Xcode 계속 로딩 빌드가 안 끝날 때, 디바이스 등록 확인 정 - 말 많은 원인들이 있겠지만 생각나는 거 하나 적어보겠습니다. 사실 별거 없습니다. 정말 간단하지만 크게 신경 안 쓰다 보면 다른 곳에서 원인을 찾고 있을 것 같은 것 중 하나를 작성합니다. Xcode가 빌드가 계속 로딩 상태에 빠저 있는 듯한 느낌을 받을 때가 있는데, 사실 자주는 없습니다. 언제냐 하면 새로운 디바이스를 연결했을 때입니다. 누구나 알고 있지만 어쩌다 한번 일어나기 때문에 까먹을 때도 있으니 Xcode 로딩이 안 끝날 때는 프로비저닝 뭐 문구가 있는지.. 디바이스 등록은 했는지.. 확인을 해봅시다. 등록이 제대로 되었는지는 개발자 센터에서 확인합니다. 개발자 센터에서 기기를 들어가 주세요. 그럼 이..
맥용 카카오톡에 지문인식 기능이 추가되어서 바로 사용해보았다. 우선 카카오톡을 실행하고 좌측 하단 버튼을 누르고 환경설정에 들어간다. 그럼 누구나 바로 알아볼 수 있게 Touch ID 사용 체크박스가 보인다. 과감하게 선택해준다. 지문인식을 사용하기 위해서 암호를 사용하던 지문을 사용하던 본인인증을 해준다. 카카오톡을 다시 실행해보면 위와 같이 Touch ID로 잠금 해제 버튼이 나온다. 실행하자마자 지문을 물어보면 편리할 것 같은데 버튼을 눌러야하는게 아쉽다. 따로 키보드나 마우스 없이 맥북 키보드와 터치패드를 사용하는 입장에선 마우스로 버튼 누르고 손가락 지문인식하는 시간보다 타자를 치는 시간이 더 빠르다..
짧고 간결하게 알아보는 Alamofire 개발하다가 Body와 Query를 동시에 전송해야하는 일이 있었습니다. 근데 제 머리로는 간편하게 하는 방법이 생각나지 않았으나 그래도 먼길 돌아 해결한 것 같아 공유하려고합니다. func dictionaryToJsonString(dictionary: [String: Any]) -> String? { do { let jsonData = try JSONSerialization.data(withJSONObject: dictionary, options: []) if let jsonString = String(data: jsonData, encoding: .utf8) { return jsonString } } catch { print("Error converting di..
짧고 간결하게 알아보는 Alamofire 서버와 데이터를 주고받는 방식은 다양하게 있습니다. 이번에는 URL에 데이터를 담아서 보내도록 하겠습니다. let headers: HTTPHeaders = ["Content-Type": "application/json", "Accept": "application/json"] let parameters: Parameters = ["userId": "swift", "name": "kimjitae", "amount": 1000, "age": 27] AF.request(url, method: .get, parameters: parameters, encoding: URLEncoding.queryString, headers: headers) .validate(statusCo..
짧고 간결하게 알아보는 Alamofire 서버와 데이터를 주고받는 방식은 다양하게 있습니다. 이번에는 Body에 데이터를 담아서 보내도록 하겠습니다. let headers: HTTPHeaders = ["Content-Type": "application/json", "Accept": "application/json"] let parameters: Parameters = ["userId": "swift", "name": "kimjitae", "amount": 1000, "age": 27] AF.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: headers) .validate(statusCod..
짧고 간결하게 알아보는 Alamofire 파라메터란? HTTP 요청 메시지를 통해 클라이언트에서 서버로 데이터를 전달하는 방법 중 하나 Alamofire의 Request는 위와 같이 생겼습니다. let parameters: Parameters = ["userId": "swift", "name": "kimjitae", "amount": 1000, "age": 27] AF.request(url, method: .post, parameters: parameters) .validate(statusCode: 200..
[iOS/Swift] Alamofire Header 적용 HTTPHeaders 사용 헤더 짧고 간결하게 알아보는 Alamofire 간단하게 Alamofire Header 적용하는 방법 Http Header란? HTTP 헤더는 클라이언트와 서버가 요청 또는 응답으로 부가적인 정보를 전송할 수 있도록 해준다. Alamofire에서 Request를 사용하는 방법은 위와 같습니다. 우리는 위 양식에 맞게 Header를 넣어주면 됩니다. let headers: HTTPHeaders = ["Content-Type": "application/json", "Accept": "application/json"] AF.request(url, method: .get, headers: headers) .validate(stat..
기존에 UIKit에서 Preview 기능을 사용하려면 어렵진 않지만 코드 여러 줄 작성해야 했습니다. 하지만 이번에 Xcode15에서는 매우 간단하게 사용할 수 있습니다. #Preview { RouletteViewController() } 이 코드 처럼 Preview 매크로를 선언하고 원하는 화면을 넣어주면 Canvas가 나오면서 미리 보기가 활성화됩니다. 다만 빌드 시간이 오래 걸리기도 하고 아직 저는 미숙해서 그런지 가끔 무한 로딩에 빠지는 화면도 있고, 에러가 발생하는 화면도 있더라고요.
[iOS/Swift] Xcode 빌드 성공 후 앱 실행 안될 때 간혹 가다 Xcode에서 빌드는 성공했으나 앱이 실행 안 되는 경우가 있습니다. 에러도 없고 다 괜찮은데 왜 그럴까요?? 1. 빌드 대상 타겟이 앱이 맞는지 제대로 확인한다. 여러 라이브러리가 섞여있는 경우 실수로 타겟이 변경되어 앱이 실행되지 않는 경우가 있습니다. 이럴 땐 다시 타겟을 앱으로 바꾸어 빌드하면 실행됩니다. ' 2. Scheme 설정의 Executable이 None인 경우 타겟도 제대로 했으나 왜 실행이 안될까요? 그럴 땐 Scheme 설정을 확인해보세요. Executable가 None이라면 눌러서 앱으로 바꿔주면 빌드 성공 후 앱이 제대로 실행될 것입니다. 가끔 이런 실수들로 별것도 아닌 일에 걱정하게 되고 쓸데없이 다른 ..
[iOS/Swift] Toss Payments - 자동 결제(빌링) 연동하기 (정기 구독, 구독제) 지난 시간에는 정기 결제를 이해하는 글을 작성했습니다. 이번에는 연동하는 방법을 알아보도록 하겠습니다. 우선 이 글은 SDK가 아닌 웹뷰 방식으로 연동하는 점을 참고하고 글을 읽어주세요. 코드가 이해가 안 가시는 분은 다 읽고 맨 아래 전체 코드를 참고해 주세요. 웹뷰 방식을 연동하기 위해서는 WebKit View를 사용해야 합니다. Storyboard 혹은 코드를 통해서 선언해 주세요. 저는 Storyboard를 통해서 하겠습니다. Storyboard로 진행하시는 분들은 위와 같이 연결과 webkit을 import 해주세요. 다음은 웹뷰를 띄어야 합니다. 저 같은 경우는 따로 웹을 구축하지 않고 위 HT..
이번에는 Toss 정기 결제를 연동하기 앞서 정기 결제가 어떤 식으로 진행이 되는지, 알아보도록 하겠습니다. 우선 아래 내용은 모두 토스 페이먼츠 개발자 센터에 있는 내용으로 정확한 내용을 원하시는 분들은 개발자 센터를 방문해 주세요. 자동결제(빌링) 이해하기 | 토스페이먼츠 개발자센터 (tosspayments.com) 자동결제(빌링) 이해하기 | 토스페이먼츠 개발자센터 자동결제는 정기 배송, 음악 스트리밍과 같은 구독형 서비스에서 사용하는 결제 방식입니다. 자동결제(빌링)의 개념과 과정을 설명합니다. docs.tosspayments.com 저는 공부와 기억을 하기 위해서 작성하도록 하겠습니다. 우선 정기 결제 흐름을 알고 가야 서버와 작업할 때 대화하기가 좋습니다. 저는 머리가 나빠서 그런지 API 문..
우리는 지난 글에서 Alamofire를 통해서 간단하게 데이터를 파싱 하는 방법을 알아보았습니다. 이번 시간에는 복수의 데이터가 들어오는 경우를 가지고 이야기하겠습니다. 사용하는 데이터는 지난번과 같지만 Array로 반복적으로 들어오는 데이터입니다. Model은 그대로 사용해도 됩니다. 해당 방법은 struct뿐만 아니라 Int, String 타입들도 동일합니다. 위 사진에서 보시는 것처럼 특정 JSON 양식이 반복되는 것을 볼 수 있습니다. 이런 경우에는 정말 간단한 방법으로 처리가 가능한데요. 바로 지난번 코드를 수정해서 보도록 하조 let url: String = "https://jsonplaceholder.typicode.com/todos" AF.request(url, method: .get) ...
Alamofire 글을 오랜만에 작성합니다. 우리는 Alamofire를 통해서 데이터를 주고받을 수 있습니다. 오늘 서버에서 응답된 결과를 쉽게 받아서 사용하는 방법을 알아보려고 합니다. 기존에 Alamofire에서는 응답온 결과를 JSON으로 변환하는 코드를 직접적으로 작성했던 것으로 기억합니다. (기억도 잘 안 나요..) 하지만 지금은 'responseDecodable'라는 메서드가 struct 타입으로 편리하게 변경해 줍니다. 그렇다고 해서 data를 json으로 바꾸고 하는 작업들이 안 쓰이는 것은 아닙니다. 어떤 경우에는 사용이 필요한 경우도 있으니 알아두는 것도 좋습니다. { "userId": 1, "id": 1, "title": "delectus aut autem", "completed": ..
처음 개발하다 보면 API 통신을 어떻게 호출하고 어떻게 받아야 하는지 생각보다 이해하기가 어렵다. 그럴 때를 대비해서 친절하게 무료로 API를 만들어주시는 착한 형님들이 존재하는데, 그중 하나를 소개하려고 한다. JSONPlaceholder - Free Fake REST API (typicode.com) JSONPlaceholder - Free Fake REST API {JSON} Placeholder Free fake API for testing and prototyping. Powered by JSON Server + LowDB. Tested with XV. Serving ~2 billion requests each month. jsonplaceholder.typicode.com 위 사이트를 들어가..