3

iPad2 では完全に動作するこのコードがありますが、Retina iPad ではスケールが正しくありません。

両方の iPad で変更せずにアプリを実行しましたが、動作はまったく異なります。Retina iPad では、画像は元の位置に戻り、変換は行われません。

コードはビューのグループを取得し、それらを一時的なビューに追加し、一時的なビューのサイズを変更してそれらのビューを元に戻すので、すべてのビューを同時にサイズ変更できます。

- (IBAction)scaleParts:(UIPinchGestureRecognizer *)sender {
if (sender.state == UIGestureRecognizerStateBegan) {
    self.tempCanvasView = [[UIView alloc] initWithFrame:self.canvas.bounds];
    self.tempCanvasView.backgroundColor = [UIColor redColor];
    for (UIView *view in [self.canvas subviews]) {
        CGRect currentFrame = view.bounds;
        CGRect newFrame = [view convertRect:currentFrame toView:self.tempCanvasView];
        view.bounds = newFrame;
        [self.tempCanvasView addSubview:view];
    }
    [self.canvas addSubview:self.tempCanvasView];
} else if (sender.state == UIGestureRecognizerStateChanged) {
    self.tempCanvasView.transform = CGAffineTransformScale(self.tempCanvasView.transform, sender.scale, sender.scale);
    sender.scale = 1.0;
} else if (sender.state == UIGestureRecognizerStateEnded) {
    for (UIView *view in [self.tempCanvasView subviews]) {
        CGRect currentFrame = view.bounds;
        CGRect newFrame = [view convertRect:currentFrame toView:self.canvas];
        view.frame = newFrame;
        [self.canvas addSubview:view];
    }
    [self.tempCanvasView removeFromSuperview];
    self.tempCanvasView = nil;
}
}
4

2 に答える 2

0

たぶん、アプリが使用している画面タイプを検出する必要があります(iPadの場合はscale = 1、iPadRetinaの場合は2)。

CGFloat scale = [[UIScreen mainScreen] scale];

その後..

 if (scale==1) {
        //code from above
    } else {
        //code from above with small modification
    }
于 2012-11-16T13:03:44.160 に答える