Xamarin 在某些情况下形成 iOS UIView Renderer 间歇性 OnElementChanged
Posted
技术标签:
【中文标题】Xamarin 在某些情况下形成 iOS UIView Renderer 间歇性 OnElementChanged【英文标题】:Xamarin forms iOS UIView Renderer intermittent OnElementChanged in some cases 【发布时间】:2020-07-27 01:37:41 【问题描述】:我正在使用 FlowListView 进行视频矩阵视图(1x1-2x2-3x3 视图)。对于 ios 应用,UIView 渲染器用于与第三方视频 SDK 集成。 这是 FlowListView。
<flv:FlowListView x:Name="VideoFlowList" FlowColumnCount="Binding ColumnCount" RowHeight="Binding RowHeight, Mode=TwoWay"
SeparatorVisibility="None" HasUnevenRows="false" BackgroundColor="Transparent"
FlowColumnMinWidth="80" FlowTotalRecords="Binding TotalRecords, Mode=TwoWay" FlowItemsSource="Binding Items">
<flv:FlowListView.FlowColumnTemplate>
<DataTemplate>
<Grid x:Name="VideoGrid" Padding="2" BackgroundColor="Binding SelectedBorderColour, Mode=TwoWay" RowSpacing="1" ColumnSpacing="1">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<video:CameraView x:Name="MyCameraView" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" BackgroundColor="Black" />
<Image x:Name="AddIcon" Source="panel_add.png" Grid.Row="0" Grid.Column="0" IsVisible="Binding CameraNotAssigned"
HorizontalOptions="Center" VerticalOptions="Center" Aspect="AspectFit" BackgroundColor="Transparent" WidthRequest="50" HeightRequest="50">
<Image.GestureRecognizers>
<TapGestureRecognizer Command="Binding BindingContext.AddCameraCommand, Source=x:Reference BrowseItemsPage"
CommandParameter="x:Reference VideoGrid" NumberOfTapsRequired="1" />
</Image.GestureRecognizers>
</Image>
<Label x:Name="Label" HorizontalOptions="Fill" HorizontalTextAlignment="Center" VerticalOptions="End"
BackgroundColor="Silver" Opacity="0.5" Text="Binding CameraName, Mode=TwoWay" TextColor="Black"/>
</Grid>
</DataTemplate>
</flv:FlowListView.FlowColumnTemplate>
</flv:FlowListView>
在矩阵视图启动时,它会显示 4 个视图(视图模型中的 ColumnCount = 2,ToTalRecords = 4)并且每次都有效。切换到任何其他视图也可以。但偶尔从单个视图切换到 4 个视图时,只有 2 个新元素,而不是覆盖的 OnElementChanged 中的 4 个。如何保证每次都能获得4个新元素?
请注意,从 9 个视图切换到 4 个视图时不会出现此问题。
这是 ViewRenderer 的代码。
public class VideoRender : ViewRenderer<CameraView, UIVideoView>
private UIVideoView _videoView;
protected override void OnElementChanged(ElementChangedEventArgs<CameraView> e)
base.OnElementChanged(e);
if (e.OldElement != null)
//Unsubscribe
_videoView.Tapped -= OnVideoViewTapped;
Log.Debug($"OldElement CameraIndex e.OldElement.CameraIndex, PlayWndHandle e.OldElement.PlayWndHandle");
if (e.NewElement != null)
//Control is TNativeView, CameraView
if (Control == null)
_videoView = new UIVideoView(Element);
SetNativeControl(_videoView);
//Element.PlayWndHandle = Handle;
if (_videoView.Subviews.Length > 0)
Element.PlayWndHandle = _videoView.Subviews[0].Handle;
App.PlayWndHandles.Add(Element.PlayWndHandle);
Log.Debug($"NewElement CameraIndex Element.CameraIndex, PlayWndHandle Element.PlayWndHandle");
Log.Debug($"App.PlayWndHandles[App.PlayWndHandles.Count - 1]: Element.PlayWndHandle");
// Subscribe
_videoView.Tapped += OnVideoViewTapped;
I added a subview in the UIView UIVideoView and play the video in the subview. Is the issue related to the way I use the subview?
void Initialize()
//place the video in subview
var subView = new UIView();
subView.UserInteractionEnabled = true;
AddSubview(subView);
if (Subviews.Length > 0)
Subviews[0].Frame = new CoreGraphics.CGRect(0, 0, 100, 100);
【问题讨论】:
偶尔在从单个视图切换到 4 个视图时,只有 2 个新元素,而不是覆盖的 OnElementChanged 中的 4 个。查看日志。 2020-07-27 12:12:56.PM [调试] OldElement CameraIndex -1,PlayWndHandle 4843540768 2020-07-27 12:12:56.PM [调试] NewElement CameraIndex -1,PlayWndHandle 4640845024 2020-07-27 12 :12:56.PM [DEBUG] App.PlayWndHandles[0]: 4640845024 2020-07-27 12:12:56.PM [DEBUG] NewElement CameraIndex -1,PlayWndHandle 4471035856 2020-07-27 12:12:56。 PM [调试] App.PlayWndHandles[1]: 4471035856 方法OnElementChanged
只会在元素加载时被调用一次。所以如果它已经存在就不会被调用。因此,当您从单个视图切换到 4 个视图时,您可以重新初始化元素。
@Lucas Zhang 谢谢你的建议。我使用了以下解决方法。从单视图切换到 4 个视图时,我先初始化 9 个元素,然后将其减少到 4 个元素。它似乎工作。我不知道为什么只是初始化 4 个元素总是有 2 个新元素更改事件而不是 4 个。在真正的应用程序中。我也有 16 个视图。切换到/从任何其他视图大小始终按预期工作。
@Lucas Zhang 为了更好地理解这个问题,相应的 android 应用截图可能会给你一些想法。请参阅下面的链接。我想让您知道相应的Android应用程序没有这个问题。但它有一个不同的问题,请参阅***.com/questions/63130934/…。你有什么建议吗?
由于它们是不同的问题,我稍后会检查它。对于这个问题,如果你解决了,我会发布答案,你可以接受。
【参考方案1】:
似乎使用 4 个单独的播放窗口句柄列表(每个矩阵大小一个)可以克服句柄管理问题。通过清除列表中的句柄来特殊处理单个视图,因为句柄将始终被删除并重新创建。
【讨论】:
以上是关于Xamarin 在某些情况下形成 iOS UIView Renderer 间歇性 OnElementChanged的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 StoryBoards 的情况下使用 UITableViewController 在 Xamarin.iOs 中实现 UISearchController?