【问题标题】:Xamarin forms FlowListView iOS - how to ensure FlowItemDisappearing / FlowItemAppearing for every element in UIView ViewRendererXamarin 形成 FlowListView iOS - 如何确保 UIView ViewRenderer 中每个元素的 FlowItemDisappearing / FlowItemAppearing
【发布时间】:2021-01-28 09:29:07
【问题描述】:

我们的 Xamarin 表单应用使用 FlowListView 显示视频矩阵,使用自定义渲染器。

在Android应用程序中,当改变矩阵视图的大小时,每个视图元素/单元格,无论大小,都一致地先执行FlowItemDisappearing,然后执行FlowItemAppearing。效果很好。

iOS 应用程序的行为不同,只有矩阵视图中的一些元素会消失和出现。如何将此行为更改为与 Android 应用相同的行为?

在我的 iOS 应用程序中,我将渲染器中 OnElementChanged 中的事件与 FlowItemDisappearing 和 FlowItemAppearing 中的事件进行了比较,发现它们之间存在差异。例如,将矩阵大小从 3x3 更改为 1,然后从 1 更改为 3x3 后,观察到以下情况: 在 OnElementChanged 中: 3x3-1:删除第一行,添加新元素1,OK

1-3x3:在第 3 行重新创建元素 6-9。问题: 1. 不需要更新第三行; 2.元素2和3的句柄没有更新,剩下0个。

3x3-1:删除第 2 行的元素。视频在单视图中播放正常。但问题是现在元素 2-6 的句柄变为 0。这将是下一个转换 1-9 的问题。

在FlowListItem中出现/消失的事件:

3x3-1:视图索引 0-2 消失并出现 0(新元素 1),正确

1-3x3: -(3-5), +(0-2), -(6,8), +(3-5), +(6-8),这表示第 1 行中的新元素,在第 2 行和第 3 行重新创建元素。问题:它与 OnElementChanged 中的事件不匹配。似乎 OnElementChanged 错过了事件。

3x3-1:-(0-2),+(0) 新元素 1,正确

我的问题是子视图的句柄最终会不同步。如果新矩阵中的每个视图元素/单元格消失然后出现,则完全没有问题。每个图块都会被刷新。

【问题讨论】:

标签: ios listview xamarin.forms


【解决方案1】:

在不知道 ViewRenderer 的代码的情况下,您可以尝试覆盖 UIViewController 的 ViewDidLayoutSubviews 方法。

这个方法在这个UIViewController的视图布局了它的子视图之后被调用(当Bounds属性被修改时发生)。

示例代码如下:

public override void ViewDidLayoutSubviews()
{
    base.ViewDidLayoutSubviews();

    // update View
}

==============================更新================= =============

很抱歉混淆了 ViewRenderer 和 PageRenderer。 ViewRenderer 不是 UIViewController 的子类,因此它们将无法覆盖 ViewRenderer 子类中的 ViewDidLayoutSubViews 方法,只能在直接或间接继承自 UIViewController 的类。 ViewRenderer 间接继承自 UIView,它有一个虚拟的LayoutSubviews 方法,他们可以尝试。

因此,您可以尝试以下代码:

public override void LayoutSubviews()
{
    base.LayoutSubviews();
 // update View
}

【讨论】:

  • 看来我无法在 ViewRenderer 中执行以下操作:[Foundation.Export("viewDidLayoutSubviews")] public override void ViewDidLayoutSubviews() { base.ViewDidLayoutSubviews(); // 更新视图 } 错误信息 VideoRender.cs(30,30): Error CS0115: 'VideoRender.ViewDidLayoutSubviews()': no appropriate method found to override (CS0115)
  • @HongWang 您好,您在 ViewRender 中使用的是[Foundation.Export("viewDidLayoutSubviews")],为什么不使用override void ViewDidLayoutSubviews() 来做。
  • 嗨,最初我只是使用了没有导出属性的代码,同样的错误发生了“找不到合适的方法来覆盖”。可能缺少什么? VS IntelliSense 显示 this.ViewDidLayoutSubviews 可用。
  • @HongWang Okey,您只需键入 override,方法列表将显示在 Visual Studio 中。您可以在此处与我的共享代码共享错误屏幕截图。
  • 截图上传到本页顶部的问题中。
【解决方案2】:

最后,我们使用了workaround。 似乎使用 4 个单独的播放窗口句柄列表(每个矩阵大小一个)可以克服句柄管理问题。通过清除列表中的句柄来特殊处理单个视图,因为句柄将始终被删除并重新创建。

【讨论】:

    猜你喜欢
    • 2017-05-17
    • 1970-01-01
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多