UISegmentedControl不支持NSConstraint的宽度

时间:2016-01-18 22:45:56

标签: ios interface-builder uisegmentedcontrol nslayoutconstraint

我设置了一个包含多个UISegmentedControl的屏幕。使用Auto-Layout / NSLayoutConstraints,我将第一个UISegmentControl设置为宽度为" 0.9超级视图的宽度"。

然后我将第2和第3 UISegmentedControl设置为宽度等于第1 UISegmentedControl

最后,我得到的UISegmentedControls宽度不一样。根据段的数量,UISegmentedControl可能在右端有一个空格。对于空白区域,整个区域等于宽度所需的区域 - 但是如果我将背景设置为透明,则UISegmentedControl不够宽,因为区段的绘制范围不够宽。

我在附图中圈出了白色的间隙。 space on right end of 2nd UISegmentedControl

任何建议都将不胜感激。

2 个答案:

答案 0 :(得分:0)

在我看来,你遇到了UISegmentedControl的错误。我发现即使没有NSLayoutConstraints也可以重现这一点,尽管可能性要小得多!

在您的情况下,您的比例约束为0.9将导致多个设备上的小数宽度。看起来段的自动计算宽度不喜欢这个,这就是出现间隙的原因。

我设置了一个类似的视图,其中三个分段控件设置为超视图宽度的0.9。

Three UISegmentControls, with gap showing on right edge

现在您可以看到它们具有相同的帧(白色背景),但中间控件不适合整个宽度。

我能够通过覆盖viewController中的viewDidLayoutSubviews并调整segmentedControl的框架来解决问题,如果宽度是小数的话。

- (void)viewDidLayoutSubviews
{
    for (UIView *subview in self.view.subviews) {
        if ([subview isKindOfClass:[UISegmentedControl class]]) {
            CGRect frame = subview.frame;
            CGFloat frameWidth = CGRectGetWidth(frame);
            CGFloat roundedWidth = roundf(frameWidth);
            if (frameWidth != roundedWidth) {
                frame.size.width = roundedWidth;
                subview.frame = frame;
            }
        }
    }
}

产生此结果

enter image description here

答案 1 :(得分:0)

事实证明这种情况正在发生,因为之前的应用程序开发人员实现了UISegmentControl的子类,这影响了每个段的宽度。

我对这个子类进行了一些调整,UISegmentControl开始正确调整大小,即使使用比例约束也是如此。

使用标准UISegmentControl类时,我无法重现此问题。