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は常に一致すると思ってた。。