StackView中的AvPlayer

时间:2018-01-07 21:18:29

标签: xamarin.ios avplayer stackview

我有一个垂直StackView按顺序包含一个UILabel和一组UIButton(由于水平StackView而成为可能)。 我需要使用AVPlayer在UILabel和UIButtons之间插入视频作为第二个元素。

你能告诉我最好的方法吗?我尝试使用泛型UIView并传递给它框架和子层,但它不起作用。 我正在使用Xamarin iOS / tvOS(所以在C#中),但我可以在Swift中阅读示例

由于

更新

最后的问题是关于使用错误的uiview框架。

我通过iOS设计器设置我的布局结构,而不是按照建议的方式编程,但感谢@land用户提供这些代码行:

contentView.Layer.AddSublayer(playerLayer);
//update its frame immediately
contentView.LayoutIfNeeded();
playerLayer.Frame = contentView.Bounds;

Lewix

1 个答案:

答案 0 :(得分:1)

您可以尝试创建UIView以显示AVPlayerLayer并设置其位置以布置AVPlayer。我们可以将此contentView放在StackView中,也可以放在ViewController视图中的StackView之外。

我建议将此视图直接放在ViewController的View中,以便我们可以使用autolayout来布局它。

首先,我创建一个UIView,其顶部约束等于您的Vertical StackView的底部约束和底部约束等于您的水平StackView的顶部约束,如:

UIView contentView = new UIView();
contentView.TranslatesAutoresizingMaskIntoConstraints = false;
View.AddSubview(contentView);

NSLayoutConstraint topConstraint = NSLayoutConstraint.Create(contentView, NSLayoutAttribute.Top, NSLayoutRelation.Equal, VerticalStackView, NSLayoutAttribute.Bottom, 1, 0);
NSLayoutConstraint leadConstraint = NSLayoutConstraint.Create(contentView, NSLayoutAttribute.Leading, NSLayoutRelation.Equal, View, NSLayoutAttribute.Leading, 1, 0);
NSLayoutConstraint trailConstraint = NSLayoutConstraint.Create(contentView, NSLayoutAttribute.Trailing, NSLayoutRelation.Equal, View, NSLayoutAttribute.Trailing, 1, 0);
NSLayoutConstraint heightConstraint = NSLayoutConstraint.Create(contentView, NSLayoutAttribute.Height, NSLayoutRelation.Equal, null, NSLayoutAttribute.NoAttribute, 0, 100);
NSLayoutConstraint bottomConstraint = NSLayoutConstraint.Create(contentView, NSLayoutAttribute.Bottom, NSLayoutRelation.Equal, HorizontalStackView, NSLayoutAttribute.Top, 1, 0);

View.AddConstraints(new NSLayoutConstraint[] { topConstraint, leadConstraint, trailConstraint, bottomConstraint });
contentView.AddConstraint(heightConstraint);

然后你可以把你的AVPlayerLayer放在这个视图中,让它的框架等于这个视图:

AVPlayerItem playerItem = new AVPlayerItem(new NSUrl(NSBundle.MainBundle.PathForResource("test.mp4", null), false));
aVPlayer = new AVPlayer(playerItem);
AVPlayerLayer playerLayer = AVPlayerLayer.FromPlayer(aVPlayer);

contentView.Layer.AddSublayer(playerLayer);
//update its frame immediately
contentView.LayoutIfNeeded();
playerLayer.Frame = contentView.Bounds;

如果你想在StackView中实现这一点。只需将contentView放入StackView并设置其高度约束即可显示AVPlayer。