본문 바로가기

분류 전체보기

(51)
[ISSUE] AVFoundation ( 1 ) - AVPlayer 현재 진행하는 프로젝트에서 mp3파일의 음원을 실시간으로 재생하며 컨트롤 해야하는 부분이 있었다. 필자는 사전에 AVPlayer를 사용하여 사용자가 만든 음악을 공유하며 들어볼수 있는 앱을 개인 토이 프로젝트로 만든 경험이 있어 AVPlayer로 진행해야겠다고 생각했고 player를 구현하는 과정에 있어서 많은 issue들이 생겼다. 그리고 해결 했던 과정을 몇편에 나눠 포스팅 해보려한다. AVPlayer로 동일하게 진행했었지만 사전에 진행했던 토이프로젝트에서 사용하던 Firebase URL이 정상적으로 duration을 가지고 올수 있었던 것과는 반대로 필자가 전달 받은 프로젝트에 사용한 url은 playerItem으로부터 제공받는 duration을 가지고 오지 못해 문제가 발생했다. 오디오가 정상적으..
[SwiftUI] Stack 이번 포스팅에서는 SwiftUI에서 View를 배치하는 데 사용하는 ContainerView이자 하나의 View인 Stack에 대해서 알아보겠다. UIStakcView 같은 역할인데 UIKit에서는 반복되는 view들의 정렬 같은 상황에서 개발자가 선택적으로 사용을 했다면 SwiftUI에서는 거의 필수적으로 사용을 함과 동시에 사용법도 매우 간단해졌다고 한다. 먼저 가로 방향으로 View들을 나열하는 Horizontal Stack에 대해 알아보겠다. 두개의 사각형 View를 가로 Stack으로 위치시키면 하단과 같은 모습으로 나오게 된다. HStack { Rectangle() .fill(Color.green) .frame(width: 100, height: 100, alignment: .center) R..
[IOS] Timer 이번 포스팅에서는 Timer를 사용해서 정해진 interval 간격을 두고 label의 text를 업데이트 해주는 과정을 간단하게 포스팅하려한다. 먼저 업데이트 상황을 눈으로 볼 수 있게 정중앙에 label을 하나 위치시키겠다. 그리고 count라는 변수를 만들어서 값이 바뀌면 label의 text를 변경해주게끔 옵저버 프로퍼티를 사용하겠다. var count = 0 { didSet { label.text = String(count) } } Timer가 작동되어 1초마다 count값을 변경시켜주도록 하면 label의 text의 값이 변경된 값으로 변경되는걸 볼 수 있을것이다. Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { [weak self] (..
[Swift_Grammar] Method 이번 포스팅에서는 메서드에 대해서 알아보겠다. 참고로 함수가 위치하고 있는 곳, 또는 사용되는 범위 등에 따라서 함수인지 메서드인지 호칭만 달리 정해진다. 모듈 전체에서 사용 - 함수 구조체, 클래스, 열거형등 특정 타입에 연관되어 사용 - 메서드 따라서 기본적인 함수의 형태를 다루었던 저번 함수 포스팅의 연장선이라고 할수 있겠다. [Swift_Grammar] 함수 오늘은 함수에 대해서 간단히 알아보겠다. 함수라는건 기능을 만드는 것. 그리고 함수 하나에는 하나의 기능을 만드는 코드가 들어가야 가장 베스트이다. 기본적으로 func라는 키워드와 함수의 devddong.tistory.com Instance Method 먼저 인스턴스 메서드를 보자면 특정 타입의 인스턴스(객체)에 속한 함수라고 할 수 있다. ..
[IOS] UserDefaults 이번 포스팅에서는 UserDefaults를 사용하여 앱이 삭제되기 전까지 기본 자료형 타입의 데이터를 디바이스에 저장시킬수 있는 방법에 대해 알아보겠다. UserDefaults는 사용자 기본 설정 같은 단일 데이터 값을 저장할때 주로 사용하고, 싱글톤 패턴으로 접근할 수 있어 어디서든 접근이 가능하다. 일반적으로 shared라는 타입프로퍼티로 진행하는 편이지만 Apple에서는 미리 standard라는 타입 프로퍼티로 싱글톤 패턴을 진행하게끔 마련해놓았다. SomeClass.shared . . . UserDefaults.standard 데이터를 저장하는 법에 대해 알아보자면 일단 싱글톤 객체로 접근한 다음 set 이라는 메소드를 사용한다. 그리고 첫번째 인자에는 저장을 하고자 하는 데이터의 값을 넣어주고 ..
[IOS] UserInterfaceStyle (2) 저번 UserInterfaceStyle 포스팅에서 다크모드가 가지고 있는 많은 장점을 무시한채 개인적으로 앱에 적용하고 싶은 색상이 아니어서 라이트로 고정했다. 라고 했었다.. 다시 생각해보니 다크모드 사용자를 무시하고 있는 아주 거만한 태도였고 그 거만함을 반성하고자 다크모드를 대응하는 과정을 포스팅 하려한다. 잠시 Apple이 제시하는 HIG에서 DarkMode 부분에 있는 한 문장을 빌려오겠다. "사람들은 시스템 차원에서 이러한 선택을하기 때문에 일반적으로 모든 앱이 자신의 선호도를 존중하기를 기대합니다." 즉 아래와 같다고 생각한다. 앱이 사용자의 선호도에 근접하다 == 좋은 사용자 경험을 선사한다 애플의 모든 UI/UX 권장사항을 가이드라인형식으로 기재되어 있으니 틈틈히 챙겨 봐야겠다. Dark..
[IOS] UIColor Extension 이번 포스팅에는 RGB Color를 보다 간단하게 작성하거나, 16진수 또는 RGB 같은 형식에서 얽메이지 않고 색상을 구현할 수 있도록 변환하는 Extension을 포스팅 하겠다. UIColor init중 하나인 하단 이미지를 보면 rgb값과 마지막에 alpha 값을 지정해주도록 init을 받고있는게 있다. 그러나 이 alpha 값 하나 써주기 은근 귀찮다. 하단 Extension 코드와 같이 기본값을 1로 가지고 있는 Extension을 만들어 조금이나마 간편하게 사용할 수 있다. Extension UIColor { convenience init(red: Int, green: Int, blue: Int) { self.init(red: CGFloat(red) / 255.0, green: CGFloat(..
[Swift_Library] Firebase Project 개수 한도 상향 Firebase에 project를 추가하던 도중 개수 한도 상향 요청을 하라는 메세지를 받았다. 필자는 간단한 토이프로젝트 혹은 연습용(학습용) 프로젝트로 서버의 역할을 대신해줄 녀석인 Firebase를 여태 사용해왔고 앞으로도 애용할것이기 때문에 한도 상향 요청이 꼭 필요했다. 오늘은 그 방법에 대해서 포스팅하겠다. 아래 url로 들어간 후에 Google Cloud Platform/API Project: Request Project Quota Increase - Google Developers Help Any other things we need to be aware of to help us understand the request? * Include any information that will he..
[SwiftUI] Image (2) 저번 포스팅에 이어 image를 다루는 두번째 시간이 되겠다. SwiftUI에서는 clipShape 수식어를 사용해서 image를 원하는 모양으로 만들 수 있다. 전달인자에 Circle을 초기화 해주면 원형의 image로 바뀌는걸 볼 수 있다. cornerRadius를 설정하기 위한 imageView.width의 / 2와 maskToBounds 같은 코드는 더이상 필요하지 않다. Image("swiftui") .resizable() .clipShape(Circle()) .frame(width: 100, height: 100, alignment: .center) image의 렌더링 모드는 template랑 original 이라는 모드로 2가지가 사용된다. template는 image의 불투명 영역이 가진 ..
[Swift_Grammar] Property 프로퍼티의 종류에 대해서 알아보겠다. 저장 프로퍼티 첫번째로 볼것은 저장 프로퍼티다. let과 var를 사용하여 클래스 또는 구조체의 인스턴스와 연관된 값을 저장하는 가장 단순한 개념의 프로퍼티이다. 구조체에서는 저장 프로퍼티의 초깃값이 없고 옵셔널한 값이 아니어도 저장 프로퍼티를 모두 포함하는 이니셜라이저를 제공해준다. 하지만 클래스에서는 초깃값이 없고 옵셔널한 값도 아닌 저장 프로퍼티의 존재를 허용하지 않는다. 그리하여 옵셔널한 타입으로 지정해서 기본값을 nil로 설정해주던지 아니면 해당타입의 값으로 기본값 설정을 해주던지 사용자정의 이니셜라이저를 사용해서 초기화 시점에서 기본값을 설정해주던지 해야한다. struct Music { let artist: String var like: Int } clas..