在文档交换时,将NSSCrollView内容设置为左上角,而不是左下
-
11-10-2019 - |
题
我今天有一个同事来找我,因为他如何加载或查看swap a documentView
一个 NSScrollView
因此,加载的视图似乎可以固定在左上角,而不是底部的角落。
他花了一段时间搜索网络并陷入困境,尽管在Apple,Stackoverflow和其他各个地方阅读了文档,但没有解决方案。
这是逐个问题:
在接口构建器中拖动 NSScrollView
进入项目。同样在接口构建器中,将两个自定义视图拖到项目中,并添加一些Textfield,按钮等。
使用以下内容创建一个控制器类(例如myController) IBOutlet
S:
IBOutlet NSScrollView * myScrollView
IBOutlet NSView * myCustomView1
IBOutlet NSView * myCustomView2
将插座连接到接口构建器中的控件。
创建一个 NSView
子类以翻转 documentView
:
@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;
}
选择 documentView
的 NSScrollView
在接口构建器中,使其成为 myFlippedView
. 。在接口构建器中,您将选择NSSCrollView,然后再次单击它以获取 documentView
, ,或更改IB库以显示树视图并选择儿童自定义视图 NSScrollView
.
在里面 myController
类用以下方法交换视图:
-(void)awakeFromNib {
[myScrollView setDocumentView:myCustomView1];
}
-(IBAction)swapViews:(id)sender {
if ([myScrollView documentView] == myCustomView1) {
[myScrollView setDocumentView:myCustomView2];
} else {
[myScrollView setDocumentView:myCustomView1];
}
}
最后将项目中的按钮连接到动作 swapViews
, ,构建和运行。
问题在于,坐标并未像ISFlyply的预期一样解决。
解决方案
有一个简单但显然经常被忽略的原因。
虽然 isFlipped
在接口构建器中的自定义视图子类别中,DocumentView在视图交换上被替换 awakeFromNib
.
解决方案是将mycustomClass1和mycustomClass2子亚级取向MyFlippingView类。
执行此操作并测试它,您会注意到视图现在显示在滚动视图的左上方。但是,它创造了一个新问题。现在,自定义视图中的所有内容都从下到顶部布置(默认情况下 NSView
布局是从左下角的,因此翻转也会翻转其坐标)。
幸运的是,解决此问题还有另一个简单的解决方案。阅读:-)
在接口构建器中,突出显示了所有控件 myCustomView1
并从 Layout
菜单,选择 - >自定义视图中的嵌入对象。根据需要调整大小,为mycustomview2做同样的操作并重建。
瞧。一个 NSScrollView
内容视图交换并出现在滚动视图的左上角,而不是左下角。
其他提示
正确地使 documentView
最初与卷轴的顶部保持一致 别针 当它到达 documentView
比剪辑小,这对我有用:
1 - 在接口构建器中 风俗 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)];
}
}
子分类的视图应为滚动浏览' documentView
其中包含包含所有控件的第二个(正常)nsview。