convertRect:toView: 在iPad Retina和iPad 2上的表现不同。

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;
}
}
2个回答

0

这里是一个正确的方法:

SWIFT:

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
        }
    }
}

0
也许你需要检测应用程序正在使用哪种屏幕类型(iPad的比例为1,iPadRetina的比例为2)。
CGFloat scale = [[UIScreen mainScreen] scale];

之后...

 if (scale==1) {
        //code from above
    } else {
        //code from above with small modification
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接