0

我有一个使用 Interface Builder 创建的空 NSScrollView。

在我的代码中,我在用户单击时添加了一个 NSSegmentedControl。对于接下来的所有点击,我会向其中添加一个片段。

我的问题是,一旦达到 NSScrollView 的视觉限制,它就不会开始滚动,并且所有后限制段都不会显示。

这是 Interface Builder 的 NSScrollView :

在此处输入图像描述

这是方法:

- (IBAction)addSegment:(id)sender
{
    if (segCtrlColumns == nil) {
        segCtrlColumns = [[NSSegmentedControl alloc] initWithFrame:[self.viewColumns frame]]; //self.viewColumns is the NSScrollView from IBOutlet
        [segCtrlColumns setSegmentCount:1];
        [segCtrlColumns setLabel:@"Test" forSegment:0];
        [segCtrlColumns setTarget:self];
    } else {
        double increaseSegments = [segCtrlColumns segmentCount]+1;
        [segCtrlColumns setSegmentCount:increaseSegments];
        [segCtrlColumns setLabel:@"Test" forSegment:increaseSegments-1];
    }
    [self.viewColumns setDocumentView:segCtrlColumns];
}

这是问题所在:

在此处输入图像描述

(好吧,“无滚动”比“不可滚动”更可能)

4

1 回答 1

0

好的,我做了一些测试,问题不是 nsscrollview 而是 nssegmentedcontrol。它根本不更新其帧大小。所以它停留在我在initWithFrame- 这是滚动视图的大小中设置的宽度。(这就是为什么 NSScrollView 从来没有开始滚动)

随着更多段的添加,我从来没有找到一种简单的方法来获取 NSSegmentedControl 的实际大小(更新大小),所以我做了这个技巧:

  • 我强制我的所有段都具有相同的大小(100 点宽度)
  • 当我附加段时,我将 NSSegmentedControl 的框架更新了另外 100 个点

这是代码:

-(IBAction)addColumn:(id)sender
{
    if (segCtrlColumns == nil) {
        //Init with a single segment with 100 points (pixels) width
        segCtrlColumns = [[NSSegmentedControl alloc] initWithFrame:NSMakeRect(0, 0, 100.0, 30.0)];
        [segCtrlColumns setSegmentCount:1];
        [segCtrlColumns setWidth:96.0 forSegment:0]; //The segment has some borders to concider in its size
        [segCtrlColumns setLabel:@"Testing" forSegment:0];
        [segCtrlColumns setTarget:self];
        //Tell the scrollview, the documentView is my segmented control
        [self.viewColumns setDocumentView:segCtrlColumns];
    } else {
        //Add a segment and update the frame size
        double increaseSegments = [segCtrlColumns segmentCount]+1;
        [segCtrlColumns setFrame:NSMakeRect(0, 0, segCtrlColumns.frame.size.width+100.0, 30.0)];
        [segCtrlColumns setSegmentCount:increaseSegments];
        [segCtrlColumns setWidth:96.0 forSegment:increaseSegments-1];
        [segCtrlColumns setLabel:@"Testing" forSegment:increaseSegments-1];
    }
}

这里唯一的问题是所有段都具有相同的大小而不是动态的......

于 2014-08-13T14:26:22.320 回答