본문 바로가기

프로그래밍/iOS,macOS

(67)
[swift] SCNProgram 쉐이더 투명 적용 프로그램으로 SCNMaterial 에 쉐이더를 적용하면, fragment 쉐이더에서 알파값을 0으로 주어도 불투명한 색상으로 처리된다. 알파값을 처리하기 위해 프로그램과 머터리얼 설정이 필요. 프로그램, 머터리얼 설정// 쉐이더를 적용할 노드의 머터리얼guard let targetMaterial = node.geometry?.firstMaterial else { // 노드에 geometry 혹은 geometry내에 material 이 없음 return}// 프로그램 생성 및 쉐이더, 불투명도 설정let program = SCNProgram()program.vertexFunctionName = "VertexFunc"program.fragmentFunctionName = "FragmentFunc"pr..
[swift] SceneKit uv animation 프로퍼티쉐이더에 전달할 구조체를 정의한다. 앱에서 사용할 구조체와 쉐이더에서 입력받을 구조체 각각 정의.delta는 uv 변화량을 나타내며, type은 애니메이션 방향이다.// swiftstruct MyInputValue { var delta: Float = 0.0 var type: UInt8 = 0 init(delta: Float, type: UInt8) { self.delta = delta self.type = type }}// c header#include #include using anmespace metal;struct MyInputValue { float delta; uint8_t type;}; 텍스처 이미지 설정uv 에니메이션에 사..
[swift] swiftui fileImpoter로 파일 선택하기 파일 접근 권한 설정mac의 경우 프로젝트 설정의 Capability에 Sandbox가 설정되어 있으면 File Access Type에 설정된 폴더의 파일만 사용 가능모든 폴더의 파일을 가져오려면 App Sandbox 항목 제거 iOS의 경우 권한 문제가 발생하는 경우 Info 탭에서 Privacy 추가  타입식별자 설정프로젝트 Info 탭에서 Imported Type Identifiers 에 항목추가extensions에 여러 확장자를 지정할 경우 콤마로 구분Conforms To 에는 부모 타입을 지정 한다. 타입생성파일패널(대화상자)를 표시하기 위한 퍼블리셔 선언 및 info 에 추가한 타입 식별자로 타입 생성struct ContentView: View { @State var isOpenFile =..
[concurrency] Task, TaskGroup, task timeout Task @frozen struct Task where Success: Sendable, Failure: Error init(priority: TaskPriority?, operation: () async -> Success) init(priority: TaskPriority?, operation: () async throws -> Success) TaskGroup @frozen struct TaskGroup where ChildTaskResult: Sendable TaskGroup은 별도의 메서드를 사용해 생성해야 하며, 생성된 task 내에서만 사용해야 함. 주요함수 func addTask(priority: TaskPriority?, operation: () async -> ChildTaskResul..
[swift] sorted array 에 값 추가 WWDC 2018 Session 406 : Divide-and-Conquer Binary Search stackoverflow : sorting - How do I insert an element at the correct position into a sorted array in Swift? func sortedInsertionValue(_ value: String) { var slice: Array.SubSequence = mySortedArray[...] while !slice.isEmpty { let middle = slice.index(slice.startIndex, offsetBy: slice.count / 2 ) if value < slice[middle] { slice = slice[..
[concurrency] swift async/await 다른 언어를 사용하다가 ios쪽 개발을 할때 코루틴과 같은 시퀀셜한 비동기 처리가 없는점이 매번 아쉬웠는데.. swift 5.5 부터 async await 가 지원되기 시작했다. 당연하게도 애플쪽 하위호환이란건 바라지도 말아야 하는지라... 그나마 xcode 13.2 부터 사용 가능하니 내부 샘플 프로젝트등에 적용해 보려고 대강 내용만 정리해 본다. ios15 이하를 타겟으로 하는 경우 import _Concurrency 와 같이 비공식적으로 사용해야 한다. (이마저 없었으면 한 2년 뒤에나 사용할 듯) async @MainActor func getSomething() async -> [Int] { } 비동기 메쏘드는 메쏘드명 다음에 async 라는 키워드로 정의된다. 메인 쓰레드에서 동작해야 하는 경우..
[Combine] 콜백 기반 여러 처리 결과를 배열로 받기 특정 키로 콜백 기반 api를 여러번 호출한 다음에 해당 결과들을 모아 배열로 받으려 한다. 콜백 호출 함수 구독시 결정되도록 Deferred를 리턴하고, 콜백을 반환하는 함수의 호출 결과를 얻기위해 단일 퍼블리셔인 Future로 구성 에러가 필요 없는 경우 예외에 대해 success("") 로 리턴. func getSomeValue(id: String) -> AnyPublisher { return Deferred { Future { [weak self] promise in guard let self = self else { return promise(.success("") } self.someAsyncMethod(id: id) { result in return promise(.success(result..
[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..