我今天有一位同事来找我,问题是如何加载或查看交换documentView
的{{1}},以便加载的视图可以修复到顶部 - 左角而不是底角。
尽管在Apple,StackOverflow和其他各个地方阅读了文档,但他花了一段时间在网上搜索并且没有解决方案。
这是一件一件的问题:
在Interface Builder中,将NSScrollView
拖到项目中。
同样在Interface Builder中,将两个自定义视图拖到项目中,并添加一些文本字段,按钮等。
使用以下NSScrollView
s:
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那样被解析。
答案 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。