11

今日、私の同僚の 1 人が、 の をロードまたはビュー スワップして、ロードされたビューが左下隅ではなく左上隅に固定されているように見えるようにするにはどうすればよいかという問題を抱えて私のところに来ましdocumentViewNSScrollView

彼はしばらく Web を検索し、もがき苦しんでいましたが、Apple、StackOverflow、およびその他のさまざまな場所でドキュメントを読んだにもかかわらず、解決策がありませんでした。

問題は次のとおりです。

Interface Builder でNSScrollView、 をプロジェクトにドラッグします。また、Interface Builder で 2 つのカスタム ビューをプロジェクトにドラッグし、いくつかのテキスト フィールド、ボタンなどを追加します。

IBOutlet次の sを使用してコントローラー クラス (myController など) を作成します。

  • IBOutlet NSScrollView * myScrollView
  • IBOutlet NSView * myCustomView1
  • IBOutlet NSView * myCustomView2

アウトレットを Interface Builder のコントロールに接続します。

NSViewを反転するサブクラスを作成しますdocumentView

@implementation myFlippedView

-(id)initWithFrame:(NSRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code here.
    }
    return self;
}

-(void)drawRect:(NSRect)dirtyRect {
    // Drawing code here.
}

-(BOOL)isFlipped {
    return YES;
}

Interface Builder でdocumentViewの を選択し、のサブクラスにします。Interface Builder で NSScrollView を選択し、もう一度クリックして にアクセスするか、IB ライブラリを変更してツリー ビューを表示し、 の子カスタム ビューを選択します。NSScrollViewmyFlippedViewdocumentViewNSScrollView

クラスではmyController、次のメソッドを使用してビューを交換します。

-(void)awakeFromNib {

    [myScrollView setDocumentView:myCustomView1];
}

-(IBAction)swapViews:(id)sender {

    if ([myScrollView documentView] == myCustomView1) {

        [myScrollView setDocumentView:myCustomView2];

    } else {

        [myScrollView setDocumentView:myCustomView1];

    }
}

最後に、プロジェクトのボタンを action に接続しswapViews、ビルドして実行します。

問題は、isFlipped で期待されていたように座標が解決されていないことです。

4

2 に答える 2

10

これには単純ですが、明らかに見過ごされがちな理由があります。

は Interface Builder でカスタム ビューをサブクラス化していisFlippedますが、documentView はビュー スワップで置き換えられており、その最初のものは で使用されawakeFromNibます。

解決策は、myCustomClass1 と myCustomClass2 を myFlippedView クラスにサブクラス化することです。

これを実行してテストすると、スクロール ビューの左上にビューが表示されることがわかります。しかし、それは新たな問題を引き起こしました。カスタム ビューのすべてのコンテンツが下から上に配置されます (デフォルトではすべてのNSViewレイアウトが左下から配置されるため、反転すると座標も反転します)。

幸いなことに、この問題には別の簡単な修正方法があります。読む :-)

Interface Builder で、メニュー内myCustomView1およびメニューからすべてのコントロールを強調表示し、[オブジェクトを埋め込む] --> [カスタム ビュー] を選択します。Layout必要に応じてサイズを変更し、myCustomView2 についても同じことを行い、再構築します。

出来上がり。コンテンツ ビューがスワップされNSScrollView、スクロール ビューの左下ではなく左上に表示されます。

于 2011-01-15T01:39:22.760 に答える