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 线,我可以看到右段没有到达分段控件的边缘。
有什么办法可以解决这个问题吗?
这似乎是由 UISegmentedControl
在 apportionsSegmentWidthsByContent = 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);
}
}
我最近更新了一个圆角段控件,使每个段具有不同的宽度。
我遇到的问题是最后一段没有与分段控件的末尾正确对齐
我只是将此代码用于此示例(seg 是我的分段控件):
seg.layer.borderWidth = 1
seg.layer.cornerRadius = seg.bounds.height / 2
seg.layer.masksToBounds = true
seg.apportionsSegmentWidthsByContent = true
如果我删除 masksToBounds 线,我可以看到右段没有到达分段控件的边缘。
有什么办法可以解决这个问题吗?
这似乎是由 UISegmentedControl
在 apportionsSegmentWidthsByContent = 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);
}
}