我有一个带有自定义 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:
不能正常工作,并且仍然想知道是否有人对此有一些意见,因为由于滚动,我的解决方法在放大倍率上非常紧张。