ios – GLKit的-drawRect:在屏幕旋转期间不调用

ios – GLKit的-drawRect:在屏幕旋转期间不调用,第1张

概述我有基于GLKit的应用程序,显示一些简单的对象. 一切正常,除了屏幕旋转,GLKView没有更新(-drawRect:未被调用).因此,在旋转期间,投影矩阵不会根据动态变化的屏幕尺寸进行更新,并且对象看起来很糟糕(拉伸). 这根本不是UIKit动画的工作方式.我有点解释它的一半在 this answer中是如何工作的,但我会尝试总结一下相关的部分: >一切都是带纹理的矩形. (有一些例外,比如C 我有基于GLKit的应用程序,显示一些简单的对象.

一切正常,除了屏幕旋转,GLKVIEw没有更新(-drawRect:未被调用).因此,在旋转期间,投影矩阵不会根据动态变化的屏幕尺寸进行更新,并且对象看起来很糟糕(拉伸).

解决方法 这根本不是UIKit动画的工作方式.我有点解释它的一半在 this answer中是如何工作的,但我会尝试总结一下相关的部分:

>一切都是带纹理的矩形. (有一些例外,比如CAShapeLayer,但在大多数情况下都是如此.)
> UIVIEw的属性链接到CALayer的“模型树”属性.他们瞬间改变.
>动画的工作原理是将“演示树”属性从起始值设置为当前模型值.
>默认情况下,动画的起始值是先前的模型值.指定UIVIEwAnimationoptionBeginFromCurrentState使其使用当前表示值.

当然,有一些例外(CAShapeLayer似乎不仅仅是纹理矩形,UIScrollVIEw在定时器上滚动动画,UIVIEw转换完全是另一回事……).

旋转应该如何工作是你得到一个单一的-setFrame :,所有内容都被布局(并且可能被重新渲染),然后动画属性被动画化.默认情况下,这意味着事物将重新渲染到新维度,但会拉伸以适应旧维度,然后随着旋转的进展动画(和不拉伸).

也就是说,GLKVIEw可能会有不同的工作方式.如果你正在使用GLKVIEwController,它甚至可能在旋转动画期间暂停渲染.您可以尝试在旋转期间调用-setNeedsdisplay,但由于帧已经设置为其最终值,因此它不会有太大帮助.

可能自己处理旋转动画的最简单方法是强制将非动画重新布局到旋转帧,然后在渲染器中做一些捏造(黑色边框和状态栏分别进行动画处理).

或者,传统的方法是让您的VC仅限肖像并自己处理设备方向通知,但这是一大堆蠕虫(然后您必须担心状态栏方向,这决定了触摸偏移和键盘方向等因素,当转换到其他VC或从其他VC转换时,它倾向于“有趣地”交互.

总结

以上是内存溢出为你收集整理的ios – GLKit的-drawRect:在屏幕旋转期间不调用全部内容,希望文章能够帮你解决ios – GLKit的-drawRect:在屏幕旋转期间不调用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1074422.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存