6

我有一个带有自定义 NSImageView 的 NSScrollView 作为在 xib 文件中设置的文档视图。当我想放大 NSScrollView 时,我的问题就来了。我希望它表现得像 Mac 上的 Preview 应用程序,我可以让它放大得很好,但我希望它以光标为中心进行放大。

我的自定义 NSScrollView 类中有这段代码:

//Informs the receiver that the user has begun a pinch gesture.
- (void)magnifyWithEvent:(NSEvent *)event {
NSPoint conViewPoint =[[self contentView] convertPoint:[event locationInWindow] fromView:nil];
[self setMagnification:[event magnification]+[self magnification] centeredAtPoint:conViewPoint];
}

这可行,但是它也会导致滚动视图在放大时向下滚动(尽管它根本不会横向移动)。在不从触控板上抬起的情况下多次放大和缩小时会更加明显。

这个问题似乎也有类似的问题,但是我使用的是捏合手势而不是按钮。我一直在尝试按照该问题的建议偏移 y 轴滚动

[[self documentView] scrollPoint:scrollPoint]

但我无法找出一个有效的公式来scrollPoint解释不断变化的内容视图边界,以将光标下的点保持在同一个位置。所以,我想知道是否有更合适的方法,或者是否真的需要滚动,我只需要弄清楚数学。

感谢您对此的任何帮助

编辑:

所以我终于弄清楚了滚动数学。它花了一段时间和更复杂的尝试,但最终非常简单:

- (void)magnifyWithEvent:(NSEvent *)event {

    NSPoint docViewPoint =[[self documentView] convertPoint:[event locationInWindow] fromView:nil];
    NSPoint docRectOri=[self documentVisibleRect].origin;

    float widthGapSize=-docRectOri.x;
    float heightGapSize=-docRectOri.y;

    if([event phase]==NSEventPhaseBegan){
        startDocPoint=docViewPoint;
        startPoint.x=(docViewPoint.x+widthGapSize)*[self magnification];
        startPoint.y=(docViewPoint.y+heightGapSize)*[self magnification];
    }
    scrollPoint.x=startDocPoint.x-(startPoint.x/[self magnification]);
    scrollPoint.y=startDocPoint.y-(startPoint.y/[self magnification]);

    [self setMagnification:[event magnification]+[self magnification] centeredAtPoint:docViewPoint];
    [[self documentView] scrollPoint:scrollPoint];  
    }

我仍然不明白为什么setMagnification:centeredAtPoint:不能正常工作,并且仍然想知道是否有人对此有一些意见,因为由于滚动,我的解决方法在放大倍率上非常紧张。

4

0 回答 0