我有以下代码:
[[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
从中间开始。
知道为什么吗?
谢谢!
答案 0 :(得分:1)
默认情况下不会翻转视图,这意味着您的文档视图固定在滚动视图的左下角(默认的非翻转视图原点)。你所看到的是一个不足以推动顶部&#34;子视图到滚动视图的顶部。我看到你试图翻看这个视图,所以你已经知道了这一点,但是你没有正确地做到这一点。
我不确定为什么在调用-setFlipped:
时您没有收到错误或警告,因为isFlipped
属性是只读的。在您的文档视图中(滚动的视图以及您放置所有这些子视图的视图),您可以覆盖它:
- (BOOL)isFlipped {
return YES;
}
当然,您必须将其置于自定义NSView子类中,并将其设置为IB中的滚动视图文档视图的类,如果您未在运行时创建它。您还需要调整用于布局的帧,因为您当前正在滚动视图框架的坐标系中表达它们。您应该在容器/布局视图的界限坐标中表达它们,这些坐标也会被翻转,因此可能与滚动视图的坐标不同。您还需要实现-intrinsicContentSize(并在添加/删除子视图时调用-invalidateIntrinsicContentSize),因此自动布局可以适当调整容器的大小。