2012-08-31 9 views
10

UILabelという2つのインスタンスを作成し、ViewControllerのビューに追加しました。 そして、それぞれのanchorPointを0.5から1.0(xとy)に変更しました。anchorPointを変更してフレームを設定すると、ビューが移動するのはなぜですか?

次に、uiLabel2のフレームをそのフレームにリセットしました。作成したフレームは、(100,100,100,20)です。

私がアプリを実行すると、uiLabel1uiLabel2が別の位置に表示されます。どうして?正確にアンカーポイントが何をするかである

UILabel *uiLabel1 = [[[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 20)] autorelease]; 
uiLabel1.text = @"UILabel1"; 
uiLabel1.layer.anchorPoint = CGPointMake(1, 1); 

UILabel *uiLabel2 = [[[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 20)] autorelease]; 
uiLabel2.text = @"UILabel2"; 
uiLabel2.layer.anchorPoint = CGPointMake(1, 1); 
uiLabel2.frame = CGRectMake(100, 100, 100, 20); 

[self.view addSubview:uiLabel1]; 
[self.view addSubview:uiLabel2]; 

enter image description here

答えて

37

CALayerは、そのスーパーレイヤに表示される場所を決定する4つのプロパティを持つ:

  • position(図のcenterプロパティと同じである)
  • boundsを(boundsの実際のみsize部分)
  • anchorPoint
  • transform

frameは、ではなく、であることがわかります。 frameプロパティは実際にこれらのプロパティから派生しています。 frameプロパティを設定すると、指定したフレームとレイヤーの既存のanchorPointに基づいてレイヤーが実際にcenterbounds.sizeに変更されます。

あなたがそれを100,100,100,20のフレームを与え、(UIViewのサブクラスであり、そしてすべてのUIView層を有する第一UILabelを作成することにより、)第一の層を作成します。レイヤーのデフォルトアンカーポイントは0.5,0.5です。したがって、その境界は0,0,100,20として、その位置は150,110として計算されます。それは次のようになります。

anchor at center

その後、あなたはそのアンカーポイントを1,1に変更します。レイヤーの位置や境界を直接変更せず、フレームを設定して間接的にレイヤーを変更しないので、新しいアンカーポイントがスーパーレイヤーの(変更されていない)位置になるようにレイヤーが移動します。

anchor at corner

レイヤー(またはビュー)のフレームを今質問すると、50,90,100,20が得られます。

2番目のレイヤー(2番目のUILabel)を作成するときに、そのアンカーポイントを変更した後、そのフレームを設定します。だから、層は、あなたが提供するフレームに基づいて新しい位置と境界を計算し、その既存のアンカーポイント:あなたは今、そのフレームの層(またはビュー)を頼む場合

anchor at corner with reset frame

、あなたはフレームを取得しますセット、100,100,100,20。しかし、そのポジション(またはビューの中心)を求めるなら、あなたは200,120を得るでしょう。

+0

Oh!rob !.あなたの偉大で詳細な答えをありがとう。 –

4

まあ。アンカーポイントを変更する前に、ラベルの中心に基づいてフレームを設定していました。その後、右下隅に基づいてフレームを設定します。

1つのラベルだけのフレームをリセットしていたため、新しいアンカーポイントに基づいてフレームを調整し、もう1つは古い位置にとどまりました。

同じポイントにしたい場合は、アンカーポイントを編集した後で両方のフレームをリセットするか、アンカーポイントをまったく使わないでください。

This guideは、アンカーポイントの詳細を説明しています。

+0

あなたの説明と与えられたリンクが私にとって良い助けになっています。 –

+0

ありがとうKDarker。 –

+0

リンクが壊れています:( – Nathaniel

関連する問題