ios

    [IOS] 스플래시 화면과 다크모드 대응 화면 만들기

    간단한 앱을 만들면서 정규식, 커스텀 컬러 셋, 스플래시 뷰를 사용했던 경험을 리뷰하는 글입니다. 1. SplashViewController Main 스토리보드의 엔트리 포인트 Lottie 라이브러리를 사용해 애니메이션 재생 (Launch Screen을 안쓴 이유) 애니메이션이 끝나면 segue를 통해 SignUpViewController로 이동 class SplashViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let animationView = AnimationView(asset: "movie") view.addSubview(animationView) animationView.frame = vi..

    [IOS] 뷰에 그림자 만들기

    UIView에는 실제로 뷰를 그리는 역할을 하는 CALayer 타입의 layer라는 프로퍼티가 존재해서 이 layer가 가진 프로퍼티를 사용해 뷰에 그림자를 만들 수 있다. 그림자를 만들때 사용하는 주요 프로퍼티는 아래 4개 정도이다. shadowOffset: CGSize shadowColor: CGColor shadowRadius: CGFloat shadowOpacity: CGFloat 1. shadowOffset The offset (in points) of the layer’s shadow. Animatable. 레이어 그림자의 오프셋. 오프셋은 사전에서 "상쇄하다" 라는 뜻이지만 컴퓨터 과학에서는 "변위차"라는 의미로 사용된다. 따라서 그림자의 위치가 기존 레이어보다 얼마만큼 떨어진 지점에 위치하..

    [IOS] UIButton.Configuration을 사용해서 버튼 커스텀하기

    팀 프로젝트로 만들었던 앱의 UI를 변경하다가 게임을 시작하기 위해 눌러야 하는 준비 버튼이 너무 작아서 눈에 잘 띄지 않는다고 생각했다. 그래서 버튼의 외관(Appearance)를 변경하려다가 IOS 15에서 새로 생긴 Configuration을 사용해보고 싶었다. 기존 메소드를 사용해서 설정하는 방법과 다른 점이 꽤 있어서 관련 내용을 포스팅한다. 내가 주로 사용한 설정값을 위주로 설명한다. Configuration을 초기화하기 위해서는 아래 4가지 메소드 중 하나를 사용한다. UIButton.Configuration.plain() UIButton.Configuration.tinted() UIButton.Configuration.gray() UIButton.Configuration.filed() 말로..

    [Xcode] App Build 없이 Simulator 실행 및 기종 변경하기

    기종별로 다수의 시뮬레이터 실행하기 위해 찾아본 방법입니다. 1. Command + Space으로 Spotlight 검색 활성화 후 Simulator 검색 2. Dock의 Simulator 오른쪽 클릭 후 기종 선택 유용한 것 같아서 포스팅합니다. 참고 링크 https://stackoverflow.com/questions/5048524/can-i-start-the-iphone-simulator-without-build-and-run Can I start the iPhone simulator without "Build and Run"? I want to delete an app in the simulator before I "build and run". How can I start the simulator..

    [IOS] Socket.IO를 사용한 Node.js 서버 연결 실패 이슈에 대하여

    팀 프로젝트를 하면서 Swift 환경에서 소켓을 사용하기 위해 Socket.IO 라이브러리를 사용했다. Socket.IO, 정확히 Socket.IO-Client-Swift는 Swift에서 Socket.IO로 만들어진 서버와 연결하기 위한 도구를 제공한다. 내 Socket.IO 버전은 15.2.0, 서버는 4.4.1 이었는데 서버와 연결을 시도하니 아래와 같은 메시지가 콘솔에 출력됐다. SocketManager: masked and rsv data is not currently supported. code=1002, type=protocolError 처음엔 클라이언트 쪽의 transport(WebSocket, Polling) 또는 ATS 문제인 줄 알았으나 아니었다. 방법을 찾아보다가 결국 로컬로 서버를 ..

    [IOS] 스크롤 중 Timer가 동작하지 않았던 이슈와 해결방법

    이 글을 이해하기 위해서는 먼저 Timer와 RunLoop에 대한 이해가 필요하다. Timer와 RunLoop에 대하여 간략하게 정리한 글 https://lietenant-k.tistory.com/29?category=999190) 팀 프로젝트를 진행하다가 Timer를 활용하여 카운트다운 기능을 구현하려고 했다. countDown 메서드 내부에서 Main RunLoop에 Timer를 추가하고 1초 간격으로 타이머를 발동시켜서 해당 코드 블럭을 호출하게 했다. var time = 10 let label = UILabel() func countDown(){ let timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { [unowned self]..

    [IOS] Notification을 이용하여 여러 클래스에서 데이터 받기

    영화 정보 앱을 만드는 부스트코스 프로젝트에서 사용자가 선택한 정렬 기준에 맞게 영화 목록을 갱신하여 보여주는 기능을 구현하려고 했다. 사용자가 선택한 기준으로 정렬된 데이터가 담겨있는 URL에서 데이터를 가져오면 끝나는 일이었지만, 데이터를 요청한 클래스가 아닌 다른 클래스에도 가져온 데이터를 전달하여 동일한 정렬된 데이터로 갱신해야 했다. 이것을 해결한 방법을 간단하게 정리하려고 한다. 데이터를 요청하는 전역 메소드인 requestData 메소드를 살펴보자. func requestData(_ sub: String, _ para: String, _ type: T.Type, _ noti: Notification.Name) { let session = URLSession(configuration: .def..

    [IOS] UIModalPresentationStyle의 pageSheet과 formSheet의 차이

    두 프레젠테이션 방식이 실제 화면에서 어떻게 다른지 비교하기 위해 간략하게 설명하려고 한다. UIModalPresentationStyle은 뷰 컨트롤러가 modal 방식으로 화면에 보여질 때 어떤 방식으로 보여줄 것인지 설정하는 열거형 객체이다. 자칫하면 UIModalTransitionStyle과 헷갈릴 수 있는데, UIModalTransitionStyle은 해당 뷰 컨트롤러로 화면이 전환될 때 전환 이펙트(수평 접기, 수직으로 올라오기 등)라고 생각하면 된다. MS PowerPoint의 슬라이드 간 전환 애니메이션과 동일하다고 보면 된다. 글에서 다룰 두 가지 외에도 다른 여러가지 스타일들이 있으나, 여기서는 pageSheet과 formSheet만 다뤄보도록 하겠다. ※ UIModalPresentati..

    Timer 객체와 RunLoop에 대하여

    부스트코스의 IOS 앱 프로그래밍 프로젝트를 진행하면서 Timer객체를 처음 써봤다. 개발자 문서를 봐도 처음엔 이해가 잘 되지 않아서 그냥 간단히 사용법만 알고 넘어갔었는데 부스트코스를 마치고 나서 복습을 하다보니 Timer 객체를 사용하면서 알아야 할게 많은 것 같아 이 글에 간단히 정리해보고자 한다. 음악 플레이어를 만들기 위해 Timer 객체를 사용했었으니, 그 코드 중 일부를 가져와서 분해 및 설명하는 방식이 이해하는데 더 도움이 될 것 같다. 아래 코드는 타이머를 만들고 작동시키는 기능을 하는 메소드이다. func makeAndFireTimer(){ self.timer = Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true, block: {..

    [IOS] UIImageView의 모서리를 둥글게 만드는 방법

    UIImageView 객체의 layer 프로퍼티를 수정해줌으로써 변경할 수 있다. clipsToBounds 프로퍼티를 true로 변경해야 정상적으로 보여진다. clipsToBounds가 true면 레이어의 바깥으로 벗어난 이미지를 잘라낸다. UIImageView의 contentMode 설정으로 인해 이미지가 객체의 Bounds 보다 커졌을 때도 사용할 수도 있다. let image = UIImageView() self.contentView.addSubview(image) image.backgroundColor = .white image.layer.cornerRadius = 5 image.clipsToBounds = true