【问题标题】:How to prevent backgroundColor of UISegmentedControl bleeding beyond segmented border如何防止分段控件的背景颜色溢出分段边框
【发布时间】:2013-12-29 23:08:28
【问题描述】:

我注意到,当我为 UISegmentedControl.backgroundColor 设置颜色时,颜色会溢出控件的边缘(尽管不会超出视图的边界)。下面是一个示例,分段控件的背景颜色设置为白色,容器视图的背景颜色设置为灰色:

我已经设置了分段控件的 AutoLayout 约束,因此应该使用 intrinsicContentSize,但我还没有看到其他人发布关于这个问题的帖子

请注意,上面的图像是我能看到的最好的图像……在此之前它流血了大约 3-4 像素。

我尝试将视图配置为 clipSubviews,并将支持 UIView 的层配置为 maskToBounds,但我没想到这会解决问题,因为我认为出血包含在视图/层的边界内。

任何建议或意见表示赞赏。如果不是,我只需要创建图像来支持修复出血的 UISegmentedControl,但至少可以这么说,这很烦人。

【问题讨论】:

  • 接受了下面 Leo 的回答。将分段控件的支持层cornerRadius 属性设置为分段控件的cornerRadius 附近的值将剪辑背景色渗色。只希望苹果不会再把拐角半径弄脏了! :)

标签: ios uisegmentedcontrol


【解决方案1】:

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

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

【讨论】:

  • 或者如果你在Interface Builder中有它,你可以在“用户定义的运行时属性”框中的“layer.cornerRadius”下设置它。这样,如果您还没有使用 QuartzCore,就不必导入它。
  • 伟大的想法家伙 - 如此简单的解决方案,我觉得自己没有想出它很傻。感谢您的回答!
  • FWIW:在 iOS 8 中(尚未检查 iOS 7),我发现 4.0 的 cornerRadius 比 5.0 更准确。差别很小,但我的强迫症注意到了!
  • 这不是一个长期的解决方案,因为苹果将来可能会更改UISegmentedControl 的圆角半径。
  • @NikhilManapure CALayer 及其属性不适用于也不支持 UIAppearance API。子类化您的段控件并在需要时使用该子类。
【解决方案2】:

我在 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

【讨论】:

  • 这个结果最好!谢谢!
  • 在 IOS 10 上,这个非常适合我,其他解决方案似乎也是圆内角,而不是有一个干净的垂直分隔。
【解决方案3】:

将段控制层的角半径设置为 5. 和 ClipsToBounds YES 。

segmentController.layer.cornerRadius = 5;    
segmentController.clipsToBounds = YES;

希望它对你有用

【讨论】:

  • 这似乎没有为之前给出的答案(大约一年前发布)添加任何有用的信息,也没有为该答案在 cmets 中提供的其他信息。
  • 不要仇恨,这行得通。即使有拐角半径,我也有一点出血,但用clipsToBounds修复了
  • 感谢您的精确命令。一个小改动:segmentController.clipToBounds = true(而不是 YES)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多