NSScrollView中的NSView没有正确调整大小(尝试以编程方式调整DocumentView的大小)

时间:2015-01-30 13:24:23

标签: macos nsview nsscrollview

ADDITION#2 我还尝试使用contSizeW和contSizeWO的这些代码行来获取大小:

NSSize contSizeW  = [NSScrollView contentSizeForFrameSize:self.topLevelScroller.frame.size
                                  horizontalScrollerClass:[self.topLevelScroller.horizontalScroller class]
                                    verticalScrollerClass:nil
                                               borderType:self.topLevelScroller.borderType
                                              controlSize:NSRegularControlSize
                                            scrollerStyle:NSScrollerStyleOverlay];
NSSize contSizeWO = [NSScrollView contentSizeForFrameSize:self.topLevelScroller.frame.size
                                  horizontalScrollerClass:nil
                                    verticalScrollerClass:nil
                                               borderType:self.topLevelScroller.borderType
                                              controlSize:NSRegularControlSize
                                            scrollerStyle:NSScrollerStyleOverlay];

以上2个大小,应该是不同的,因为将horizo​​ntalScrollerClass设置为nil,这通过apple文档意味着它应该假定滚动条不可见,并且通过提供非零,应该假设它是显示滚动条。

在这种情况下,无论我为horizo​​ntalScrollerClass投入什么,它总是返回相同的高度。

编辑& ADDITION#1

-(void)initContentView{
    self.content = [[NSView alloc] init];
    [self.content setFrame:NSMakeRect(1, 1, 
                                      [[BubbleSharedPathObject sharedPath] itemsInPathList] * FILE_LIST_COLUMN_WIDTH, 
                                      self.bounds.size.height - 2)];
    [self.content setAutoresizingMask:NSViewMinXMargin | NSViewMinYMargin |
                                      NSViewMaxYMargin | NSViewHeightSizable];
    [self.content setAutoresizesSubviews:YES];
    [self.topLevelScroller setDocumentView:self.content];

}

ORIGINAL 我有一个自定义视图,我试图以编程方式调整大小。我的NSScrollView设置为只有一个水平滚动条,没有垂直滚动条。 ScrollView还设置为自动隐藏滚动条。我有一个例程叫做:

-(void)addPathComponentToEnd:(NSString *)pathComp

此例程仅向保存内容的自定义视图添加宽度,并且是ScrollView的文档视图。有趣的代码片段是:

[self.topLevelScroller setAutoresizesSubviews:NO];
[self.content setAutoresizesSubviews:NO];

NSSize contSizeW  = [NSScrollView contentSizeForFrameSize:self.topLevelScroller.frame.size hasHorizontalScroller:YES hasVerticalScroller:NO borderType:self.topLevelScroller.borderType];
NSSize contSizeWO = [NSScrollView contentSizeForFrameSize:self.topLevelScroller.frame.size hasHorizontalScroller:NO hasVerticalScroller:NO borderType:self.topLevelScroller.borderType];

NSLog(@"Size With = (%d, %d), Size Without = (%d, %d)", (unsigned int)contSizeW.width, (unsigned int)contSizeW.height, (unsigned int)contSizeWO.width, (unsigned int)contSizeWO.height);

// Resize the content view to handle the added list view
if( ( [[BubbleSharedPathObject sharedPath] itemsInPathList] * FILE_LIST_COLUMN_WIDTH ) > contSizeW.width ){
    [self.content setFrameSize:NSMakeSize([[BubbleSharedPathObject sharedPath] itemsInPathList] * FILE_LIST_COLUMN_WIDTH + 2, contSizeW.height)];

    for(FileListTableView * table in self.tablesList){
        //[table setFrame:NSMakeRect(table.fileList.tag * FILE_LIST_COLUMN_WIDTH, 0, FILE_LIST_COLUMN_WIDTH, self.content.frame.size.height)];
        [table setFrameSize:NSMakeSize(FILE_LIST_COLUMN_WIDTH, contSizeW.height)];
        NSLog(@"file list table height = %d", (unsigned int)table.frame.size.height);
    }

    NSLog(@"New Rect (x, y, w, h) = (%d, %d, %d, %d)", (unsigned int)self.content.frame.origin.x, (unsigned int)self.content.frame.origin.y, (unsigned int)self.content.frame.size.width, (unsigned int)self.content.frame.size.height);
}else{
    [self.content setFrame:NSMakeRect(1, 1, [[BubbleSharedPathObject sharedPath] itemsInPathList] * FILE_LIST_COLUMN_WIDTH + 2, contSizeWO.height)];
    //[self.content setFrame:NSMakeRect(1, 1, [[BubbleSharedPathObject sharedPath] itemsInPathList] * FILE_LIST_COLUMN_WIDTH, self.frame.size.height - 2)];

    NSLog(@"New Rect (x, y, w, h) = (%d, %d, %d, %d)", (unsigned int)self.content.frame.origin.x, (unsigned int)self.content.frame.origin.y, (unsigned int)self.content.frame.size.width, (unsigned int)self.content.frame.size.height);
}

