2011-01-15 6 views
5

NSScrollViewのをロードまたは表示スワップする方法について、私の同僚が今日私に来てくれました。ボトムアップコーナーの代わりに、左上コーナーに修正してください。文書のスワップ時にNSScrollViewの内容を左下にする代わりに左にする

Appleは、StackOverflowやその他のさまざまな場所でドキュメントを読んでいるにもかかわらず、Webを検索して逃走していましたが、解決策はありませんでした。 Interface Builderで

がプロジェクトにNSScrollViewをドラッグ:

は、ここで問題に部分部分です。 Interface Builderのドラッグでも プロジェクトに2つのカスタムビューと、いくつかのテキストフィールドを追加し、ボタンなど

IBOutlet秒でコントローラクラス(例えばmyController)を作成します。

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

にコンセントを接続Interface Builderのコントロール。

@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でNSScrollViewdocumentViewを選択し、それをmyFlippedViewのサブクラスを作る:

documentViewが反転する NSViewサブクラスを作成します。 Interface BuilderでNSScrollViewを選択し、もう一度クリックして documentViewに移動するか、IBライブラリを変更してツリービューを表示し、 NSScrollViewの子カスタムビューを選択します。 myControllerクラススワップで

次のメソッドを持つビュー:

-(void)awakeFromNib { 

    [myScrollView setDocumentView:myCustomView1]; 
} 

-(IBAction)swapViews:(id)sender { 

    if ([myScrollView documentView] == myCustomView1) { 

     [myScrollView setDocumentView:myCustomView2]; 

    } else { 

     [myScrollView setDocumentView:myCustomView1]; 

    } 
} 

最後にビルドして実行、アクションswapViewsにプロジェクト内のボタンをフックアップ。

isFlippedで期待されていたように座標が解決されていないという問題があります。

答えて

7

シンプルですが、明らかにしばしば見落とされる理由があります。

isFlippedはInterface Builderでカスタムビューをサブクラス化していますが、ドキュメントスクロールはビュースワップ上で置換されています。その最初はawakeFromNibで使用されます。

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

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

幸いにも、この問題の別の簡単な修正があります。 Read on :-)

myCustomView1Layoutメニューのすべてのコントロールを強調表示し、[オブジェクトを埋め込み] - > [カスタム表示]を選択します。必要に応じてサイズを変更し、myCustomView2で同じ操作を行い、再構築します。

Voila。 NSScrollViewコンテンツビューがスワップし、左下ではなくスクロールビューの左上に表示されます。トップにピン正しくdocumentViewが最初にscrollviewのトップに並ぶようにするにANDにも

+1

または、単純なルートにして、スワップされたビューをドキュメントビューにするのではなく、myFlippedViewのサブビューにすることができます。 – ughoavgfhw

+0

できます。いい視点ね。 – Hooligancat

+0

しかし、これは新しい問題を導入します。ウィンドウのサイズを変更してスクロールビューをドキュメントビューよりも小さくすると、スクロールビューはウィンドウの上端ではなく下端に固定されます。ユーザーとして、あなたはむしろ後者を期待しています。 –

0

それはdocumentViewがそれのclipviewよりも小さい場合、これは私のためにどのような作品です:

1 - でInterface Builderは、ドキュメントビューのすべてのコントロールをカスタムNSViewインスタンスに囲みます。 (NOT反転ビュー)

2からdocumentViewに使用するNSViewサブクラスを作成し、これらのメソッドオーバーライド:サブクラス化されたビューは、第二(正常)を含むscrollViews' documentViewなければならない

- (BOOL)isFlipped { 
    return YES; 
} 
- (void)resizeWithOldSuperviewSize:(NSSize)oldSize { 
CGFloat superViewHeight = self.superview.frame.size.height, height = self.frame.size.height; 
    if(superViewHeight>height) { 
     [self setFrameOrigin:NSMakePoint(self.frame.origin.x, superViewHeight-height)]; 
    } 
} 

をすべてのコントロールを含むNSView。

関連する問題