NSScrollView不绘制文档视图?

use*_*591 9 macos cocoa objective-c nsscrollview

我创建了一个实现initWithFrame和drawRect的自定义视图.在IB中,我创建了一个窗口并将自定义视图放在窗口的中心.然后我使用编辑器>嵌入>滚动视图将自定义视图放入滚动视图.然后,什么都没有?initWithFrame消息将发送到自定义视图,但永远不会发送drawRect消息.

没有我的特定自定义视图,可以生成类似的行为.如果包装标签以相同方式嵌入滚动视图中,则也不会绘制它.

如何让scrollview绘制其内容?

另外,在一个有点相关的说明中,以编程方式调整滚动视图中嵌入的视图的正确方法是什么?

谢谢!

uch*_*aka 24

NSScrollView与其他视图不同.它做的事情就完全不同了,一开始就让每个人都疯了,特别是一旦你习惯了自动布局思维.它也是其中一个视图(连同NSTableView,NSOutlineView和NSCollectionView等),在你开始看到工作之前,有许多部分需要设置.自动布局也增加了一点.

NSScrollView默认包含至少3 个子视图:

  • 一个NSClipView对象.(Apple称之为内容视图.这是可见的.)
  • 两个NSScroller对象.

NSClipView内容的浏览对象中包含的NSView某种形式的.

(苹果称之为文档视图)

如果从对象库向您的xib 添加一个普通的NSScrollView,它在Interface Builder中看起来有一个大小,但在运行时它的大小为零.每次都会踢你的屁股.您可以通过添加日志记录来查看.

NSLog(@" size of document view:%@", NSStringFromRect(_myScrollView.documentView.frame);

即使你添加一个子视图并setNeedsDisplay:YES整天打电话,你也不会看到该死的东西.

有些事情你可以做.首先,你可以设置的大小documentViewsetFrameSize:NSMakeSize(somePointsWide, somePointsHigh)

你也可以使它成为一个自定义的NSView子类,它有一个实现,intrinsicContentSize根据你想要放在那里的任何逻辑规则(包括一些默认的最小值)计算出来.

您还可以简单地说,所有子视图必须至少与文档视图中的N个点或更多在每个边缘上使用自动布局.VFL(可视格式语言)看起来像这样:@"H:|-nPoints-[aSubviewOfDocumentView]-nPoints-|"这个@"V:|-nPoints-[aSubviewOfDocumentView]-nPoints-|" (确保你的子视图有一个内在的大小或他们自己的一些子视图,给他们一个最小的尺寸......并实现- (BOOL)translatesAutoresizingMaskIntoConstraints { return NO; } 和关闭你的documentView的自动调整大小子视图IB中的复选框,或者通过致电setAutoResizesSubviews:NO或者你会厌恶生活.)

现在这导致了一个奇怪的事情.使用自动布局,通常可以尽可能多地停止考虑帧和rects,但是使用NSScrollView documentView,您可能需要考虑不使用自动布局来定位子视图.在某些情况下,它可能更简单,只需让documentView适应.如果您使用上面的"nPoints"方法,并且您的子视图是可拖动的,您只想捕获子视图的帧原点的NSPoint(用它来确定您的delta),然后捕捉mouseDown点,当拖动完成时,捕获鼠标指向并计算新帧原点的增量.然后使用新点调用setFrameOrigin:


Wil*_*ley 4

您使用自动布局还是老式视图调整大小?如果您的 init 方法被调用但没有调用 draw 方法,那么听起来您的整个滚动视图或自定义视图的大小为零。

如果您有自定义视图并且正在使用自动布局,您是否在自定义视图子类中实现了 -intrinsicContentSize 方法?