我今天有一个同事来找我,因为他如何加载或查看swap a documentView 一个 NSScrollView 因此,加载的视图似乎可以固定在左上角,而不是底部的角落。

他花了一段时间搜索网络并陷入困境,尽管在Apple,Stackoverflow和其他各个地方阅读了文档,但没有解决方案。

这是逐个问题:

在接口构建器中拖动 NSScrollView 进入项目。同样在接口构建器中,将两个自定义视图拖到项目中,并添加一些Textfield,按钮等。

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

  • 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;
}

选择 documentViewNSScrollView 在接口构建器中,使其成为 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。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top