1. ホーム
  2. iphone

[解決済み] CALayerのanchorPointを変更すると、ビューが移動します。

2022-06-17 18:56:18

質問

を変更したいのですが anchorPoint を変更したいのですが、ビューは同じ場所に置いたままです。 試しに NSLog -とする self.layer.position そして self.center で、これらは両方ともアンカーポイントの変更に関係なく同じままです。しかし、私のビューは動きます!

これを行う方法についての任意のヒント?

self.layer.anchorPoint = CGPointMake(0.5, 0.5);
NSLog(@"center point: %f %f", self.layer.position.x, self.layer.position.y);
self.layer.anchorPoint = CGPointMake(1, 1);
NSLog(@"center point: %f %f", self.layer.position.x, self.layer.position.y);

と出力されます。

2009-12-27 20:43:24.161 Type[11289:207] center point: 272.500000 242.500000
2009-12-27 20:43:24.162 Type[11289:207] center point: 272.500000 242.500000

どのように解決するのですか?

この レイヤーのジオメトリとトランスフォーム のセクションでは、CALayerの位置とanchorPointプロパティの関係について説明しています。 基本的に、レイヤーの位置はレイヤーのanchorPointの位置で指定されます。 デフォルトでは、レイヤーのアンカーポイントは (0.5, 0.5) で、これはレイヤーの中心に位置しています。 レイヤーの位置を設定すると、スーパーレイヤーの座標系でレイヤーの中心の位置を設定することになります。

位置はレイヤーのアンカーポイントからの相対的なものなので、同じ位置を維持したままアンカーポイントを変更すると、レイヤーが移動します。 この移動を防ぐには、新しいアンカー ポイントを考慮してレイヤーの位置を調整する必要があります。 私が行った 1 つの方法は、レイヤーの境界を取得し、境界の幅と高さに新旧のアンカー ポイントの正規化された値を掛け、2 つのアンカー ポイントの差を取り、その差をレイヤーの位置に適用する方法です。

この方法で、回転を考慮することもできるかもしれません。 CGPointApplyAffineTransform() をUIViewのCGAffineTransformと一緒に使うことで、この方法で回転を考慮することもできるかもしれません。