2012-02-23 2 views
13

이 사실을 알고있는 사람들에게는 매우 어리석은 소리가 들리 겠지만 나는 IOS에 상당히 익숙합니다. 내가 알고 싶었던 이유는 왜 원점이나 크기를 수정할 수 없으며 UIView 프레임의 이러한 속성의 x, y 또는 높이 너비가 될 수 있습니까?UIView 프레임의 크기 나 원점을 직접 변경할 수없는 이유는 무엇입니까?

프레임은 CGRect 구조체이며 원점과 크기는 다시 CGPoint 및 CGSize 구조입니다. 우리가 액세스 할 수있는 이유는 무엇입니까?

CGRect에는 이와 비슷한 점이 없으므로 속성을 수정할 수 있습니다. 프레임 또는 경계에 대해 수행 할 수없는 이유는 무엇입니까?

myView.frame.origin.x = 23.0; 

그것은 그것에 대해 바보 좋은 질문, 아무것도 없습니다 :

+0

큰 질문, 전혀 바보가 아닙니다! –

+1

@ChrisNolet : 게시 한 지 2 년이 지났습니다! –

+2

4 년 동안 iOS를 해본 결과 마침내 프레임을 직접 설정할 수없는 이유를 알게되었습니다! –

답변

19

난 당신이 뭔가를 할 수없는 이유 뜻 가정합니다. 문제는 프레임이 뷰의 속성으로, 프레임의 개별 구성 요소 (크기와 원점, 또는 더 깊이, 폭, 길이, x 및 y)로 유지되지 않는다는 것입니다.

프레임은보기의 기본 요소이므로 프레임이 수정 된 경우보기에서 수행해야하는 많은 작업이 있습니다. 처음에 origin.x를 수정해서 수정한다면 setFrame 메소드를 우회 할 것입니다.이 마법은 모두 발생합니다.

당신이 view.frame, 와 같은 값을 가지고 있지만 실제로 프레임 아닌 CGRect을 부여하고있다 view.frame 액세스, 그래서 어떤 수정이보기에는 영향을주지 않습니다

.

당신은 단계를 수행 할 수 있습니다

CGRect frame = view.frame; 
frame.origin.x = 23.0; 
view.frame = frame; 
+0

답변 주셔서 감사하고 어리석은 고려하지. 그러나 나는 그것을 이해 한 후에 바보 같이 느낍니다. 나는 비슷한 의의가있는 사람이라면 도움이 될 것입니다. –

+1

미안하지만, 아직 이해가 안갑니다. 좋아,'view.frame'에 의해 실제'view.frame'이 아닌 C 구조체를 얻습니다. 우리가 사본을 얻는다는 것이 더 간단하지 않습니까? 좋습니다, 그래서 우리는 사본을 얻습니다. 어쨌든 왜 사본이 필요합니까? – Philip007

+0

원산지/크기를 업데이트해도 프레임을 업데이트 할 수없는 이유에 대한 답변이 없습니까? –

8

대답은 (약간 난독) 언어 구문에있다 :

  1. myView는 목표 - C 개체입니다.
  2. 그래서 myView.frame은 전송중인 속성 접근 자 메서드입니다.
  3. CGRect 형식의 C 구조체를 반환합니다.
  4. frame.origin.x = 1은 코드에서 로컬로 반환되는 임시 구조체를 수정합니다.

의도는 메시지를 보내 개체를 알려주는 것이 었습니다. 하지만 대신 객체에 데이터를 요청한 다음이 데이터를 수정했습니다. 그 대상은 결코 지금은 없을 것입니다.

컴파일러에서이 오류에 대해 경고해야합니다.

+0

깨끗한 단순 답변에 감사드립니다. –

관련 문제