2016-07-17 5 views
0

私はこの練習を本に続けていますが、ある時点で、ビュー内にランダムに配置されたラベルを作成するメソッドの実装があります。コードは次のとおりです。同じことを言っている2行のコード?

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に関してれ、私は本からのXcodeにこの練習をコピーして、私はライン12に達したとき、私は本能的にそれを変更しました理由を理解できない。私には、12行目と14行目:

12 CGRect frame = messageLabel.frame; 

14 messageLabel.frame = frame; 

同じことを2回言っているのは確かです。誰もそれがそうでない理由を説明してもらえますか?

+0

私はあなたが理解しなければならないことは、=このコンテキストでの割り当てを意味すると思います。それは平等を表すものではありません(一部の言語ではIF文の場合と同じです)。したがって、A = BはここではB = Aと同じ意味ではなく、13行目はフレームを再割り当てする前に内部値を調整します。 –

答えて

3

Objective-CはObjective-Cオブジェクトのプロパティにアクセスするために、Cの構造体メンバアクセス演算子(。)をオーバーロードします。問題は、コンパイラのパーサーが混乱するため、1つの代入文で2つを混在させることができないことです。

messageLabelは、frameというプロパティを持つオブジェクトです。 frameは、2つのメンバー:originsizeを持つ構造体です。

は、この制限を回避するために、あなたが(例えばframe)、プロパティに新しい構造体(frame)を割り当て、その後(構造体を割り当てにコピーされている)、このコピーを操作して、構造体を保持するために一時変数を使用する必要があり、プロパティの値が更新されます。

2

13行目のフレームを修正しています。つまり、原点値を変更しています。この本は、ポイントやサイズの値を変更することはできないため、フレームを変更する一般的なテクニックを示しています。

+0

申し訳ありませんが、これはわかりません。あなたは、フレームの原点を(13行目で)何とか変更することによって、frameLabel.frameにフレームが停止することを言っていますか? – Paul

+1

はい、messageLabelのフレームの値を持つ新しい 'frame'を作成し、この新しい 'frame'を変更してmessageLabelにこの変更を表示させ、messageLabelフレームをこの新しいフレームに割り当てます。このコード行でも同じことができます。 "messageLabel.frame = CGRectMake(randomX、randomY、messageLabel.frame.size.width、messageLabel.frame.size.height);" – JingJingTao

関連する問題