Xamarin Forms iOS CustomRenderer Entry PlaceHolder 和 Button Text Padding Bottom

Posted

技术标签:

【中文标题】Xamarin Forms iOS CustomRenderer Entry PlaceHolder 和 Button Text Padding Bottom【英文标题】:Xamarin Forms iOS CustomRenderer Entry PlaceHolder And Button Text Padding Bottom 【发布时间】:2020-04-22 00:43:01 【问题描述】:

这是我的第一篇文章,不要讨厌我。这种情况解释起来很复杂,但我会尽量说清楚。我有一个 xamarin 形式的项目,我正在开发 ios 版本,我将字体从基本字体更改为 Nexa。这导致改变了“g”的大小并产生了我无法解决的问题。我有一个用于条目的自定义渲染器,但我没有在网上找到任何方法来纠正底部填充。我已经在页面的 xaml、自定义渲染器和样式上尝试了许多更改,但没有解决问题 https://github.com/xamarin/Xamarin.Forms/issues/6141 。我也读过这个,但它对我没有帮助。在这里我写我的代码来澄清情况:

风格:

<!-- Default Entries -->
    <Style TargetType="cr:BorderlessEntry">
        <Setter Property="HeightRequest" Value="45"/>
        <Setter Property="TextColor" Value="Black"/>
        <Setter Property="PlaceholderColor" Value="Gray"/>
        <Setter Property="FontFamily" Value="StaticResource NormalFont"/>
    </Style>
<!-- Default Frame -->
    <Style x:Key="FrameEntry" TargetType="Frame">
        <Setter Property="BorderColor" Value="StaticResource LightBlue"/>
        <Setter Property="CornerRadius" Value="25"/>
        <Setter Property="Padding" Value="10,3,10,3"/>
        <Setter Property="Margin" Value="0"/>
    </Style>

Xaml 页面:

<Frame Style="StaticResource FrameEntry">
    <cr:BorderlessEntry Placeholder="x:Static res:AppResources.PLACE" Text="Binding Place"/>
</Frame>

CS 自定义渲染器:

   public class BorderlessEntryRenderer : EntryRenderer
    
        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        
            base.OnElementPropertyChanged(sender, e);

            if (Control == null)
                return;

            Control.Layer.BorderWidth = 0;
            Control.BorderStyle = UITextBorderStyle.None;
            //Control.VerticalAlignment = UIControlContentVerticalAlignment.Fill;
            //Control.LeftView = new UIView(new CGRect(0, 0, 0, 0));
            //Control.LeftViewMode = UITextFieldViewMode.Always;
            //Control.RightView = new UIView(new CGRect(0, 0, 0, 0));
            //Control.RightViewMode = UITextFieldViewMode.Always;
        
    

很明显,如果我尝试在条目中写 g 它不会被删减!

我还发现按钮内的文本也出现了同样的问题,您可以在链接的测试项目中找到这两个示例。

这里是重新创建问题的测试项目的链接(仅在 iOS 上)

https://drive.google.com/open?id=1J2FAbh_jjJ8JnURh_-C7jBXbr02xBBGD

【问题讨论】:

您的描述含糊不清。所以您能否分享一个包含该问题的示例,以便我可以测试它。 更新示例链接 权限问题无法下载,你可以上传到github。 现在我修复了下载,我也修复了按钮 【参考方案1】:

在渲染器的OnElementPropertyChanged集合中

 var unconstrainedSize = new CGSize(99999999999, 99999999999);
 Control.HeightAnchor.ConstraintEqualTo(unconstrainedSize.Height).Active = true;

您也可以使用填充:

public override void LayoutSubviews()


   base.LayoutSubviews();

            CGRect frame = this.top.Frame; // save frame
            frame.Height = this.Bounds.Size.Height + 20f; //modify frame
            //Frame.Offset(0, 20); dunno can play with this too
            this.Frame = frame; // set modifyed

【讨论】:

第一个不起作用。我应该把第二个放在哪里? 在你的 ios 入口渲染器中

以上是关于Xamarin Forms iOS CustomRenderer Entry PlaceHolder 和 Button Text Padding Bottom的主要内容,如果未能解决你的问题,请参考以下文章

跨 Android/iOS 的 Xamarin 通用 Xamarin.Forms 代码

在 iOS 上的 Xamarin.Forms.Maps 中使用 Xamarin.Essentials Geolocation 获取设备位置的奇怪问题

Xamarin.Forms 中iOS通过URL Scheme判断应用是否安装

Xamarin.Forms 无法更改本地设备上 Xamarin.iOS 中的应用程序图标

无法构建 Xamarin.Forms iOS 项目

Xamarin.Forms 手势密码实现