UILabel在Xamarin.iOS中有填充?

Jos*_*arl 10 c# iphone uilabel xamarin.ios ios

我正在尝试UILabel在我的Xamarin.iOS应用程序中创建一个填充.本机Objective-C应用程序中最流行的解决方案是重写drawTextInRect:

- (void)drawTextInRect:(CGRect)rect {
    UIEdgeInsets insets = {0, 5, 0, 5};
    return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)];
}
Run Code Online (Sandbox Code Playgroud)

这看起来很简单,我无法弄清楚如何将其转换为C#.这是我最好的尝试:

internal class PaddedLabel : UILabel
{
    public UIEdgeInsets Insets { get; set; }

    public override void DrawText(RectangleF rect)
    {
        var padded = new RectangleF(rect.X + Insets.Left, rect.Y, rext.Width + Insets.Left + Insets.Right, rect.Height);

        base.DrawText(padded);
    }
}
Run Code Online (Sandbox Code Playgroud)

这似乎会移动标签的文本,但它不会调整标签的大小.

我认为主要问题是我找不到相应的Xamarin UIEdgeInsetsInsetRect.

有什么建议?

pou*_*pou 16

ObjC函数的C#等价物UIEdgeInsetsInsetRectUIEdgeInsets命名的实例方法,InsetRect它与您的RectangleF计算不同(这可能是您的问题).

要使用它,您可以:

public override void DrawText(RectangleF rect)
{
    base.DrawText (Insets.InsetRect (rect));
}
Run Code Online (Sandbox Code Playgroud)


Coy*_*Bit 5

您必须覆盖两者 DrawTextTextRectForBounds.如果不覆盖TextRectForBounds,文本将被剪裁.实际上,您重写此方法以补偿填充占用的空间,并要求iOS在更大的矩形中绘制文本.

public partial class LabelWithBorder
    : UILabel
{
    private UIEdgeInsets EdgeInsets = new UIEdgeInsets(5, 5, 5, 5);
    private UIEdgeInsets InverseEdgeInsets = new UIEdgeInsets(-5, -5, -5, -5);

    public LabelWithBorder(IntPtr handle) : base(handle)
    {
    }

    public override CoreGraphics.CGRect TextRectForBounds(CoreGraphics.CGRect bounds, nint numberOfLines)
    {
        var textRect = base.TextRectForBounds(EdgeInsets.InsetRect(bounds), numberOfLines);
        return InverseEdgeInsets.InsetRect(textRect);
    }

    public override void DrawText(CoreGraphics.CGRect rect)
    {
        base.DrawText(EdgeInsets.InsetRect(rect));
    }
}
Run Code Online (Sandbox Code Playgroud)