러닝앱에서 러닝을 끝내면 러닝 결과를 보여주는 화면이 나타난다. 이때 이 화면에서 지도와 함께 뛴 루트를 보여준다. 이때 지도를 넣고 오버레이를 그리는 방식으로 구현해도 되지만, 지도는 많은 자원을 사용한다. 단순히 경로를 보여주는 역할을 하기에는 자원 사용률이 높아서 과하다고 생각했고, 이를 이미지로 만들어서 보여줄 수 있는 방법이 없을까 했는데, MKMapSnapshotter라는게 있어서 사용해 보았다. MKMapSnapshotter 지도와 지도의 컨텐츠를 이미지로 캡처해 주는 기능을 제공하는 클래스 입니다. 지도를 보여주지만, 상호작용이 필요하지 않을때 사용하는 것을 추천하고 있습니다. 지도를 캡처할 때, 오버레이나 annotation 까지 같이 표시해주지 않습니다. 따라서 캡처한 이미지 위에 오버..
코드로 버튼을 생성하고 cornerRadius를 적용해 둥글게 만드려고 했는데, 적용되지 않았던 이슈가 있었다. 내가 알고 있던 것은 cornerRadius가 적용 안 되는 이유는 레이아웃이 아직 완전히 잡히질 않아서인데 ViewDidAppear에서 버튼을 add 하고, cornerRadius 세팅하는 함수를 호출하고 있어서 레이아웃이 아직 잡히질 않았을 리가 없어서 의아해서 해결 방법을 찾아보니, 레이아웃이 모두 잡혔을 때에서 호출되는 viewDidLayoutSubviews()에 호출하니 정상적으로 적용 되었다. ViewDidAppear일 때도 레이아웃이 모두 잡혀있을 텐데 왜 적용이 안될까 라는 궁금증이 생겨, 뷰가 화면에 그려지는 과정에 대해 알아보았다. 뷰가 화면에 그려지는 과정은 크게 3가지로 ..
함수의 인자값 전달은 기본적으로 call by value로 동작한다. 따라서 함수 내부에서 인자값을 변경하더라도 원래 값은 변경 되지 않기도 하고, 함수의 파라미터는 상수(let)로 선언되어있다. 따라서 아래와 같이 함수 내부에서 파라미터 값을 변경 하려고 하면, 오류가 발생한다. func changeValue(input: Int) { input = 10 } 하지만 class타입의 경우, class타입 내부에 있는 프로퍼티는 변경이 가능하다. class A { var a = 10 } func changeValue(input: A) { input.a = 20 } let classA = A() changeValue(input: classA) print(classA.a) // 20 출력 classA를 생성 할..
자바의 참조타입은 Call by Value로 동작한다길래, swift의 개념도 흔들려서 이번기회에 꽉 잡기위해 포스팅한다. 누구나 알고 있겠지만 Call by Value, Call by Reference를 정의 하면 Call by Value 값을 복사하여 처리한다 Call by Reference 주소를 참조하여 처리한다. 여기서 헷갈린 개념이, 그러면 참조 타입은, 주소 값을 가지고 있고, 다른 변수에 할당 할 때, 이 값을 복사해서 다른 변수에 할당하는 것인지를 헷갈렸다. 결론부터 말하자면, 주소를 복사해서 다른 변수에 할당하는 것이 아닌, 참조 그 자체를 복사한다. 즉 주소값을 복사하는게 아니다. class A { var a: Int = 0 } var classA = A() var classB = c..
프로젝트를 진행하던 도중, 아래와 같은 화면을 만들어야 했다. UILabel과 언더라인 뷰를 하나의 스택뷰로 만들어서 UILabel안에 입력된 크기에 따라 width가 변하는 하나의 스택뷰를 만들기로 결정. 글자크기는 80pt로 주고 스택뷰로 묶어서 만든 결과 이런 결과가 나왔다. 상하 여백이 넓게 존재해, 디자인한 UI와 맞지 않는다. 처음에는 이를 해결하기 위해 sizeToFit()함수를 사용했지만 여전히 똑같이 나온다. 글자가 UILabel의 중심에 있는것으로 보아, 이를 설정할 수 있는 변수가 존재한다고 생각하고, 공식 문서를 뒤져봤지만 존재하지 않았다. 몇 시간의 삽질 끝에 원인을 찾아냈다. 이런 문제가 발생한 이유 원인은 UILabel 자체가 아닌 font자체에 있다. 영어 노트를 생각해 보면..
상단 메뉴 바를 완성했으니, 메뉴바를 클릭하면, 해당 화면으로 화면이 변경되도록 해야 합니다. UITabBarController처럼, Controller를 만들어서 메뉴바와 화면을 가지고 있으면서, 사용자가 원하는 배치로 만들 수 있게 하겠습니다. class CustomTabBarViewController: UIViewController { lazy var menuBar: CustomMenuBar = { let menuBar = CustomMenuBar() menuBar.translatesAutoresizingMaskIntoConstraints = false return menuBar }() lazy var pageView: UIView = { let view = UIView() view.translat..