如何防止 UISegmentedControl 的背景色在分段边界之外泄漏

38

我注意到当我为UISegmentedControl.backgroundColor设置颜色时,颜色会溢出控件的边缘(但不超出视图的边界)。以下是示例,其中分段控件的背景颜色设置为白色,容器视图的背景颜色设置为灰色:http://i.imgur.com/yHYT14C.png

我已经设置了分段控件的自动布局约束,使其使用intrinsicContentSize,但我没有看到其他人发布有关此问题的帖子。

请注意,上面的图像是我能够得到的最佳外观...在那之前它会向外溢出约3-4像素。

我尝试将视图配置为clipSubviews,并将UIView后备图层配置为masksToBounds,但我并不希望这可以解决问题,因为我假设溢出限制在视图/图层的边界内。

如果有任何建议或建议,我将不胜感激。如果没有,我就必须创建支持修复溢出的UISegmentedControl的图像,但这很麻烦,至少可以说。


接受下面Leo的答案。将分段控件的背景层cornerRadius属性设置为接近分段控件cornerRadius的值,可以剪裁背景颜色溢出。只需要希望苹果不会再次改变角半径! :) - Mike Maxwell
3个回答

76

将片段控件的图层圆角半径设置为4.0。这应该会有所帮助。您可能需要导入QuartzCore才能访问图层的属性。

segment.layer.cornerRadius = 4.0;
segment.clipsToBounds = YES;

23
或者如果您在Interface Builder中有它,您可以在“用户定义的运行时属性”框中设置“layer.cornerRadius”。这样,如果您尚未使用它,您就不必导入QuartzCore。 - Jacob Relkin
你们的想法真是太棒了——如此简单的解决方案,我感到有些傻,竟然没能自己想出来。非常感谢你们的回答! - Mike Maxwell
4
值得一提的是,在iOS 8中(我还没有检查过iOS 7),我发现cornerRadius属性设置为4.0比5.0更准确。虽然差别很小,但我的强迫症注意到了它! - mbm29414
3
这不是长期解决方案,因为苹果可能会在未来更改 UISegmentedControl 的圆角半径。 - Karmeye
1
@NikhilManapure CALayer及其属性不适用于也不支持UIAppearance API。请对您的分段控件进行子类化,并在需要时使用该子类。 - Léo Natan
显示剩余6条评论

9
将段控制层的角半径设置为5,同时将ClipsToBounds设置为YES。
segmentController.layer.cornerRadius = 5;    
segmentController.clipsToBounds = YES;

希望这对您有帮助。

1
这似乎对之前发布的回答以及针对该答案提供的评论中提供的额外信息没有任何有用的补充。 - Peter Duniho
1
不要抱怨,这个方法是有效的。即使有圆角,我仍然遇到了一些溢出问题,但是使用 clipsToBounds 方法解决了。 - Mick Byrne
感谢您提供精确的命令。有一个小改动:segmentController.clipToBounds = true(而不是YES)。 - zSprawl

4
我能做到的Swift最佳结果是:
    segmentedControl.layer.cornerRadius = 4
    let mask = CAShapeLayer()
    mask.frame = CGRectMake(0, 0, segmentedControl.bounds.size.width-1, segmentedControl.bounds.size.height);
    let maskPath = UIBezierPath(roundedRect: mask.frame,
                                byRoundingCorners: [.BottomLeft, .BottomRight, .TopLeft, .TopRight],
                                cornerRadii: CGSize(width: 4.0, height: 4.0))
    mask.path = maskPath.CGPath
    segmentedControl.layer.mask = mask

这个产生了最好的结果!谢谢你! - Rafael Kellermann Streit
在IOS 10上,这个方案对我来说完美无缺,其他解决方案似乎也会将内部角落圆形化,而不是保持干净的垂直分割。 - Patrick Allwood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接