残念ながら、自分自身の Magic Mouse をまだ入手していないため、これを自分でテストするのは困難ですが、Magic Mouse を持っているテスターから、私のアプリではモーメンタム スクロールが機能しないと言われました。NSScrollView をサブクラス化していませんが、scrollview のドキュメント ビューはすべてカスタムです。私は scrollWheel: どこでもオーバーライドしていませんが、それでも勢いは明らかに機能していません。どこから始めればよいかさえわかりません。scrollWheel イベントを送信するだけで、物事は自然に処理されると思いました。(ホイールまたは MBP トラックパッドでのスクロールは期待どおりに機能します。) 明らかに、それを止める何かをしているに違いありませんが、どこから始めればよいかさえわかりません。考え?
2 に答える
少し前にこれを理解しましたが、問題は、スクロール時に、iPhone で UITableView が画面をオンまたはオフにスクロールするときにビューを追加および削除する方法のように、多くの派手なビュー操作を行っていたことです。これはパフォーマンスの面ではうまく機能しましたが、OSX プログラミングに取り掛かるほど、これが OSX にとって間違っていることに気付きました (ただし、iPhone の正しい考えです)。
とにかく、実際に起こっていることは、ホイールスクロールのようなことをすると、スクロールイベントがマウスカーソルの下にあるビューに送信され、それを処理する場所に到達するまでレスポンダー/ビューに波及するということです. 通常、これは問題ではありませんが、OS はモーメンタム スクロールを使用すると、モーメンタムが開始されたときにカーソルの下にあったビューに、より小さな scrollWheel イベントを送信するだけです。つまり、スクロール中にビューが削除された場合 (画面外にスクロールするなどの理由で)、スクロールホイール メッセージをまだ取得しているビューがビュー階層に存在しなくなるため、チェーンが壊れて勢いが止まります。
「簡単な」修正は、最後の scrollWheel イベントを取得したビューを削除しないことです-画面外であっても。より良い修正 (および私が行った修正) は、UIView のように NSView を使用しようとせず、代わりに drawRect を使用してコンテンツを描画することです。:) それは約 10 億倍高速であるだけでなく、OSX が期待する動作であるため、モーメンタム スクロールで Just Works(tm) です。
私の後に繰り返してください: OSX は iPhoneOS ではありません.. :P
NSScrollView自体のLineScrollプロパティとPageScrollプロパティを設定しないと、奇妙なスクロール動作が発生する可能性があります。
それを超えると、これを自分でテストするか、カスタムビューのコード全体とそれを含むxibを投稿するために、MagicMouseを入手する必要があります。それなしで他の人が(上記のように)推測以上のものをあなたに提供できる方法はありません。