質問: CGRectMake(0, 20, a.frame.size.width, a.frame.size.height); NSLog(@"a Frame : %@", NSStringFromCGRect(a.frame)); NSLog(@"b Frame : %@", NSStringFromCGRect(b.frame)); ```
回答: `CGAffineTransform`のAffine Transformは、訳せば「座標変換」です。つまり、オブジェクトの面積を拡大縮小するのではなくて、座標の目盛りの取り方を、拡大縮小します。ですから、Subviewの座標情報が変化しないのは、むしろ自然な結果です。 座標変換前の座標で、拡大縮小後のSubviewの座標情報(位置と大きさ)を得ようとするなら、プロパティ`transform`を変更していないSuperviewを基準にします。それには、`UIView`のメソッド`- (CGRect)convertRect:(CGRect)rect fromView:(UIView *)view`を使います。 ``` CGFloat raito = CGRectGetWidth(self.view.frame) / CGRectGetWidth(a.frame); a.transform = CGAffineTransformMakeScale(raito, raito); a.frame = CGRectMake(0, 20, a.frame.size.width, a.frame.size.height); // b.frameを、aビュー基準から、self.view基準に変換する。 CGRect newFrame = [self.view convertRect: b.frame fromView: a]; NSLog(@"b Frame : %@", NSStringFromCGRect(newFrame)); ``` ご質問に対してではなく、質問者さんのやりたいことに対して、おまけのアドバイスをしておきます。 `CGAffineTransform`による座標変換では、Viewの`center`(中心点)が基準点(座標の原点)になって、拡大縮小、回転しますが、`CALayer`のプロパティ`anchorPoint`を変更することで、基準点を変えることができます。 ``` a.layer.anchorPoint = CGPointMake(0.0, 0.0); ``` 例えば、これでビュー`a`の左上端を基準にして、拡大縮小します。`CGPointMake(1.0, 1.0)`にすると、右下端が基準点になります。Subview`b`の位置になるように`anchorPoint`を調整すると、シンプルなコードにすることができるでしょう。 このように、**Core Animation**の`CALayer`クラスを一度、かんたんにでも勉強なさることをお勧めします。