首页 > 解决方案 > Xamarin iOS 按钮多行文本更改图像对齐方式

问题描述

在编写应用程序时,我注意到 Xamarin iOS 按钮默认不支持文本换行。为了克服这个问题,我创建了一个自定义渲染器,如下所示:

    class iOSButton : ButtonRenderer 
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Button> e)
        {
            base.OnElementChanged(e);

            if (Control != null)
            {
                Control.TitleLabel.LineBreakMode = UILineBreakMode.WordWrap;

            }
        }
    }

这工作正常,直到您将图像添加到按钮。我在文本上方放置了一个图像并将其居中。但是,现在文本仅在几个字符后环绕,并且似乎新行上的任何字符都将图像移动到其居中位置的右侧(尽管文本位于图像下方)。

本质上,多行文本会移动图像对齐方式,并且文本会在填充可用空间之前开始环绕。

我已经尝试在图像和文本属性上使用 UIEdgeInsets(如此处所述:在 Xamarin IOS 中显示带有文本和图像的按钮),但我无法让它工作。

任何想法如何保持图像对齐并防止过早的文本换行?这可能是 Xamarin 表单中的错误吗?

编辑: 我尝试了@llill 的答案 - 不幸的是它没有帮助,只是移动了对齐但没有修复它。

示例图片

按钮应显示“测试文本”,箭头居中在文本上方,文本也居中。

此按钮的 Xaml 是:

<Button TextColor="White"
Text="Test Text"
                                
                                Grid.Row="0"
                                Grid.RowSpan="2"
                                Grid.Column="2"
                                BackgroundColor="{StaticResource ButtonColour}"
                                BorderColor="{Binding ButtonSelection[2], Converter={Services:ByteToBorderColourConverter}}"
                                BorderWidth="{StaticResource ButtonBorderWidth}"
                                BorderRadius="{StaticResource ButtonCornerRadius}"

                                HorizontalOptions="FillAndExpand"
                                VerticalOptions="FillAndExpand"
                                ContentLayout="Top"
                                ImageSource ="left_arrow_back_button.png"
                                    
                                Pressed="Test_Pressed"
                                Released="Test_Released"
                                />

标签: iosxamarin.formsxamarin.iosuikit

解决方案


我使用自定义渲染器来重写按钮。在Xamarin iOS中,我尝试使用UIEdgeInsets来实现Button的文字换行操作,图片在文字上方。下面是我在 Xamarin.IOS 中的代码:

[assembly: ExportRenderer(typeof(Button), typeof(MyButtonren))]
namespace mkll.iOS
{
    public class MyButtonren:ButtonRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Button> e)
        {
            base.OnElementChanged(e);
            Control.SetTitle("adasdsadagfcghgvhjvhvhvhvvsdsdszd", UIControlState.Normal);
            Control.SetImage(UIImage.FromFile("didian.png"), UIControlState.Normal);
            Control.ImageEdgeInsets = new UIEdgeInsets(-50 , 60, Control.TitleLabel.Frame.Size.Height , 0);
            Control.TitleEdgeInsets = new UIEdgeInsets(Control.ImageView.Frame.Size.Height / 2, 0, -Control.ImageView.Frame.Size.Height / 2, Control.ImageView.Frame.Size.Width / 2);
            Control.TitleLabel.LineBreakMode = UIKit.UILineBreakMode.WordWrap;
        }
    }
}

下面是运行截图:

在此处输入图像描述


推荐阅读