Xamarin.iOS 自定义渲染器调用 SetNativeControl 的性能很慢
Posted
技术标签:
【中文标题】Xamarin.iOS 自定义渲染器调用 SetNativeControl 的性能很慢【英文标题】:Xamarin.iOS custom renderer calling SetNativeControl has a very slow performance 【发布时间】:2020-12-16 14:50:32 【问题描述】:我已经构建了一个自定义渲染器来获取 ios 上的 TableView,它使用来自 iOS 的 InsetGrouped
TableViewStyle。使用以下自定义控件和渲染器可以正常工作:
public class InsetGroupedTableView : TableView
public Action ForceUpdateView;
[assembly: ExportRenderer(typeof(InsetGroupedTableView), typeof(InsetGroupedTableViewRenderer))]
namespace MyApp.iOS.Renderers
public class InsetGroupedTableViewRenderer : TableViewRenderer
protected override void OnElementChanged(ElementChangedEventArgs<TableView> e)
base.OnElementChanged(e);
if (Control == null)
return;
var formsTableView = Element as InsetGroupedTableViewRenderer;
var groupTable = new UITableView(Control.Frame, UITableViewStyle.InsetGrouped);
groupTable.ContentInset = new UIEdgeInsets(-10, 0, 0, 0);
groupTable.Layer.CornerRadius = 20;
groupTable.Source = Control.Source;
SetNativeControl(groupTable);
formsTableView.ForceUpdateView += ForceUpdate;
private void ForceUpdate()
var groupTable = new UITableView(Control.Frame, UITableViewStyle.InsetGrouped);
groupTable.ContentInset = new UIEdgeInsets(-10, 0, 0, 0);
groupTable.Layer.CornerRadius = 20;
groupTable.Layer.MasksToBounds = true;
groupTable.Source = Control.Source;
SetNativeControl(groupTable);
Console.WriteLine("Finished");
但是,我的应用程序中有一些表格,我正在这些表格中即时生成TableSection
s。当我用新控件替换自定义渲染器中的表格时,显然 Xamarin.Forms 无法再更新我的表格了。但是,每当我更新表格时,我只是使用委托再次调用上面的相同代码。
这有什么问题吗?因为它的性能很糟糕。加载附加表大约需要 1.5 秒。我使用了一些秒表来查看上面的代码是否执行得很慢,但它确实很快,只是在调用上面的代码之后,显示新的 Section 需要很长时间。
有没有人知道是否有更好的方法来做到这一点?
【问题讨论】:
tablviewcell 是否有繁重的 UI 需要渲染? @JackHua-MSFT 大约 5-10 个视图单元格,其中大部分是标签和选取器。如果我有没有渲染器的表格,生成的部分会立即出现。 能否分享更多自定义渲染器中的代码? @JackHua-MSFT 我编辑了我的问题并输入了我的渲染器和自定义控件的完整代码。在我的共享代码中,我只是调用ForceUpdateView()
为什么需要在 ForceUpdateView 中再次调用 SetNativeControl。看起来它总是在设置 NativeControl。
【参考方案1】:
SetNativeControl
只能在自定义渲染器中调用一次。
再次调用这个方法完全没用,这也是它这么慢的原因。
【讨论】:
以上是关于Xamarin.iOS 自定义渲染器调用 SetNativeControl 的性能很慢的主要内容,如果未能解决你的问题,请参考以下文章
自定义标签渲染器在 Xamarin iOS 的滚动列表视图中显示错误的文本样式
Xamarin iOS Autolayout:自动调整各种设备的宽度和垂直滚动,同时保持水平滚动禁用演示链接