我有一个NSScrollView与自定义NSImageView作为其在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]; }
这可行,但它也会导致滚动视图在放大时向下滚动(尽管它根本不会向侧面移动).在没有从触控板抬起的情况下多次放大和缩小时更加明显.
类似的问题似乎是在这个问题,但我使用的是捏手势,而不是按钮.我一直试图偏移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:
不只是工作,我仍然想知道是否有人对此有一些意见,因为我的解决方法是由于滚动非常紧张放大.