UISegmentedControl 带有圆角和非比例段错误

UISegmentedControl with rounded corner and non proportional segments bug

我最近更新了一个圆角段控件,使每个段具有不同的宽度。
我遇到的问题是最后一段没有与分段控件的末尾正确对齐

我只是将此代码用于此示例(seg 是我的分段控件):

seg.layer.borderWidth = 1
seg.layer.cornerRadius = seg.bounds.height / 2
seg.layer.masksToBounds = true
seg.apportionsSegmentWidthsByContent = true

如果我删除 masksToBounds 线,我可以看到右段没有到达分段控件的边缘。

有什么办法可以解决这个问题吗?

这似乎是由 UISegmentedControlapportionsSegmentWidthsByContent = true 时的渲染错误引起的。我无法通过操纵控件的 CALayer 找到简单的解决方法。您可以使用 UIStackView 创建自定义控件来模仿 UISegmentedControl.

您还应该向 Apple 提交雷达。

我不知道这是否仍然影响 iOS,但 Xamarin.iOS 中的解决方法是:
覆盖 UISegmentView,计算最后一段的文本宽度元素并更新它的宽度。
C# 中的示例代码:

public class MySegmentedControl : UISegmentedControl
{
    public override void MovedToSuperview ()
    {
        // Fix truncation of last element
        // when ApportionsSegmentWidthsByContent = true
        if (ApportionsSegmentWidthsByContent) {
            RecalculateLastSegmentWidth ();
        }
    }

    private void RecalculateLastSegmentWidth()
    {
        var font = UIFont.FromName("Helvetica", 12);
        var lastSegment = NumberOfSegments - 1;
        var segmentTitle = TitleAt(lastSegment);
        var segmentWidth = segmentTitle.StringSize(font).Width + 20;
        SetWidth(segmentWidth, lastSegment);   
    }
}