UISegmentedControl 不遵守 NSConstraint 的宽度

UISegmentedControl Not Honoring NSConstraint for Width

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

然后我将第二个和第三个 UISegmentedControl 的宽度设置为与第一个 UISegmentedControl 相同的宽度。

最后,我得到的 UISegmentedControls 宽度不同。根据段数,UISegmentedControl 的右端可能有一个白色的 space。使用白色 space,整个区域等于所需的宽度 - 但如果我将背景设置为透明,UISegmentedControl 就不够宽,因为线段没有绘制得足够宽.

我已经圈出附图中的白色缺口。

如有任何建议,我们将不胜感激。

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

在您的情况下,0.9 的比例约束会导致多个设备上的小数宽度。段的 auto-calculated 宽度似乎不喜欢这样,这就是出现间隙的原因。

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

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

我能够通过覆盖 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;
            }
        }
    }
}

产生这个结果

事实证明,这是因为之前的应用程序开发人员实施了 UISegmentControl 的子 class,这会影响每个段的宽度。

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

我在使用标准 UISegmentControl class 时无法重现此问题。