IOS 中的 Xamarin Forms Picker 不会换行
Xamarin Forms Picker in IOS will not wrap
我正在尝试在 Xamarin 表单中制作自定义渲染器,以便选择器中的文本将换行 IOS。 Android 工作正常。通过阅读,我似乎需要使用 UIPickerViewDelegate 来执行此操作。然而,当我这样做时……拾取器比以前更坏了,基本上不能用了。如果我使用委托,那么选择器会很好地呈现,但是当你 select 时。任何事物。它总是第一个被 selected 的项目。 Select 第 10 项,UI 显示第 1 项。 select 哪个项目并不重要。采摘者不知何故总是认为它是第一个。我没有做任何有意影响 selected 项目的事情。感觉好像还有其他我应该做的事情,而这些其他解决方案没有告诉我。
这是我的渲染器:
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
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来覆盖系统一个。
此外,当滚动结束时,值不能自动选择。我们需要在CustomPickerViewDelegate
中添加Selected
覆盖方法来为Control[=设置选择值29=](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];
}
}
}
效果:
我正在尝试在 Xamarin 表单中制作自定义渲染器,以便选择器中的文本将换行 IOS。 Android 工作正常。通过阅读,我似乎需要使用 UIPickerViewDelegate 来执行此操作。然而,当我这样做时……拾取器比以前更坏了,基本上不能用了。如果我使用委托,那么选择器会很好地呈现,但是当你 select 时。任何事物。它总是第一个被 selected 的项目。 Select 第 10 项,UI 显示第 1 项。 select 哪个项目并不重要。采摘者不知何故总是认为它是第一个。我没有做任何有意影响 selected 项目的事情。感觉好像还有其他我应该做的事情,而这些其他解决方案没有告诉我。
这是我的渲染器:
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
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来覆盖系统一个。
此外,当滚动结束时,值不能自动选择。我们需要在CustomPickerViewDelegate
中添加Selected
覆盖方法来为Control[=设置选择值29=](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];
}
}
}
效果: