【问题标题】:NSScrollView doesn't scroll when adding NSSegmentedControl添加 NSSegmentedControl 时 NSScrollView 不滚动
【发布时间】:2014-08-13 12:45:34
【问题描述】:

我有一个使用 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];
}

这就是问题所在:

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

【问题讨论】:

    标签: objective-c xcode macos nsscrollview nssegmentedcontrol


    【解决方案1】:

    好的,我做了一些测试,问题不是 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];
        }
    }
    

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

    【讨论】:

      猜你喜欢
      • 2016-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-07
      • 1970-01-01
      相关资源
      最近更新 更多