6

注:水平スクローラーと垂直スクローラーの両方が画面に表示され、正常に動作しますが、プログラムで動かすことはできません。

私はココア デスクトップ アプリケーションに取り組んでいます。私は Mainmenu.xib ファイルで NSScrollview を使用しており、その所有者に Appdelegate.h であるアウトレットを作成しています。アウトレットはこちら

@property(nonatomic,retain) IBOutlet NSScrollView* scrollview;

インターフェイスビルダーから NSScrollview の新しい参照アウトレットを設定しようとして、ファイルの所有者に行を渡すと、オプション「デリゲート」が 1 つしか表示されません。アウトレットのスクロールビューが表示されません。そのため、スクロールビューをファイルの所有者のデリゲートに接続します(スクロールビューのアウトレットが見えないため)。

今、コードで自動スクロールを実行しようとしています.コードは次のとおりです

for(int a=0;a<10000;a++)
{
    NSPoint pointToScrollTo = NSMakePoint ( 100+a,100+a );  // Any point you like.
    [[self.scrollview contentView] scrollToPoint: pointToScrollTo];
    [self.scrollview reflectScrolledClipView: [self.scrollview contentView]];
}

このコードは機能せず、スクローラーは自動的にスクロールしません。

このコードでスロー スクロール アニメーションを作成しようとしています。

4

4 に答える 4

4

これを取得するより良い方法は、ビューを反転することです。スクロールビューを一番上に表示するためにこれに取り組みました。

-(void)scrollToTop:(NSScrollView *)scrollView
{
    NSPoint newScrollOrigin;
    if ([[scrollView documentView] isFlipped]) {
        newScrollOrigin=NSMakePoint(0.0,0.0);
    } else {
        newScrollOrigin=NSMakePoint(0.0,NSMaxY([[scrollView documentView] frame]) -NSHeight([[scrollView contentView] bounds]));
    }

    [[scrollView documentView] scrollPoint:newScrollOrigin];
}

これはwindowDidLoad、位置を取得するために呼び出す必要があります。

-(void)windowDidLoad
{
    [super windowDidLoad];
    [self scrollToTop:_myScroll];
}
于 2014-04-17T07:14:21.743 に答える
1

ファイルの所有者の ID インスペクターで、そのクラスを確認します。に設定する必要があります。スクロールビューを接続できるアウトレットを取得するには、NSApplication.に変更する必要があります。AppDelegatescrollview

しかし、より良いオプションはNSObject、 xib に a を持ち、そのクラスを に設定することAppDelegateです。(ただし、xcode はデフォルトでそれを作成します。アイテム「AppDelegate」が存在する「プレースホルダー」の下のボックス「オブジェクト」に存在するかどうかを確認しますFileOwner)。次に、参照アウトレット ラインをあなたscrollviewからそのオブジェクトにドラッグします。IBOutletクラスのオブジェクト名が表示されますAppdelegate

更新: for ループを使用してスロー アニメーションを作成することはできません。for ループは非常に高速であるため、完全なスクロールではなく、最終結果のみが表示されます。遅いアニメーションにはコア アニメーションを使用するか、スクロールを遅らせて遅くするには NSTimer を使用する必要があります。

さらに、 [scrollview contentView] の代わりにどこでも [scrollview documentView] を使用してみてください。私はそれを試していませんが。

OK、私はそれに取り組みました。これが最終結果です。スクロールバーが一番上にある場合、次のようにスクロールバーを最後に移動します。

[scroll.contentView scrollToPoint:NSMakePoint(0, ((NSView*)scroll.contentView).frame.size.height - scroll.contentSize.height)];
[scroll reflectScrolledClipView: [scroll contentView]];

必要に応じて上記を変更できます。

また、コードも機能していますが、ポイントの代わりに相対ポイントを取得する必要があります。

したがって、コードを for ループに配置する代わりに、xib のボタンをドラッグしてテストし、そのボタン アクションに次のように記述します。

NSPoint pointToScrollTo = NSMakePoint ( 100,100 );  // Any point you like.
[[scrollview contentView] scrollToPoint: pointToScrollTo];
[scrollview reflectScrolledClipView: [scrollview contentView]];

アプリケーションを実行し、スクロールビューのスクロールをランダムな位置に設定します。次に、ボタンをクリックして、スクロールがどこかに移動したかどうかを確認します。

それが機能する場合、コードは問題ありません。それに応じてポイントを設定するだけで済みます。それは私のために働いた。

于 2013-10-30T06:13:25.740 に答える