1

このチュートリアルを使用する iPhone アプリをMac アプリに移植しています。NSScrollView に表示するテキストを取得できましたが、スクロールするテキストを取得できません。何が欠けているかを誰かが知っていることを願っています。

iPhone アプリでは、CTView は UIScrollView からサブクラス化されています。

CTView.h:

@interface CTView : UIScrollView <UIScrollViewDelegate> {

1) しかし、AppKit には NSScrollViewDelegate がありません。NSScrollView へのデリゲート インターフェイスがないことが問題ですか?

したがって、Mac アプリの場合、CTView.h は次のようになります。

@interface CTView : NSScrollView 

CTView.m には

[self setHasHorizontalScroller:YES];
[self setAcceptsTouchEvents:YES];

また、CTView.m 内で、フレームの NSMutableArray を次のように作成します。

self.frames = [NSMutableArray array];

配列をフレームで埋めます。また、スクロールできるようにしたい完全に大きな画像のドキュメント ビューのフレームを設定します。

[[self contentView] setFrame:[self bounds]];
[self.documentView setFrame:  NSMakeRect(0, 0, totalPages * self.bounds.size.width, textFrame.size.height)];

最初のフレームは CTView に表示されますが、水平スクロール バーを移動すると、2 番目のフレームが CTView に表示されません。

Xcode 4.3.3 と Mac OS X 10.7.4 を使用しています。

NSScrollView がフレームをスクロールできるようにするために、 UIScrollView とは異なる方法で何をする必要があるか知っている人はいますか?

4

1 に答える 1

1

最後にそれを理解しました。うわー!

1) NSScrollView には、その documentView のビューが必要です。ここで、documentView はスクロールされるものです。したがって、ペン先で、documentView のビューを含む NSScrollView を作成し、CTView.m のコードで示されているように、documentView をそのビューに設定しました。

NSArray *viewArray     = [self subviews];
NSArray *docViewArray  = [[viewArray objectAtIndex:0] subviews]; 
NSView  *docView       = [docViewArray objectAtIndex:0];

[self setDocumentView:docView];

2) 次に、通常は UIScrollView に追加されるフレームの配列を NSScrollView の documentView に追加しました。フレームの配列は、コンテンツの複数の要素で構成されます。

 while (textPos < [attString length]) { 
    CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(textPos, 0), innerPath, NULL);
    CFRange frameRange = CTFrameGetVisibleStringRange(frame); 

   CTColumnView* content = [[[CTColumnView alloc] initWithFrame: NSMakeRect(0, 0, self.contentSize.width, self.contentSize.height)] autorelease];
    [docView addSubview: content];  // <<-- Here is where the frames are added to the documentView
    textPos += frameRange.length;
  }

そして、それはトリックをしました。

于 2012-07-07T00:55:49.363 に答える