2016-07-17 11 views
0

나는 책에서이 연습을 접하고 있는데,보기에는 임의로 배치 된 레이블을 만드는 메서드 구현이 있습니다. 코드는 다음과 같습니다.두 줄의 코드가 같은 것을 말하고 있습니까?

1 - (void)drawHypnoticMessage:(NSString *)message{ 
2  for(int i =0; i<20; i++){ 
3   UILabel *messageLabel = [[UILabel alloc] init]; 

4   messageLabel.backgroundColor = [UIColor clearColor]; 
5   messageLabel.textColor = [UIColor whiteColor]; 
6   messageLabel.text = message; 
7   [messageLabel sizeToFit]; 

8   int width = self.view.bounds.size.width - messageLabel.bounds.size.width; 
9   int randomX = arc4random() % width; 
10   int height = self.view.bounds.size.height - messageLabel.bounds.size.height; 
11   int randomY = arc4random() % height; 

12   CGRect frame = messageLabel.frame; 
13   frame.origin = CGPointMake(randomX, randomY); 
14   messageLabel.frame = frame; 

15   [self.view addSubview:messageLabel]; 
16  } 
17 } 

잘 작동합니다. '이 작동하지 않았다

12 CGRect frame; 

, 나는 돈 : 제 질문은 라인 (12) 및 (14)에 대한되고 내가 책에서 엑스 코드로이 운동을 복사하고 있었고, 난 라인 (12)에 도착했을 때, 나는 본능적으로 변경 이유를 이해하지 못한다. 나에게 12 행과 14 행 :

12 CGRect frame = messageLabel.frame; 

14 messageLabel.frame = frame; 

두 번 똑같은 말을하고있는 것입니다. 아무도 설명 할 수 없습니까?

+0

당신이 이해해야 만하는 것은이 맥락에서 = 할당을 의미한다는 것입니다. 평등을 나타내지는 않습니다 (일부 언어에서는 IF 문과 동일 함). 따라서 A = B는 B = A와 같은 의미가 아니며 프레임 13을 다시 할당하기 전에 내부 값을 조정합니다. –

답변

3

Objective-C는 Objective-C 개체의 속성에 액세스하기 위해 C의 구조체 멤버 액세스 연산자 (.)를 오버로드합니다. 문제는 컴파일러의 파서가 혼란 스럽기 때문에이 두 문을 하나의 할당 문에 혼합 할 수 없다는 것입니다.

messageLabelframe이라는 속성이있는 개체입니다. frameoriginsize의 두 멤버가있는 구조체입니다.

이 제한을 해결하기 위해, 당신은 (예를 들어 frame), 재산에 새로운 구조체 (frame)을 할당 한 후 (구조체가 할당에 복사)이 복사본을 조작하고, 구조체를 개최 임시 변수를 사용해야합니다, 속성 값을 업데이트합니다.

2

13 번 줄에서 프레임을 수정하고 있습니다. 즉, 원점 값을 변경하고 있습니다. 이 책은 포인트 또는 크기 값을 단독으로 변경할 수 없으므로 프레임을 변경하는 일반적인 기술을 보여줍니다.

+0

죄송하지만이 점을 이해하지 못합니다. 프레임의 원점을 (13 행에서) 어떻게 든 변경하면 프레임이 messageLabel.frame에 멈추는 것을 말하는 것입니까? – Paul

+1

예, messageLabel 프레임의 값을 가진 새 '프레임'을 만든 다음이 '프레임'을 변경하고 messageLabel에이 변경 사항을 표시하게하면 messageLabel 프레임을이 새 프레임에 할당합니다. 이 코드 줄을 사용하여 동일한 결과를 얻을 수 있습니다. "messageLabel.frame = CGRectMake (randomX, randomY, messageLabel.frame.size.width, messageLabel.frame.size.height);" – JingJingTao