Hoo*_*cat 10 cocoa coordinates nsview nsscrollview
我有一位同事今天来找我,问题是他如何加载或查看交换一个documentView,NSScrollView以便加载的视图看起来固定在左上角而不是底部角落.
尽管在Apple,StackOverflow和其他各个地方阅读了文档,但他花了一段时间在网上搜索并且没有解决方案.
这是一件一件的问题:
在Interface Builder中,拖入NSScrollView项目.同样在Interface Builder中,将两个自定义视图拖到项目中,并添加一些文本字段,按钮等.
使用以下IBOutlets 创建一个控制器类(例如myController):
IBOutlet NSScrollView * myScrollViewIBOutlet NSView * myCustomView1IBOutlet NSView * myCustomView2将插座连接到Interface Builder中的控件.
创建一个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;
}
Run Code Online (Sandbox Code Playgroud)
选择documentView的NSScrollView界面生成器,并使其的子类myFlippedView.在Interface Builder中,您将选择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];
}
}
Run Code Online (Sandbox Code Playgroud)
最后,将项目中的按钮连接到操作swapViews,构建并运行.
问题是坐标没有按照isFlipped的预期得到解决.
Hoo*_*cat 10
这有一个简单但显然经常被忽视的原因.
虽然isFlipped在Interface Builder中继承了自定义视图,但是在视图交换中替换了documentView,第一个被使用awakeFromNib.
解决方案是将myCustomClass1和myCustomClass2子类化为myFlippedView类.
执行此操作并对其进行测试,您会发现视图现在显示在滚动视图的左上角.然而,它产生了一个新问题.自定义视图中的所有内容现在都是从下到上NSView排列的(因为默认情况下所有布局都是从左下角开始,因此翻转也会翻转它们的坐标).
幸运的是,这个问题还有另一个简单的方法.继续阅读:-)
在Interface Builder中,突出显示所有的控件myCustomView1,然后从Layout菜单中选择嵌入对象在- >自定义视图.根据需要调整大小,对myCustomView2执行相同操作并重建.
瞧.一个NSScrollView与所述内容视图交换和出现在滚动视图代替左下角的左上角.
为了正确地使documentView最初对齐到滚动视图的顶部,并在小于剪辑视图时将其固定到顶部documentView,这对我有用:
1 \xe2\x80\x93 在 Interface Builder 中,将 documentView 中的所有控件包含在自定义 NSView实例中。(不是翻转视图)
2 \xe2\x80\x93 创建一个NSView用于 的子类documentView,并重写这些方法:
- (BOOL)isFlipped {\n return YES;\n}\n- (void)resizeWithOldSuperviewSize:(NSSize)oldSize {\nCGFloat superViewHeight = self.superview.frame.size.height, height = self.frame.size.height;\n if(superViewHeight>height) {\n [self setFrameOrigin:NSMakePoint(self.frame.origin.x, superViewHeight-height)];\n }\n} \nRun Code Online (Sandbox Code Playgroud)\n\n子类视图应该是包含第二个(普通)NSView 的scrollViews documentView,其中包含所有控件。
| 归档时间: |
|
| 查看次数: |
5014 次 |
| 最近记录: |