在光标位置

时间:2015-12-07 00:32:18

标签: macos cocoa nsscrollview magnification

我有一个带有自定义NSImageView的NSScrollView作为其在xib文件中设置的文档视图。当我想放大NSScrollView时,我的问题出现了。我希望它的行为类似于Mac上的预览应用程序,我可以让它放大得很好,但我希望它以光标为中心点放大。

我的自定义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];
}

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

类似的问题似乎出现在this问题中,但是我使用的是捏合手势,而不是按钮。我一直在尝试使用

按照该问题的建议来偏移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:不能正常工作,我仍然想知道是否有人对此有任何意见,因为滚动时我的解决方法非常紧张。

0 个答案:

没有答案