분류 전체보기65 아이패드는 traitCollectionDidChange를 알까? 제목은 너무 어그로같이 썼지만 아무튼..아이폰과 아이패드 모두에서 어색함 없이 나타나는 레이아웃을 만드는 과정은 꽃길(아니고 가시밭길)과도 같습니다. 사용자가 어떤 환경에서 앱을 사용할지 모르기 때문에 가급적이면 대다수의 기기에 호환되도록 레이아웃을 구성하는 것이 좋은데요, 한동안 아이폰으로만 개발을 하다가 아이패드도 마찬가지로 지원해야 한다는 사실을 깨닫고 부랴부랴 테스트에 나선 호두빵.. 한 가지 이상한 현상을 확인합니다. 아이폰에서는...잘 됐는ㄷㅔ... 웨않되?..? 내가 잘못 본건가? 브레이크포인트가 전혀 잡히지 않는 것 같은데? 흠..전 직장에서 팀장님이 해주신 말이 떠오릅니다. "코드는 거짓말을 하지 않는다. 원하는대로 나오지 않는다면 너가 뭔가 잘못 하고 있는 것.." 구글아 도와줘. 바로.. 2024. 2. 26. 1년에 1번 정도 활성화되는 개발 블로그가 되어버린 썰.. 개발하면서 누구나 그러듯이 구글없이는 못 살아 인간이 되었는데요(요즘에는 챗지피티까지 포함해서...)제가 막혔던 문제는 전 세계의 누군가가 이미 부딪혀보고, 해답까지 내놓은 문제들이 많습니다. 정말 셀 수 없이 수많은 블로그의 개발 관련 포스팅을 보면서 이따금씩 했던 생각...아 나도 블로그 있는데 ㅎ.. 하지만 매일매일 도전처럼 다가오는 업무들을 쳐내다보면 TIL은 무슨,, 회사에 출근하는 것만으로도 나 자신 너무 대견해! 하며 자기 합리화를 하기 시작하고 아니 회사에서 일하면서 그 과정에서 배웠잖아 그럼 됐지 하는 생각이 ... iOS 개발하시는 분들이라면 정말 최소 1번쯤은 들어가봤을 것 같은 나름 유명한 개발자님의 블로그를 보면서, 저 분은 연차도 꽤 됐을거고 이제 모르는 게 없으실 것만 같은데 .. 2024. 2. 25. 이메일, 핸드폰번호 마스킹하기 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. 이전 1 2 3 4 ··· 8 다음