无法在 y 轴上或缩放时将 UIScrollView 围绕 CGPoint 居中

Can't center UIScrollView around CGPoint on y axis, or when zoomed

我正在尝试将 CGPoint 置于我的 UIScrollView 可见矩形内的中心。

设置如下:

我有一个 SpriteKit 场景,上面有一些物体。这个场景基本上就是我的 UIScrollView 的视图。场景比设备上的可见场景大得多,如可见矩形所示。

我想设置 UIScrollView 的 contentOffset,使一个点位于可见矩形的中心。

以下是我尝试过的方法,但无济于事:

    CGPoint adjustment = CGPointMake(visibleRect.size.width/2, visibleRect.size.height/2);
    CGPoint wantedMidPoint = node.position;

    CGPoint newOffset = CGPointMake(wantedMidPoint.x - adjustment.x, wantedMidPoint.y + adjustment.y);

然后设置Offset如下:

[self.scrollView setContentOffset:newOffset animated:YES];

问题是这不起作用。具体是什么? Y 位置。

在每种情况下,所选节点确实居中。然而,Y 坐标完全是扭曲的。如果我添加调整,它会按照我想要的方向 反向 上升或下降。如果我减去它,它就会完全飞出屏幕。我不知道如何解决这个问题。

还有,如果我放大一点,X 位置也会偏离轨道。我不明白为什么。我已经尝试根据缩放比例向上或向下缩放偏移调整,但它没有帮助。

这不是我唯一的尝试。我也尝试过以这种方式使用 UIScrollView 的可见矩形:

[scrollView convertRect:scrollView.bounds
                             toView:[scrollView.delegate viewForZoomingInScrollView:scrollView]];

如果有人能解释如何做到这一点,将不胜感激。

我终于解决了。这是坐标系工作方式的一些非常古怪的行为。

我最终的解决方案如下:

CGPoint midPoint = [self convertPoint:(CGPoint){self.visibleRect.size.width/2,-self.visibleRect.size.height/2} toNode:self.sceneNode];

CGVector adjustment = (CGVector){node.position.x - midPoint.x, node.position.y - midPoint.y};

基本上,我不得不使用negative高度来获取背景中可见场景的中间Y坐标。就是这样。这也解决了缩放问题。

如果您遇到类似的问题。我建议通过在您认为中点应该位于的位置添加 Sprite 或某种可见指示器来使用试错法。不断调整直到你得到它,并确保它总是在你滚动的任何地方显示这个中点。然后你可以使用你的节点和中点的差异来计算你需要居中的偏移量。

希望这对某人有所帮助。