将 UIView 框架设置为等于 View.Frame 或 View.Bounds 不会使用整个屏幕

Posted

技术标签:

【中文标题】将 UIView 框架设置为等于 View.Frame 或 View.Bounds 不会使用整个屏幕【英文标题】:Setting UIView frame equal to View.Frame or View.Bounds doesn't use entire screen 【发布时间】:2018-07-30 17:13:19 【问题描述】:

我在 Xamarin.Forms 中创建了一个表单,然后在 Xamarin.ios 中使用 PageRenderer 使用 AVCaptureSession 显示实时摄像头源。我将UIView Frame 设置为等于 View.Frame,然后将子层 AVCaptureSessionPreviewLayer 添加到 UIView。在 iPhone 7 上进行测试时,Camera feed 占据了整个屏幕,但在 iPad 上进行测试时,camera feed 仅在中间,在左右两侧留有很大的余量,但在顶部或底部都没有。 调试设置的Bounds时,它们等于0、0、768、1024。即使x和y原点都是0,它也不会从左上角开始。

我该如何解决这个问题?有没有办法,而不是在后面的代码中创建一个全新的 UIView,我可以将 AVCaptureSessionPreviewLayer 设置为在 Xamarin.Forms 控件内显示?

更新:我添加了另一个控件并将原点设置为 0,0,它位于左上角。所以我会假设我添加一个子层是不正确的原点和宽度的原因。

【问题讨论】:

你什么时候画的?如果您在ViewDidLoadViewWillAppearViewDidLayoutSubviews 中执行相同的代码,您在绘图时可能会得到不同的结果,因为视图直到ViewWillAppear 才确定它的正确尺寸。需要注意的事情! 我尝试将初始化 UI 的代码从 ViewDidLoad 移动到 ViewWillAppear,但遗憾的是它没有改变任何东西。不过感谢您的建议! 【参考方案1】:

您需要将图层的框架设置为等于其超图层的边界,就像您对视图所做的那样。您应该在父视图的 layoutSubviews 方法中执行此操作,以便图层响应父视图中的任何自动布局大小更改。

【讨论】:

我将 UIView Frame 设置为等于 View.Frame。然后我将 AVCaptureVideoPreviewLayer 的 Frame 设置为 UIView.Frame。因此调试和检查 View.Frame 的值是 0、0、768、1024。UIView 和 CapturePreview 相同。这就是我卡住的原因。 设置Sublayer的Frame等于View.Frame效果一样 框架总是在superview/superlayer的坐标系中。边界是局部坐标系。即使在您的情况下它们可能巧合相同,但这并不总是正确的,因此它应该是 subview.frame = superview.bounds。但无论如何,您是否使用适合您的视频重力的方面? developer.apple.com/documentation/avfoundation/… 我没有使用 videoGravity。我在这里遵循了这个例子github.com/messier16/FullCameraPage。这在我的 iPhone 7 上测试时有效,但现在视图无法正常工作 也许另一个问题可以解决这个问题。有没有办法可以将 AVCameraPreview 设置为 Xamarin.Form 控件内的控件?然后我会有一个 XAML 布局,并且它会很容易地全部显示出来

以上是关于将 UIView 框架设置为等于 View.Frame 或 View.Bounds 不会使用整个屏幕的主要内容,如果未能解决你的问题,请参考以下文章

Swift - UIView 框架不等于 UIView.layer.frame

除非等于 UIView 框架,否则框架不会正确更改

UIView - 啥覆盖将允许更新 UIView 框架

UIView clearColor 的问题

如何设置UIView高度等于两个子视图UILabel的最大值?

如何设置 UIView 高度等于两个子视图 UILabel 的最大值?