日々精進

新しく学んだことを書き留めていきます

UIViewのtransformとframeとbounds

UIViewのtransformプロパティにCGAffineTransformを渡すとViewの変形ができる。
ピンチインやピンチアウトすると拡大・縮小し、指を離すと元の大きさに戻るViewのコードは以下のようになる。

- (void)viewDidLoad{
    [super viewDidLoad];
    UIPinchGestureRecognizer *recognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(zoomOutGestureUpdated:)];
    [self.view addGestureRecognizer:recognizer];
}

- (void)zoomOutGestureUpdated:(UIPinchGestureRecognizer *)recognizer{
    if (recognizer.state == UIGestureRecognizerStateBegan){
    } else if (recognizer.state == UIGestureRecognizerStateChanged){
        self.view.transform = CGAffineTransformMakeScale(recognizer.scale, recognizer.scale);
    } else if (recognizer.state == UIGestureRecognizerStateEnded){
        self.view.transform = CGAffineTransformIdentity;
    }
}

注意点は元の大きさに戻すときに
self.view.transform = CGAffineTransformIdentity;
とすること。


self.view.frame = 【変形前のFrame】;
上記のように変形前のFrameをインスタンス変数などにとっておいてtransformに渡すと一見元の大きさに戻ったように見えるが、もう一度ピンチインすると大きさがおかしくなる。
これはViewの変形をする時に以下の式のようにframeでなくboundsのsizeを元に変形後のsizeを計算するため。
変形後のsize=変形前のboundsのsize×scale


ちなみに
self.view.frame = 【変形前のFrame】;
を実行するとframeのsizeは変形前の値になるが、boundsのsizeは変わらない。frameとboundsのsizeは常に一致すると思ってた。。