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 回答
0

这是一个正确的方法:

迅速:

extension UIView {

    func convertRectCorrectly(rect: CGRect, toView view: UIView) -> CGRect {
        if UIScreen.mainScreen().scale == 1 {
            return self.convertRect(rect, toView: view)
        }
        else if self == view {
            return rect
        }
        else {
            var rectInParent = self.convertRect(rect, toView: self.superview)
            rectInParent.origin.x /= UIScreen.mainScreen().scale
            rectInParent.origin.y /= UIScreen.mainScreen().scale
            let superViewRect = self.superview!.convertRectCorrectly(self.superview!.frame, toView: view)
            rectInParent.origin.x += superViewRect.origin.x
            rectInParent.origin.y += superViewRect.origin.y
            return rectInParent
        }
    }
}
于 2015-05-21T12:36:56.097 回答