NSSegmentedControl中的大小相等的单元格

时间:2016-03-02 15:49:19

标签: objective-c cocoa cells nssegmentedcontrol evenly

对于我的NSSegmentedControl,我使用它会显示一个栏来控制NSTableView。我已设置代码以编程方式控制大小:

for (NSInteger i = 1; i <= numberOfSegments; i++) {

        CGSize textSize = [[NSString stringWithFormat:@"Workspace %ld", (long)i] sizeWithAttributes:@{NSFontAttributeName: [NSFont systemFontOfSize:13.0f]}];

        NSInteger segmentWidth = self.workspaceControl.frame.size.width / numberOfSegments;

        if (textSize.width > segmentWidth) {
            [self.workspaceControl setLabel:[NSString stringWithFormat:@"%ld", (long)i] forSegment:i - 1];
        } else {
            [self.workspaceControl setLabel:[NSString stringWithFormat:@"Workspace %ld", (long)i] forSegment:i - 1];
        }

        [self.workspaceControl setWidth:segmentWidth forSegment:i - 1];

    }

这有效,出现了一个小问题。

一开始(有一个片段)看起来像这样:

before modification

当我更改值时,右侧会略微修剪。

4 segments

10 segments

然后回到一个部分:

back to one segment

约束如下:

constraints

我对裁剪感到非常困惑(可能因为几个像素太大了),但我不知道如何修复它,或者是否有更好的方法来获得均匀间隔的单元格?

1 个答案:

答案 0 :(得分:1)

在我的测试中,尽管NSSegmentedControl占用setWidth(_ width: CGFloat, forSegment segment: Int),但CGFloat细分的生成宽度限制似乎四舍五入到整数。因此,段的总宽度可以加起来超过控件本身的宽度。

要使偶数段从segmentWidth通过floor。此外,为控件设置手动宽度,并使用centerXAnchor水平约束它,而不是使用前导和尾随锚点来保持其中心对齐。

缺点:宽度必须是硬编码的,左右边距可能与其他视图不完全匹配。