프로그래밍 (299) 썸네일형 리스트형 [SwiftUI] 오디오 레벨 에니메이션, Shape 오디오 레벨이나 오브젝트 주변을 인지하기 쉽도록 하기위해 펄스 에니메이션이 사용되곤 한다. 보통 원형으로 스케일을 통해 에니메이션을 구현하는데~ 제공 하는 Circle shape를 사용해 간단히 구현할 수 있다. 뷰의 state 나 뷰모델에서 level 값을 퍼블리싱 한다고 가정하면... ZStack { Circle() .frame(width: 150, height: 150, alignment: .center) .foregroundColor(Color.yellow) .scaleEffect( (CGFloat(self.viewModel.level) / 100.0) + 1) .opacity(0.2) .animation(Animation.easeIn(duration: 0.1)) Circle() .frame(wi.. dataTaskPublisher 재시도 및 출력 타입 변경 retry(_ retries:) 상위 스트림을 다시 시도하는 메쏘드는 retry 이고 오류 발생시 해당 횟수 만큼 재시도 하게 된다. retry 의 경우 이전 스트림을 다시 시도하므로, dataTaskPublisher 에 retry 를 걸게 되면 오류 발생시 바로 재시도를 수행한다. 더불어 URLError에 대해서만 retry 가 일어나게 된다. dataTaskPublisher 로 데이터를 가져올때 단순 재시도가 아닌 일정시간 딜레이를 두어 재시도를 하는 케이스를 한번 살펴보자. 추가적인 에러 처리를 더하기 위해 별도 함수를 하나 추가한다. 이 메쏘드에서는 response 에 대한 추가적인 에러 처리와 Output을 Data 형식으로 변경했다. URLError 이외에 http status code와 같은.. Framework SPM 배포 spm 으로 framework 를 배포하기 위해서는 swift 5.3 이상이 필요하고, xcframework 로 빌드되어야 한다. 아키텍처별로 framework 생성후에 xcframework 를 생성한다. XCFramework 만들기 (tistory.com) 생성된 xcframework 를 git 저장소에 업로드 해당 저장소에 Package.swift 파일 생성한다. // swift-tools-version:5.3 import PackageDescription let package = Package( name: "MyLibrary", platforms: [ .iOS(.v13), ], products: [ .library(name: "MyLibrary", targets:["MyFramework"]), ],.. URLSession.DataTaskPublisher DataTaskPublisher URLSession 은 combine publisher인 DataTaskPublisher를 제공한다. dataTaskPublisher(for:) 메쏘드로 publisher를 생성 할 수 있으며, 결과는 듀플( Data: , URLResponse)로 전달된다. public struct DataTaskPublisher: Publisher { typealias Output = (data: Data, response: URLResponse) typealias Failure = URLError let request: URLRequest let session: URLSession func receive(subscriber: S) where S: Subscriber, S.Failure.. 카메라 데이터 수신을 위한 AVCaptureSession AVCaptureSession 과 AVCaptureVideoDataOutput은 생성시 별도 설정이 없으므로, 미리 생성해 둔다. Input의 경우 device 객체가 필요하므로, device 생성 이후에 설정. output의 경우 device에 따라 픽셀 포맷이 변경되므로, 관련 프로퍼티 추가. var captureSession: AVCaptureSession = .init() var videoDataOutput: AVcaptureVideoDataOutput = .init() var currentDevice: AVCaptureDevice? var preview: AVCaptureVideoPreviewLayer? var deviceFormat: AVCaptureDevice.Format? var prefe.. collection view 에서 load more 처리 목록을 더 읽어와 하단에 추가하는 경우엔 스크롤 관련 이벤트에 따라 그냥 읽어서 붙이면 간단한데.. 채팅이나 메신저와 같이 이전 목록을 불러와 기족 목록 상단에 추가하는 경우 스크롤 관련 설정이 조금 더 필요. 스크롤 위치에 따라 더 읽기 작업 시작 연속으로 호출되면 안되므로, 플래그를 두어서 한번만 호출되도록 처리 func scrollViewdidScroll(_ scrollView: UIScrollView) { guard scrollView.contentSize.height > scrollView.bounds.height else { return } if scrollView.contentOffset.y UIPanGestureRecognizer 슬라이드 다운 뷰 액션시트와 같이 하단에 표시되는 뷰를 pan gesture를 사용해 에니메이션 시키고, 사라지게 하는 예. class DefaultTouchPanGestureRecognizer: UIPanGestureRecognizer { var touchPosition: CGPoint? override func touchesBegan(_ touches: Set, with event: UIEvent) { super.touchesBegan(touches, with: event) touchPosition = touches.first?.location(in: view) } } class SampleViewController: UIViewController { private var panGesture: DefaultTouchP.. UITextView 사이즈 조정 및 글자 제한, placeholder 제한된 숫자만 입력을 제공하는 경우 UITextViewDelegate 의 아래 메쏘드 구현. 최대수보다 1 크게 체크하는데.. 한글과 같이 마지막에 조합이 이루어지는 경우와 특정 글자가 넘어갈 경우만 알림을 보여주기 위함. func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { guard let currentText = textView.text else { return true } let newLength = currentText.count + text.count - range.length if newLength > maxCharacterCount { // r.. 이전 1 2 3 4 5 6 7 ··· 38 다음