NSScrollView从documentView的中间开始

时间:2015-05-05 01:03:19

标签: cocoa nsview nsscrollview

我有以下代码:

[[ticketsListScrollView documentView] setFrame: NSMakeRect(0, 0, [ticketsListScrollView frame].size.width, 53 * [tickets count])];
[[ticketsListScrollView documentView] setFlipped:YES];


for(int i = 0; i < [tickets count]; i++) {
    TicketsListViewController *viewController = [[TicketsListViewController alloc] initWithNibName:@"TicketsListViewController" bundle:nil];

    viewController.dateLabelText = tickets[i][@"date"];
    viewController.timeLabelText = tickets[i][@"time"];
    viewController.subjectLabelText = tickets[i][@"title"];

    NSRect frame = [[viewController view] frame];
    frame.origin.y = frame.size.height * i;
    [viewController view].frame = frame;

    [[ticketsListScrollView documentView] addSubview:[viewController view]];
}

如果列表足够大(许多视图),NSScrollView从左上角开始,这很棒。对于较少的观看次数(视图不占用整个documentView,则NSScrollView从中间开始。

知道为什么吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

默认情况下不会翻转视图,这意味着您的文档视图固定在滚动视图的左下角(默认的非翻转视图原点)。你所看到的是一个不足以推动顶部&#34;子视图到滚动视图的顶部。我看到你试图翻看这个视图,所以你已经知道了这一点,但是你没有正确地做到这一点。

我不确定为什么在调用-setFlipped:时您没有收到错误或警告,因为isFlipped属性是只读的。在您的文档视图中(滚动的视图以及您放置所有这些子视图的视图),您可以覆盖它:

- (BOOL)isFlipped {
    return YES;
}

当然,您必须将其置于自定义NSView子类中,并将其设置为IB中的滚动视图文档视图的类,如果您未在运行时创建它。您还需要调整用于布局的帧,因为您当前正在滚动视图框架的坐标系中表达它们。您应该在容器/布局视图的界限坐标中表达它们,这些坐标也会被翻转,因此可能与滚动视图的坐标不同。您还需要实现-intrinsicContentSize(并在添加/删除子视图时调用-invalidateIntrinsicContentSize),因此自动布局可以适当调整容器的大小。