-
[Swift] frame이 다시 초기화 되는 오류 - translatesAutoresizingMaskIntoConstraints개발/Swift 2021. 12. 8. 17:43
요구사항
UI 의 사이즈가 isExpaned 상태에 따라 커졌다 작아져야함
Error
showTwoButtonDialog를 실행하여 팝업을 띄우는경우
UI의 사이즈가 초기화 되어
isExpanded 상태와 반대가 되어버려 UI 오류가 발생함
1. 사이즈 변경 버튼 -> 모듈맵 커짐 - isExpaned = true 2. showPopup -> 모듈맵 보통 크기로 돌아옴 - isExpanded = true 3. 사이즈 변경 버튼 -> 모듈맵 작아짐 - isExpanded = false
uiview 의 사이즈를 변경하는 함수
private func expandModuleMap(){ let currentFrame = self.moduleMapView.frame let newFrame = self.codingViewModel.getNewModuleMapFrame(currentFrame:currentFrame) UIView.animate(withDuration: 0.3) { self.moduleMapView.frame = newFrame } }
단순히 backgroundColor를 바꿔봤다.
private func expandModuleMap(){ self.moduleMapView.backgroundColor = .red }
그랬더니 정상 동작함.
즉 view가 초기화 되는것이 아니라 frame 이 초기화 되는것을 발견했다.
그리고 다른 버튼들 역시 frame이 초기화 되지만 (아래 예시 저장버튼)
@IBAction func onClickSave(_ sender: Any) { webViewVC.saveProject(title:project.title) saveProjectLabel.text = "ProjectSavedLabel".localizedByKey() projectSavedImageView.isHidden = false }
닫기 버튼을 누르는경우 frame이 초기화 되지 않았음
@IBAction func onClickCloseButton(_ sender: Any) { NavigationManager.showTwoButtonDialog(self,title: "Exit".localizedByKey(),contentText: "ExitDialogContent".localizedByKey()){ self.navigationController?.popViewController(animated: true) } }
결국 해당 VC의 UI를 변경하는 로직이 있는경우
frame이 초기화 되며
UI를 건들지 않는 경우 frame이 초기화 되지 않음을 발견했다.
해결 방법
자꾸 초기화 되는 view에 이설정을 넣어줬더니 해결되었다.
self.moduleMapView.translatesAutoresizingMaskIntoConstraints = true
translatesAutoresizingMaskIntoConstraints 설정은 스토리 보드 기반의 view에서는 false 로 지정된다.
코드 based는 true로 지정된다.
코드베이스로 constraint를 지정할때 이 값을 false로 지정했었음을 기억한다.
애플문서에는 이렇게 나와있다.
If this property’s value is true, the system creates a set of constraints that duplicate the behavior specified by the view’s autoresizing mask. This also lets you modify the view’s size and location using the view’s frame, bounds, or center properties, allowing you to create a static, frame-based layout within Auto Layout.
frame / bound / center 를 수정하고싶으면 true로 세팅하라고 나와있다.
creates a set of constraints based on the view’s frame and its autoresizing mask
이걸 true로 세팅해주면 해당 view의 frame과 autoresizing mask를 활용해
제약조건들을 만들어 준다한다.
'개발 > Swift' 카테고리의 다른 글
존재하는 프로젝트cocoapod private용으로 배포 하기 (0) 2021.12.27 [Swift] Dynamic Dispatch / Static Dispatch (0) 2021.12.20 [Swift] UIResponder 대략 알아가기 (0) 2021.12.01 [Swift] PromiseKit 사용하여 콜백지옥 빠져나오기 (0) 2021.11.30 [Swift 코딩테스트] 프로그래머스 - 체육복 (0) 2021.11.29