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 时无法重现此问题。
我设置了一个包含多个 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 时无法重现此问题。