10

の 2 つのインスタンスを作成し、それらを自分のビューUILabelに追加しました。ViewControllerそして、anchorPointそれぞれの を 0.5 から 1.0 (x と y) に変更しました。

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

アプリを実行すると、さまざまな位置uiLabel1に表示されます。uiLabel2なんで?

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];

ここに画像の説明を入力

4

2 に答える 2

47

には、そのスーパーレイヤでの表示場所を決定するCALayer4 つのプロパティがあります。

  • positioncenter(これは、ビューのプロパティと同じです)
  • bounds(実際は のsize部分のみbounds)
  • anchorPoint
  • transform

はそれらのプロパティの 1 つでframeないことに気付くでしょう。frameプロパティは、実際にはそれらのプロパティから派生しています。プロパティを設定すると、指定したフレームとレイヤーの既存の に基づいて、レイヤーのとframeが実際に変更されます。centerbounds.sizeanchorPoint

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

中央にアンカー

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

コーナーでアンカー

ここでレイヤー (またはビュー) のフレームを要求すると、50、90、100、20 が返されます。

2 番目のレイヤー (2 番目のUILabel) を作成するときは、アンカー ポイントを変更した後、そのフレームを設定します。したがって、レイヤーは、指定したフレームとその既存のアンカー ポイントに基づいて、新しい位置と境界を計算します。

リセット フレームのコーナーにアンカー

ここでレイヤー (またはビュー) にそのフレームを要求すると、設定したフレーム 100、100、100、20 が得られます。しかし、その位置 (またはビューの中心) を求めると、200,120 が返されます。

于 2012-08-31T03:39:09.377 に答える
4

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

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

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

このガイドでは、アンカー ポイントについて詳しく説明します。

于 2012-08-31T03:25:22.880 に答える