뷰를 그리다가 viewDidLayoutSubviews()를 아무 생각 없이 쓰고 있는 자신을 발견했습니다. 강의를 통해 알게 된 메서드인데 정확하게 어떤 메서드인지, 어떻게 동작하는지 궁금해져 검색하다가 레이아웃에도 사이클이 존재한다는 것을 알게 되었습니다. 처음 알게 되어 공부를 하고 이해한 것을 바탕으로 정리를 해보려고 합니다. Layout Cycle에 대해서 알기 전에 Main run loop와 Update Cycle에 대한 이해가 필요합니다. Main run loop 그림은 사용자에 의해 발생한 이벤트가 반응하는 과정을 보여줍니다. 사용자가 화면을 터치했을 때 발생하는이벤트를 event queue에 저장됩니다. application 객체는 저장되어있는 이벤트를 하나씩 꺼내 해석하고 이에 맞는 co..
개발 중에 뷰간에 데이터를 주고받는 상황에서 데이터 처리가 제대로 되지 않은 상황이 있었다. 검색 결과 내가 직면한 문제는 뷰의 라이프 사이클에 대한 문제였다. 확실하게 이해하고자 라이프사이클을 정리해보고자 합니다. ViewController 라이프사이클의 상황별 메소드 ( 애플 공식 문서 ) loadView() 뷰 컨트롤러를 위해 뷰를 그리는 단계입니다. 코드로 전체 인터페이스를 재정의할 때 사용합니다. 스토리보드를 사용할 때는 사용하면 안 되는 메소드이며, 특별한 이유가 있지 않는 이상 이 메소드는 사용하지 않는 것이 좋습니다. viewDidLoad() 뷰 컨트롤러가 뷰의 계층구조를 메모리에 로드한 후 호출되는 메소드입니다. viewWillAppear 뷰가 뷰의 계층에 추가되기 전이나 뷰를 보여주기 ..
스토리보드를 사용하는 것보다 코드를 이용해서 개발하는 것을 연습하는 게 좋다고 해서 공부하다가 막힌 부분이 있었다. 막혔던 부분을 강의를 통해 알게 되어 정리하려고 합니다. 우선 multiplier는 스토리보드 상에서 손쉽게 변경 가능합니다. 하지만 코드 상으로 바꾸기를 시도한다면 에러가 발생합니다. multiplier는 읽기 전용이네요. 변경할 수 없습니다. 이 값을 바꾸기 위해선 NSLayaoutConstraint 자체를 새로 만들어서 적용해줘야 합니다. multiplier 이외의 값을 설정되어있던 값을 가져옵니다. NSLayoutConstraint.init을 사용해서 multiplier값을 제외한 모든 값은 self를 통해 가져옵니다. 여기서 원래 설정되어있던 값을 비활성화시켜줘야 하는데, 이 과정..
개발 중에 막혔던 부분을 해결해서 까먹지 않게 정리하자. 우선 버튼에 곡선 값을 줄 수 있는 cornerRadius라는 메소드가 있다. 이 메소드는 layer로 한 번 감싸주고 사용해야 한다. // let button = UIButton() // width : 200, height = 100 button.layer.cornerRadius = 50 이렇게 간단하게 했을 때는 잘 적용되다가, 이번에 프로젝트 진행 중에 모양이 코드대로 변하지 않는 상황을 마주했다. 분명 되긴 되는데 버튼 하나의 배경색을 바꿔보니 무엇이 문제인지 알았다. 왼쪽 것도 되긴 되었지만, 배경색과 같아서 티가 나지 않았던 것이다. 이런저런 방법을 찾다가 도저히 시원한 답변을 찾지 못하다가, 우연히 강의에서 깔끔한 해결 방법을 찾아냈다..
면접에서 자주 나오는 질문들을 하나씩 선택해서 공부해보면서 iOS를 좀 더 깊게 공부해볼까 한다. 첫 번째 주제는 Frame과 Bounds의 차이점이다. 일단 나는 앱 개발을 해보면서 Frame만 사용해보았다. 친숙한 Frame부터 정리를 해보자 Frame Frame 메소드를 애플 공식 개발자 홈페이지(https://developer.apple.com/documentation/uikit/uiview/1622621-frame)에서 보면 Apple Developer Documentation developer.apple.com '직사각형의 프레임을 슈퍼뷰(부모뷰, 상위뷰)의 좌표계에서 위치와 크기를 설명한다.'라고 설명되어있다. 말로 보면 조금 헷갈려서 바로 그려보았다. 크기는 같은 크기를 주고 좌표값만 다르..
까다롭기로 소문난 스위프트의 문자열에 조금이라도 익숙해지기 위해서 String의 자주 쓰는, 유용한 함수를 정리해보고자 한다. https://developer.apple.com/documentation/swift/string Apple Developer Documentation developer.apple.com 우선 공식 홈페이지의 String을 살펴보자면 구조체이고, 다른 언어와 같이 character가 모인 집합이다. 문자열을 배열로 문자열의 요소 하나하나를 배열로 만드는 방법은 간단하다. Array()를 사용해주면 되는데 코드 예제는 아래와 같다. let name: String = "Swift" let arrName: = Array(name) print(arrName)// ["S", "w", "i..
https://www.acmicpc.net/problem/2346 2346번: 풍선 터뜨리기 1번부터 N번까지 N개의 풍선이 원형으로 놓여 있고. i번 풍선의 오른쪽에는 i+1번 풍선이 있고, 왼쪽에는 i-1번 풍선이 있다. 단, 1번 풍선의 왼쪽에 N번 풍선이 있고, N번 풍선의 오른쪽에 1번 풍선 www.acmicpc.net 친구가 같이 문제 하나 풀어보자고 해서 백준에서 문제 하나를 골라서 풀어봤다. 백준의 2346번 문제고 이름은 풍선 터뜨리기였다. 고민했던 방법은 세가지 였는데, tuple 이용하기 배열을 이용 -> 터진 풍선 삭제 -> 터진 풍선 0으로 바꾸기 deque 이용 고민 끝에 2+3번을 채택해서 풀었지만 index 값을 출력하는 과정에서 터진 풍선을 고려하기가 너무 까다로워서 포기했..
Swift 공부하고 처음으로 문제 한 번 풀어보려고 프로그래머스 고득점 Kit dp 정렬 level 1 문제를 풀었다. 결과적으론 고생을 좀 했는데, Swift가 아직 익숙하지 않아서 생긴 문제였다. ArraySlice와 정렬을 사용하는 과정에서 나의 부족함이 많이 드러났다. 우선 내 코드는 이렇다. var resultSet: [Int] = [] for command in commands { let start: Int = command[0]-1 let end: Int = command[1]-1 let result = array[start...end] let sortedresult = result.sorted() resultSet.append(sortedresult[command[2]-1]) } retur..