NSScrollView不会滚动

时间:2012-07-03 20:19:35

标签: objective-c cocoa osx-lion appkit nsscrollview

我正在将使用此tutorial的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中可见,但是当我移动水平滚动条时,第二帧不会显示在CTView中。

我正在使用Xcode 4.3.3和Mac OS X 10.7.4。

有没有人知道我需要做什么不同于UIScrollView for NSScrollView能够滚动框架?

1 个答案:

答案 0 :(得分:1)

终于明白了。呼!

1)NSScrollView需要一个documentView视图,其中documentView是滚动的内容。所以在nib中我创建了一个NSScrollView,它包含了documentView的视图,并将documentView设置为该视图,如CTView.m中的代码所示

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;
  }

这就是诀窍。