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

Hoo*_*cat 10 cocoa coordinates nsview nsscrollview

我有一位同事今天来找我,问题是他如何加载或查看交换一个documentView,NSScrollView以便加载的视图看起来固定在左上角而不是底部角落.

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

这是一件一件的问题:

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

使用以下IBOutlets 创建一个控制器类(例如myController):

  • IBOutlet NSScrollView * myScrollView
  • IBOutlet NSView * myCustomView1
  • IBOutlet 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)

选择documentViewNSScrollView界面生成器,并使其的子类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与所述内容视图交换和出现在滚动视图代替左下角的左上角.


arr*_*rri 5

为了正确地使documentView最初对齐到滚动视图的顶部,并在小于剪辑视图时将其固定到顶部documentView,这对我有用:

\n\n

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

\n\n

2 \xe2\x80\x93 创建一个NSView用于 的子类documentView,并重写这些方法:

\n\n
- (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}  \n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n