나는 프로그램에서 크기 조정 및 서브 뷰 재배치를 수행하는 프로젝트에서 많은 수의 뷰를 보유하고 있습니다. 나는 다음과 같은 코드를 사용하여, layoutSubviews
에서이 작업을 수행 :뷰를 재배치하기 위해 CGRect를 재사용하는 것이 나쁜 이유는 무엇입니까?
CGRect rect = self.btnOne.frame;
// change values for rect
self.btnOne.frame = rect;
// re-use same CGRect to reposition other views
rect = self.btnTwo.frame;
// change values
self.btnTwo.frame = rect;
// etc. ...
코드의이 유형은 항상 지금, 몇 년 나를 위해 좋은 일했다. 나는 최근에 이와 같은 코드를 동료의 프로젝트에 추가했으며, 지금은 매우 이상하게 행동하기 시작했습니다. 이유는 모르겠지만 여기에서 다시 사용 된 rect
객체는보기의 프레임이 지정 될 때와 블록의 끝에있는보기의 프레임에 다시 할당 될 때 사이에 임의로 자체 값을 변경합니다. 결과는 잘못된 위치에있는 하위 뷰입니다. 오류는 대개 rect.origin.y
또는 그 반대로 값을 획득하는 rect.origin.x
의 형식을 취하는 것으로 보입니다.
심지어 더 이상한이 문제는 실제 장치에서만 발생합니다. 시뮬레이터에서 실행되는 똑같은 코드에는 문제가 없습니다.
수정 프로그램과 같이, 각각의 서브 뷰에 대한 고유 선언 CGRect 객체를 사용하는 것입니다
CGRect rect = self.btnOne.frame;
// change values for rect
self.btnOne.frame = rect;
// declare new CGRect to reposition other views
CGRect rect2 = self.btnTwo.frame;
// change values
self.btnTwo.frame = rect2;
나는이 변경하면 모든 것이 제대로 작동으로 돌아 간다. 하지만 저는 왜 이런 일이 발생 하는지를 알고 싶어합니다. 특히 장치에서 발생하지만 왜 시뮬레이터에서는 발생하지 않는지를 알고 있습니다.. 또한 동료가보기에 변경을 가할 때까지는 발생하지 않는 것처럼 보이지만보기의 배치와 관련이없는 변경이이를 수행 할 수있는 방법은 분명하지 않습니다.
또 다른 변경 사항은 코드를 가져온 프로젝트가 ARC를 사용하는 반면 원래 코드는 ARC를 사용하지 않는 것입니다.
'self.btnOne.frame;'행은 아무 효과가 없습니다 (컴파일러 경고를 제공해야합니다). 이게 진짜 코드인가요? –
rect는 스택에 있기 때문에 스택의 다른 위치에 배열이 있으면 일부 코드가 배열 (또는 다른 구조체)의 끝 (또는 시작 전에)을 쓰고 있으면 rect의 일부를 덮어 쓸 수 있습니다. 변수에 감시 점을 놓고 변수가 어디에서 변경되었는지를 파악하여 변수의 원인을 정확히 파악할 수 있습니다. – user1118321
동료의 프로젝트에있는 견해가 변화의 영향을 받는지 알려줄 수 있습니까? Apple docs는 transform 속성에 대한 경고 메시지를 표시합니다. "이 속성이 ID 변환이 아닌 경우 frame 속성의 값은 정의되지 않으므로 무시해야합니다." –