IOS 中的 Xamarin Forms Picker 不会换行 [英] Xamarin Forms Picker in IOS will not wrap

查看:37
本文介绍了IOS 中的 Xamarin Forms Picker 不会换行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在 Xamarin 表单中制作自定义渲染器,以便选择器中的文本将为 IOS 换行.安卓运行良好.从阅读来看,我似乎需要使用 UIPickerViewDelegate 来做到这一点.但是,当我这样做时.. 拾取器比以前坏得更严重,基本上无法使用.如果我使用委托,则选择器呈现良好,但是当您选择某些内容时.任何事物.它始终是第一个被选中的项目.选择第 10 项,UI 将显示第 1 项.您选择哪个项目并不重要.选择器不知何故总是认为它是第一个.我没有故意做任何影响所选项目的事情.感觉好像还有一些我应该做的事情,而这些其他解决方案没有告诉我.

I'm attempting to make a custom renderer in Xamarin forms so that the text in the picker will wrap for IOS. Android works fine. From reading around it seems I need to do this with a UIPickerViewDelegate. However, when I do this.. the picker just breaks worse than it was broken before and is basically unusable. If I use the delegate, then the picker renders fine, but when you select something. Anything. It's always the first item that get's selected. Select the 10th item and the UI shows the 1st item. It doesn't matter which item you select. The picker somehow always thinks it's the first. I haven't done anything intentionally to affect the selected items. It feels like there's something else I'm supposed to do that these other solutions are not telling me.

这是我的渲染器:

public class CustomPickerRenderer : PickerRenderer {

protected override void OnElementChanged(ElementChangedEventArgs<Picker> e) {
  base.OnElementChanged(e);
  if (Control != null) {
    ((UIPickerView)Control.InputView).Delegate = new CustomPickerViewDelegate();
  }
}

protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) {
  base.OnElementPropertyChanged(sender, e);
  if (e.PropertyName.Equals("itemssource", StringComparison.InvariantCultureIgnoreCase)) {
    ((Control.InputView as UIPickerView).Delegate as CustomPickerViewDelegate).ItemSource = Element.ItemsSource;
  }
}

}

这是我的 UIPickerViewDelegate

Here's My UIPickerViewDelegate

public class CustomPickerViewDelegate: UIPickerViewDelegate {

public IList ItemSource { get; set; }

public override UIView GetView(UIPickerView pickerView, nint row, nint component, UIView view) {
  UILabel label = new UILabel();
  label.Text = ItemSource[(int)row].ToString();
  label.Lines = 0;
  label.LineBreakMode = UILineBreakMode.WordWrap;

  return label;
}

public override nfloat GetRowHeight(UIPickerView pickerView, nint component) {
  return 48;
}

}

推荐答案

我检查了本地站点的部分代码,也发现点击Done按钮后没有设置选定的值.为了解决这个问题,我们需要自定义一个UIToolbar来覆盖系统.

I have checked with some part of code in local site ,also found that not set the selected value after clicking Done Button . To solve this , we need to custom a UIToolbar to override the system one .

另外,当滚动结束时,该值不能自动被选中.我们需要在CustomPickerViewDelegate中添加Selected覆盖方法来设置控件的选中值(UITextField) .

In addition , when scrolling end , the value can not be selected automatically .We need to add Selected override method inside CustomPickerViewDelegate to set selected value for Control(UITextField) .

CustomPickerRenderer 的完整代码如下:

[assembly: ExportRenderer(typeof(Picker), typeof(CustomPickerRenderer))]
namespace MonkeyApp.iOS
{
    public class CustomPickerRenderer : PickerRenderer
    {
        List<string> itemList;
        protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
        {
            base.OnElementChanged(e);
            if (Control != null)
            {

                //Control.BackgroundColor = UIColor.Red;

                UITextField textField = Control;
           
                UIPickerView pickerView = textField.InputView as UIPickerView;

                Picker myPicker = Element;
                itemList = myPicker.Items.ToList();

                pickerView.Delegate = new CustomPickerViewDelegate(itemList, textField);

                UIToolbar toolbar = new UIToolbar(new CoreGraphics.CGRect(0,0,UIScreen.MainScreen.Bounds.Size.Width,44));
                UIBarButtonItem spaceItem = new UIBarButtonItem(UIBarButtonSystemItem.FlexibleSpace);
                UIBarButtonItem doneButtonItem = new UIBarButtonItem(UIBarButtonSystemItem.Done);
                doneButtonItem.Clicked += DoneButtonItem_Clicked;
                var bbs = new UIBarButtonItem[] { spaceItem, doneButtonItem };
                toolbar.SetItems(bbs, false);
                Control.InputAccessoryView = toolbar;
            }
        }

        private void DoneButtonItem_Clicked(object sender, EventArgs e)
        {
            Control.ResignFirstResponder();
        }
    }

    internal class CustomPickerViewDelegate : UIPickerViewDelegate
    {
        private List<string> itemList;
        private UITextField textField;

        public CustomPickerViewDelegate(List<string> itemList, UITextField textField)
        {
            this.itemList = itemList;
            this.textField = textField;
        }

        public override UIView GetView(UIPickerView pickerView, nint row, nint component, UIView view)
        {
            UILabel label = new UILabel();
            label.Text = itemList[(int)row];
            label.Lines = 0;
            label.LineBreakMode = UILineBreakMode.WordWrap;

            return label;
        }

        public override nfloat GetRowHeight(UIPickerView pickerView, nint component)
        {
            return 48;
        }

        public override void Selected(UIPickerView pickerView, nint row, nint component)
        {
            textField.Text = itemList[(int)row];
        }
    }
}

效果:

这篇关于IOS 中的 Xamarin Forms Picker 不会换行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