6

Cocoa のNSScrollViewはひどく説明不足です。ここにいる誰かがそれが何であるかを知っていて、数秒時間を割いてくれることを願っています.

だから私はカスタムNSViewを持っています。私は -drawRect を実装しています: 何かを描画したり、色で塗りつぶしたりします。次に、それをラップする NSScrollView を用意します (インターフェイス Builder を使用して設定します)。

ここで、内側のカスタム ビューは、スクロールするために、外側のスクロール ビューに収まるサイズよりも大きいサイズにする必要があります。それくらい私は気づきます。ちなみに、スクロール ビューが周囲のウィンドウのサイズに合わせて調整されるように構成しましたが、それは問題ではありません。

内部ビューの -frame メソッドをオーバーライドして、少なくとも 1000x1000 のサイズのフレームを返します。

- (NSRect)frame {
    CGFloat w = 1000;
    CGFloat h = 1000;
    if (self.superview.bounds.size.width > w)
        w = self.superview.bounds.size.width;
    if (self.superview.bounds.size.height > h)
        h = self.superview.bounds.size.height;
    return NSMakeRect(0, 0, w, h);
}

解釈に問題がある結果は次のとおりです。

  • スクロール ビューが 1000x1000 より小さい領域を囲む場合にスクロールできます

しかし

  • 色で塗りつぶされた唯一の領域 (つまり、私の -drawRect: メソッドが影響する領域) は

    • スクロール ビューの境界と同じ大きさ
    • (0,0 にあります。私は反転を使用しているので、それが左上であり、スクロール後に可視領域の外に出てしまいます。
  • この無関係な長方形の外側にある可視領域はまったく描画されません。

私はこの点を超えて何も知りません。描画用の四角形は、ウィンドウ内のスクロール ビューの位置やサイズなどにクリップされているようですが、スクロールされた「場所」は考慮されていません。

他に何かが起こるとは本当に期待していないことに注意してください。ピースが欠けているように感じますが、どれが見つかりません。テキストの壁で申し訳ありませんが、今はうまく説明できません。質問するより答えやすいと思います。

よろしくお願いします。

リック・アストリーではない

4

3 に答える 3

3

上書きするのは非常に悪い考え-frameです。正しい値を持つ実際のインスタンス変数に依存するものが非常に多くあります。代わりに、使用したいフレームにフレームを設定してみてsetFrame:ください。運が良ければ、すべての問題が解決する可能性があります...

于 2010-08-26T17:53:04.077 に答える
2

-frameをオーバーライドしてはならないというMaxの警告に同意します。セットフレームを制約する場合は、そのセッター(-setFrame:)と指定されたイニシャライザー(-initWithFrame:)をオーバーライドし、必要に応じて提案されたフレームを調整します。

あなたの全体的な問題に関して、あなたの問題は概念的なものなのだろうか。-drawRect :(再描画を求められるダーティ長方形)の引数は、部分的に段階的に再描画できるものを描画する場合に役立ちます(グリッドなど-dirtyRectと交差するグリッドブロックは再描画でき、残りは再描画できます)。無視されます)。完全に再描画する必要があることを行う場合は、drawRectで渡されるダーティなrectではなく、[selfbounds]を使用する必要があります。

たとえば、標準のグラデーションの背景しかない場合、dirtyRectからグラデーションのどの部分を再描画するかを判断するのは難しく、dirtyRectを完全に無視して、グラデーションを使用してビュー全体を再描画するだけで非常に簡単になります。

通常、スクロール時にスクロールビューのクリップ長方形によって露出されたビューの領域のみが再描画を求められると想定するのは正しいことです。考慮すべきスクロールビューの-copiesOnScrollとの相互作用もあります。

これがお役に立てば幸いです。

于 2010-08-26T18:13:52.130 に答える
2

を使用するにNSScrollerは、MVC パラダイムをしっかりと理解している必要があります。Apple のドキュメントは、写真と一連のテキストを表示することに重点を置いていますが、それ以外にはあまり重点を置いていません。の使用はNSScrollView、私が過去に苦労したものです。

まず、オーバーライドしないframeでください。作業領域の大きさを示すために使用setFramescrollView、フレームが取り囲む領域を単純に描画します。私が理解しているように、いつどこに何を描くかなど、後は習慣NSViewと包括性が処理します。NSScrollViewつまり、rect渡された の境界を無視しdrawRect、代わりに に送信したフレームの境界内に描画しますscrollView。フレームワークの仕事であるため、何が表示され、何が表示されないかを気にする必要はありません。

ここで MVC パラダイムの出番setFrameです。モデルが更新されたときに使用する必要があります。そのため、オブジェクトがフレームの現在の境界の外にある場合は、 を使用setFrameして新しく拡張された境界を設定し、その領域内に描画します。

于 2010-08-26T19:34:19.047 に答える