29334


部品A上の決まった位置に部品Bを乗せて、部品Aを拡縮すれば部品Bも合わせて拡縮されるようにしたく、さらに拡縮された後の部品BのFrameも知りたいです。  
（例えば、「ビルが並んでいる画像」の「一番左のビルの右端」に「看板の画像」を乗せて、「ビルが並んでいる画像」の拡縮率で「一番左のビルの右端」の位置は変わらず「看板の画像」も大きくしたい）

部品AをCGAffineTransformMakeScaleで部品Bごと拡縮し、拡縮後のFrameを確認したところ、部品Aのframe.sizeは変更されてましたが、部品Bに変化はありませんでした。  
実行後の見た目はちゃんと拡縮されて、位置もサイズも変わっているように見えるのですが、NSLogでframeを出力してみると変化がありません。

拡縮後の部品Bのframeを確認できる方法はありますか？

以下サンプルコード

[code]

    // ビルが並んでいる画像ビュー
    UIImageView *a = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"xxxxx"]];
    
    [self.view addSubview:a];
    
    // 看板の画像ビュー
    UIImageView *b = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"xxxxx"]];
    // 一番左のビルの右端に来るように部品Aの画像サイズから座標を指定
    b.frame = CGRectMake(363, 420, 100, 600);
    
    [a addSubview:b];
    
    
    // 部品Bごと大きさを変える
    // 画面幅を画像と同じ大きさのビューの幅で割って、どのくらい縮小すれば良いか調べる
    double raito = CGRectGetWidth(self.view.frame) / CGRectGetWidth(a.frame);
    // 縮小する
    a.transform = CGAffineTransformMakeScale(raito, raito);
    // transformしたことにより位置が変化するので左上に戻す
    a.frame = CGRectMake(0, 20, a.frame.size.width, a.frame.size.height);
    
    NSLog(@"a Frame : %@", NSStringFromCGRect(a.frame));
    NSLog(@"b Frame : %@", NSStringFromCGRect(b.frame));
    
[/code]


CC BY-SA 3.0
2016-10-04T01:44:39.990
29333
2016-10-04T03:45:50.123
17254
question
objective-c
CGAffineTransformMakeScaleで拡縮したViewにaddSubviewしている部品のFrameが知りたい


`CGAffineTransform`のAffine
Transformは、訳せば「座標変換」です。つまり、オブジェクトの面積を拡大縮小するのではなくて、座標の目盛りの取り方を、拡大縮小します。ですから、Subviewの座標情報が変化しないのは、むしろ自然な結果です。  
座標変換前の座標で、拡大縮小後のSubviewの座標情報（位置と大きさ）を得ようとするなら、プロパティ`transform`を変更していないSuperviewを基準にします。それには、`UIView`のメソッド`-
(CGRect)convertRect:(CGRect)rect fromView:(UIView *)view`を使います。

[code]

    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));
    
[/code]

* * *

ご質問に対してではなく、質問者さんのやりたいことに対して、おまけのアドバイスをしておきます。  
`CGAffineTransform`による座標変換では、Viewの`center`（中心点）が基準点（座標の原点）になって、拡大縮小、回転しますが、`CALayer`のプロパティ`anchorPoint`を変更することで、基準点を変えることができます。

[code]

    a.layer.anchorPoint = CGPointMake(0.0, 0.0);
    
[/code]

例えば、これでビュー`a`の左上端を基準にして、拡大縮小します。`CGPointMake(1.0,
1.0)`にすると、右下端が基準点になります。Subview`b`の位置になるように`anchorPoint`を調整すると、シンプルなコードにすることができるでしょう。  
このように、 **Core Animation** の`CALayer`クラスを一度、かんたんにでも勉強なさることをお勧めします。


CC BY-SA 3.0
2016-10-04T03:45:50.123
29334
2016-10-04T03:45:50.123
18540
29333
answer