1월, 2020의 게시물 표시

frame과 bounds를 observe할 때 차이는?

이미지
frame과 bounds를 observe할 때 차이는? UIView의 크기 변화를 관찰하여 임의로 생성한 Layer의 크기를 조정해야하는 프로젝트가 있었습니다. frame에 observer를 추가를 했고 code생성한 UI에서는 잘 동작을 했습니다. 그런데 storyboard에서 제약조건을 추가한 UI에서는 frame의 크기 변화가 관측되지 않았습니다. bounds에 observer를 추가했을 때 bounds의 크기 변화가 관측되었습니다. 왜 제약조건에서는 frame의 크기 변화가 관측되지 않을지 궁금했습니다. 이번 포스트에서는 frame과 bounds에 대해서 알아보고 각각에 대해서 관측했을 때 어떤 점이 다른지 확인해보겠습니다. frame frame은 부모view에 의해 조정되는 view의 위치와 크기를 표현하는 사각형입니다. view의 위치와 크기를 조정하기 위해서 설정할 수 있습니다. view의 center값 조정 시 origin point가 변경되고 bounds값에 의해 size가 변경될 수 있습니다. 경고 transform이 identity가 아니라면 frame은 정의되지 않으며 그렇기때문에 해당 값은 무시해야합니다. 경고의 의미가 무엇인지 코드를 통해 확인해 보겠습니다. let view1 = UIView ( frame : CGRect ( x : 80 , y : 120 , width : 100 , height : 50 ) ) view1 . backgroundColor = . red print ( "view1 frame: \( view1 . frame ) " ) print ( "view1 bounds: \( view1 . bounds ) " ) print ( "view1 center: \( view1 . center ) " ) view1 . transform = CGAffineTransform (

[Troubleshooting] tableViewCell에서 제약조건이 동작하지 않을 때

이미지
[Troubleshooting] tableViewCell에서 제약조건이 동작하지 않을 때 이번 포스트는 tableViewCell에서 제약조건이 동작하지 않아 고생했던 경험을 나누려고 합니다. 스토리보드에서 tableViewCell안에 여러개의 view를 추가한 다음에 제약조건을 작성했습니다. 그다음 앱을 실행해서 확인해 보았는데 제약조건이 전혀 동작하지 않았습니다. 원인은 tableViewCell의 contentView에 CustomView를 설정해서 제약조건이 동작하지 않았습니다. 왜 contentView를 사용자화하면 문제가 발생하는지 궁금했습니다. 원인을 파악하기 위해서 그날의 상황을 가정하여 간단한 프로젝트를 만들어 재현해보겠습니다. 먼저, 아래 그림처럼 스토리보드를 구성했습니다. 메인화면에서 move 버튼을 선택하면 tableView가 보이도록 단순하게 되어 있습니다. TableViewController는 TestTableViewController를 만들어 설정했고 cell은 TestTableViewCell로 만들었습니다. contentView는 TestView로 설정하고 TestTableViewCell에 titlte property를 만들어서 스토리보드에 연결시켰습니다. 제약 조건은 아래처럼 설정했습니다. TestTableViewController는 아래 코드처럼 3개의 항목이 보이도록 작성했습니다. class TestTableViewController : UITableViewController { let datas = [ "1. Test" , "2. Test" , "3. Test" ] override func numberOfSections ( in tableView : UITableView ) - > Int { return 1 } overri

dismiss에 대해서 알아봅시다

이미지
dismiss에 대해서 알아봅시다 예전에는 dismiss를 호출하면 호출한 viewController가 dismiss된다고 생각했습니다. 그런데 어떤 경우는 자신이 dismiss되는게 아니라 자신이 present한 viewController가 dismiss되었습니다. dismiss 동작에 대해서 제대로 이해하지 못해서 벌어진 일이었습니다. 그래서 이번에는 dismiss에 대해서 알아보려고 합니다. 먼저, Apple API에 정의된 dismiss를 먼저 알아보겠습니다. presenting viewController는 presented viewController를 dismiss하는 책임을 가지고 있습니다. 만약 presented viewController에서 dismiss를 호출한 경우는 UIKit이 presenting viewController에 해제 관리를 요청합니다. 여기서 말하는 presentingViewController와 presentedViewController는 무슨 객체일가요? presentingViewController객체는 자신을 화면에 보이도록 만든 viewController입니다. presentedViewController는 자신이 화면에 보이도록 표시한 viewController입니다. 아래 코드로 presentingViewController와 presentedViewController를 설명하겠습니다. let viewController1 = UIViewController ( ) let viewController2 = UIViewController ( ) let viewController3 = UIViewController ( ) viewController 3개가 존재하는데 viewController1이 화면에 표시되고 있는 rootViewController라고 가정하겠습니다. viewController1 . present ( viewController2 ,