在文档交换时将NSScrollView内容设置为左上而不是左下

时间:2011-01-15 01:38:54

标签: cocoa coordinates nsview nsscrollview

我今天有一位同事来找我,问题是如何加载或查看交换documentView的{​​{1}},以便加载的视图可以修复到顶部 - 左角而不是底角。

尽管在Apple,StackOverflow和其他各个地方阅读了文档,但他花了一段时间在网上搜索并且没有解决方案。

这是一件一件的问题:

在Interface Builder中,将NSScrollView拖到项目中。 同样在Interface Builder中,将两个自定义视图拖到项目中,并添加一些文本字段,按钮等。

使用以下NSScrollView s:

创建一个控制器类(例如myController)
  • IBOutlet
  • IBOutlet NSScrollView * myScrollView
  • IBOutlet NSView * myCustomView1

将插座连接到Interface Builder中的控件。

创建IBOutlet NSView * myCustomView2子类以翻转NSView

documentView

在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; } 的{​​{1}},并将其设为documentView的子类。在Interface Builder中,您将选择NSScrollView,然后再次单击它以转到NSScrollView,或更改IB库以显示树视图并选择myFlippedView的子自定义视图。

documentView类中,使用以下方法交换视图:

NSScrollView

最后将项目中的按钮挂钩到动作myController,构建并运行。

问题是坐标没有像isFlipped那样被解析。

2 个答案:

答案 0 :(得分:10)

有一个简单但显然经常被忽视的原因。

虽然isFlipped在Interface Builder中继承了自定义视图,但是视图交换中的documentView正在被替换,第一个在awakeFromNib上使用。

解决方案是将myCustomClass1和myCustomClass2子类化为myFlippedView类。

执行此操作并对其进行测试,您会发现视图现在显示在滚动视图的左上角。然而,它产生了一个新问题。自定义视图中的所有内容现在都是从下到上排列的(因为默认情况下,所有NSView布局都是从左下角开始的,因此翻转也会翻转它们的坐标。)

幸运的是,这个问题还有另外一个简单的方法。请继续阅读: - )

在Interface Builder中,突出显示myCustomView1中的所有控件,然后从Layout菜单中选择嵌入对象 - >自定义视图。根据需要调整大小,对myCustomView2执行相同操作并重建。

瞧。 NSScrollView内容视图交换并显示在滚动视图的左上角而不是左下角。

答案 1 :(得分:3)

要正确地使documentView初始对齐到滚动视图的顶部,并且当documentView小于它的剪辑视图时,也它放到顶部,这是什么对我有用:

1 - 在Interface Builder中,将documentView中的所有控件都包含在自定义 NSView实例中。 (不是翻转的视图)

2 - 创建一个NSView子类用于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)];
    }
}  

子类视图应该是scrollViews'documentView,其中包含包含所有控件的第二个(普通)NSView。