본문 바로가기

iOS Swift16

아이패드는 traitCollectionDidChange를 알까? 제목은 너무 어그로같이 썼지만 아무튼..아이폰과 아이패드 모두에서 어색함 없이 나타나는 레이아웃을 만드는 과정은 꽃길(아니고 가시밭길)과도 같습니다. 사용자가 어떤 환경에서 앱을 사용할지 모르기 때문에 가급적이면 대다수의 기기에 호환되도록 레이아웃을 구성하는 것이 좋은데요, 한동안 아이폰으로만 개발을 하다가 아이패드도 마찬가지로 지원해야 한다는 사실을 깨닫고 부랴부랴 테스트에 나선 호두빵.. 한 가지 이상한 현상을 확인합니다. 아이폰에서는...잘 됐는ㄷㅔ... 웨않되?..? 내가 잘못 본건가? 브레이크포인트가 전혀 잡히지 않는 것 같은데? 흠..전 직장에서 팀장님이 해주신 말이 떠오릅니다. "코드는 거짓말을 하지 않는다. 원하는대로 나오지 않는다면 너가 뭔가 잘못 하고 있는 것.." 구글아 도와줘. 바로.. 2024. 2. 26.
이메일, 핸드폰번호 마스킹하기 func maskEmail() -> String { let email = self let components = email.components(separatedBy: "@") //@으로 아이디와 사이트 주소를 구분 var maskEmail = "" if let first = components.first { maskEmail = String(first.enumerated().map { index, char in return [0, 1].contains(index) ? "*" : char }) } if let last = components.last { maskEmail = maskEmail + "@" + last } return maskEmail } func maskPhoneNumber() -> Stri.. 2023. 2. 2.
hitTest 활용하여 터치이벤트 확인하기 override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { if self.circleView.frame.contains(point) { return super.hitTest(point, with: event) } return nil } 특정 뷰에 클릭이 이뤄졌는지 간단하게 확인할 수 있는 방법으로 위의 hitTest를 활용할 수 있습니다. 예제 코드에서는 어떠한 circleView를 탭했을 때에 작동하는 코드입니다. 2023. 1. 13.
tableView의 header, footer view 색 변경하기 func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) { if let header = view as? UITableViewHeaderFooterView { header.tintColor = ThemeManager.current.mainBackgroundColor header.textLabel?.textColor = ThemeManager.current.oppositeColor } } 테이블뷰를 나누는 섹션의 텍스트컬러와 배경컬러는 view as? UITableViewHeaderFooterView를 통해서 배경색은 header.tintColor, 텍스트컬러는 header.text.. 2023. 1. 5.
filter 및 tableView section 활용하기 var contentCount = authHistories.filter({$0.regDtString.split(separator: ",").first! > authSection[indexPath.section]}).count cell.authTimeLabel.text = authHistories[indexPath.row + contentCount].regDtString 만약 여러가지 목록 중에서 해당 일자를 기준으로 그 이후에 일어난 사건에 대해 섹션으로 분리를 해야한다면, filter를 사용해서 일자값만 추출한 다음에 기준으로 잡을 해당 일자보다 더 앞선 컨텐츠만 count로 잡을 수 있습니다. 그런 다음 셀의 위치를 알려줄 때에는 indexPath.row에 contentCount를 더해서 전달해주면 .. 2022. 12. 30.
CIImage, CGImage, UIImage 변환 및 개념 정리 코딩을 하다보면 자주 마주하게 되는 이미지는 아마도 UIImage와 CGImage인 것 같습니다. 일단 이미지를 넣은 다음에 Xcode 가라사대 삑 이거 이대로 넣으면 안 되고 cgImage로 바꿔줘야해 하면 .cgImage만 후다닥 추가하던 저는 이번에 조금 더 개념을 확실하게 알아볼 수 있었습니다. 다른 포스팅에도 적었던 Mantis 라이브러리를 쓰면서 생겨난 궁금증에서 비롯된 것이었는데요. 사진을 찍거나/앨범에서 가져오거나 둘 중 한 가지의 방법으로 사진을 처리하고자 할 때 이상하게도 후자는 잘 되는데 전자는 똑같은 코드로 진행이 되지 않는 것이였어요. 넣어준 것은 uiImage로 둘 다 동일했는데 말이예요. 그래서 원작자에게 질문을 던졌습니다. 저의 단순한 추측으로는 해상도가 달라서 그런가? 싶었.. 2022. 12. 28.
DateFormatter 활용해보기 let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd, a h:mm" let date = dateFormatter.date(from: authHistory.regDtString) dateFormatter.dateFormat = "yyyy-MM-dd" let stringDate = dateFormatter.string(from: date ?? Date()) DateFormatter를 사용하기 위해서 멀쩡한 String형을 Date형으로 만들었다가 다시 내가 원하는 양식의 String형으로 바꿔치기 하는 코드... 크게 설명할 부분도 없고, 직관적으로 이해할 수 있는 내용인 것 같습니다.. dateFormatter.date는 S.. 2022. 12. 27.
[사진]촬영 후 바로 아이폰 앨범에 저장하기 func saveImage(image : UIImage) { let data = image.jpegData(compressionQuality: 0.9)! PHPhotoLibrary.requestAuthorization { [unowned self] status in if status == .authorized { PHPhotoLibrary.shared().performChanges({ let creationRequest = PHAssetCreationRequest.forAsset() creationRequest.addResource(with: .photo, data: data, options: nil) }, completionHandler: { success, error in if success { pr.. 2022. 12. 27.
[권한]앨범 접근 권한 여부 확인하고 바로 후처리 @objc func pickImage(){ if albumAccess(){ chooseAlbumMethod() } else { let status = PHPhotoLibrary.authorizationStatus() if status == .notDetermined { PHPhotoLibrary.requestAuthorization{status in switch status { case .authorized, .limited : print("album access allowed") DispatchQueue.main.asyncAfter(deadline: .now() + 0.5){ self.chooseAlbumMethod() } case .denied, .restricted : print("album acc.. 2022. 12. 22.