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 中可见,但是当我移动水平滚动条时,第二帧不会出现在 CTView 中。

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

有谁知道我需要与 UIScrollView 做不同的事情才能使 NSScrollView 能够滚动帧?

4

1 回答 1

1

终于想通了。哇!

1) NSScrollView 需要为其 documentView 提供一个视图,其中 documentView 是滚动的内容。因此,在笔尖中,我创建了一个包含 documentView 视图的 NSScrollView,并将 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;
  }

这就是诀窍。

于 2012-07-07T00:55:49.363 回答