对包含此代码的子例程的多次调用的日志记录输出如下:

Size With = (501, 206), Size Without = (501, 221)
New Rect (x, y, w, h) = (1, 1, 402, 221)
Size With = (501, 206), Size Without = (501, 221)
file list table height = 206
file list table height = 206
New Rect (x, y, w, h) = (1, 0, 602, 192)
Size With = (501, 206), Size Without = (501, 221)
file list table height = 206
file list table height = 206
file list table height = 206
New Rect (x, y, w, h) = (1, 0, 802, 206)

代码:

[[BubbleSharedPathObject sharedPath] itemsInPathList]

最初只返回1,所以所有后续调用都会加1,因此应该(并且我已经验证)它返回1,然后是2,3,4,5,6等等。

从日志记录中注意到代码第一次通过" if" (相对于其他),日志记录显示self.content视图没有采用它应该具有的206的高度值,并且是SOMEHOW提出它自己的值192.还要注意在那之后的调用中(并验证所有)其他人后来实际上最终DO采取206高度的正确值。

问题: 为什么视图没有采用我指定的大小?之前有没有其他人看过这种行为,你是怎么解决的?

非常感谢。

1 个答案:

答案 0 :(得分:0)

根据你的解释,我认为我理解你的日常工作,你的日志首先是192,然后是206,这确实很奇怪。但是,(unsigned int)self.content.frame.size.height由contSizeW设置,它再次由不推荐的方法设置 contentSizeForFrameSize:hasHorizo​​ntalScroller:hasVerticalScroller:borderType:

根据Xcode 6.1.1文档和API参考,自OS X 10.7起不推荐使用此方法,您应该使用:contentSizeForFrameSize:horizo​​ntalScrollerClass:verticalScrollerClass:borderType:controlSize:scrollerStyle:而不是。它还指出,对于现有视图,您只需使用contentSize方法。

请您使用这些方法中的任何一种,而不是弃用的方法,看看问题是否已解决。如果这没有帮助,我就像你一样卡住了。

以下是该方法的文档。很抱歉无法为您提供简单的解决方案。

  

contentSizeForFrameSize:horizo​​ntalScrollerClass:verticalScrollerClass:borderType:controlSize:scrollerStyle:   返回根据帧大小计算的内容大小   指定规格。

     

声明SWIFT类func contentSizeForFrameSize(_ frameSize:   NSSize,              horizo​​ntalScrollerClass horizo​​ntalScrollerClass:AnyClass?,                verticalScrollerClass verticalScrollerClass:AnyClass?,                           borderType borderType:NSBorderType,                          controlSize controlSize:NSControlSize,                        scrollerStyle scrollerStyle:NSScrollerStyle) - > NSSize OBJECTIVE-C   +(NSSize)contentSizeForFrameSize:(NSSize)frameSize             horizo​​ntalScrollerClass:(类)horizo​​ntalScrollerClass               verticalScrollerClass:(类)verticalScrollerClass                          borderType:(NSBorderType)borderType                         controlSize:(NSControlSize)controlSize                       scrollerStyle:(NSScrollerStyle)scrollerStyle参数frameSize屏幕坐标中的帧大小。   horizo​​ntalScrollerClass用作水平滚动条的类。一个   value的值指定不使用水平滚动条。   verticalScrollerClass用作垂直滚动条的类。一个   value的值指定不使用水平滚动条。   borderType指定滚动视图样式的外观   边界。有关可能值的列表,请参阅NSBorderType。 controlSize
  控件大小。可能的值在NSControlSize中指定。   不支持NSMiniControlSize。 scrollerStyle指定   滚动样式。有关支持的值,请参阅NSScrollerStyle。回报价值   内容视图框架大小。

     

讨论对于现有的滚动视图,您只需使用   contentSize方法。

     

导入语句导入AppKit

     

可用性在OS X v10.7及更高版本中可用。