xibファイルで設定されたドキュメントビューとしてカスタムNSImageViewを持つNSScrollViewがあります。私の問題は、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:
うまくいかないのかまだ理解できず、私の回避策はスクロールのために拡大率が非常に不安定であるため、誰かがこれについて何らかの意見を持っているかどうかまだ疑問に思っています。