타입캐스팅 인스턴스의 타입을 확인하거나 자신을 다른 타입의 인스터스인 것처럼 사용할 수 있는 방법 is 와 as를 연산자로 사용. 캐스팅은 실제로 인스턴스를 수정하거나 값을 변경하는게 아님. -> 어떤 타입으로 접근할 지 힌트를 주는 것 뿐, 인스턴스는 메모리에 똑같이 남아있음. 아래와 같이 세 가지 클래스를 선언해주었음. class MediaItem { var name: String init(name: String) { self.name = name } } class Movie: MediaItem { var director: String init(name: String, director: String) { self.director = director super.init(name: name) } } cl..
iOS Layout 코드로 레이아웃을 짜는 경우엔 간단한 몇 가지 과정이 있음. 1. 인스턴스 생성 2. 루트뷰에 추가 3. 크기 및 위치 설정 처음엔 Frame Based Layout. 왼쪽 위 (0, 0)을 기준으로 width와 height를 이용해 레이아웃을 잡는 방식이었음. 디바이스가 다양해히면서 한계를 느낌. -> AutoResizing Mask, AutoLayout이 등장. 기존의 Frame Based Layout에서 뷰의 위치와 크기를 직접 정했다면, 이후엔 제약을 추가하는 형태로 전환됨. AutoResizing Mask는 부모 뷰를 기준으로 서브 뷰의 크기와 위치를 정하는 방식임. 이렇게 만들어진 레이아웃들은 Constraints로 변환됨 -> AutoResizing Mask 이후 제약 설..
UIButton.configuration -> 따로 정리했음. Frame vs Bounds Frame frame은 상위 뷰의 좌표계를 기준으로 뷰의 위치와 크기를 나타내는 것. 상위 뷰의 왼쪽 위 지점을 (0, 0)으로 두고 CGSize인 width와 height 값으로 뷰를 그림. 그래서 frame의 origin을 바꿔주면 자신과 subView들 전부 이동됨. 예를 들어, origin 값이 (0, 0)에서 (50, 50)으로 바뀐다면 상위 뷰를 기준으로 오른쪽으로 50, 아래로 50만큼 이동. Bounds bounds는 상위 뷰가 아닌 자신의 좌표계에서 위치와 크기를 나타냄. 계층 구조에 상관없이 모든 뷰의 왼쪽 위가 (0, 0)이 되는 것. origin값이 바뀌는 것은 해당 뷰가 스크롤뷰라고 생각하면..
iOS 15부터 configuration을 이용해 버튼을 다양하게 구성할 수 있다. Style 아래의 코드에서 filled()부분만 바꿔가며 확인해보았다. color baseBackgroundColor로 배경색을, baseForegroundColor로 글씨 색을 바꿀 수 있다. baseForegroundColor가 이전의 tintColor를 의미하는 것 같다. title configuration을 이용해 title과 subtitle도 설정할 수 있다. subtitle은 항상 타이틀의 아래에 위치해 있는 것 같고, titleAlignment를 통해 타이틀의 위치를 정할 수 있다. padding을 이용하여 title과 subtitle간의 거리를 늘릴 수도 있다. 버튼의 높이를 고정시키지 않았더니 버튼의 높이..
1. restricted와 denied는 합쳐도 될 것 같다. case .restricted: //기본적으로 새싹캠퍼스의 날씨지만, 레이블은 서울만 표시(현대카드 웨더처럼) allHidden() locationButton.image = UIImage(systemName: "location") hud.show(in: view) AddressAPIManager.shared.getLocationData(lat: lat, lon: lon) { value in self.locationLabel.text = "\(value.regionFirst)" WeatherAPIManager.shared.getWeatherData(lat: self.lat, lon: self.lon) { value in //첫번째 뷰 let i..
- Total
- Today
- Yesterday