iOS UIView派生的视图实例drawRect被调用但未在屏幕上更新?

时间:2014-09-01 10:42:12

标签: ios objective-c iphone uiview

希望有人可以帮忙吗?我已经浏览了论坛和苹果文档,找不到任何与我的问题完全匹配的内容。

我正在尝试通过更改自定义颜色属性(标准视图属性之一,如center,alpha,backgroundColour等)为自定义'Composite'UIView派生类(使用overover drawRect)设置动画效果),调用setNeedsDisplay并使用drawRect在X秒持续时间内重绘视图,以产生从红色到蓝色的缓慢颜色变化。

目前,所有Composite :: drawRect都在内部清除上下文(视图的默认背景颜色设置为clear),并使用提供的颜色填充视图。这在第一次调用时工作正常 - 视图以正确的红色显示在屏幕上。

我的问题是,当我尝试通过更新color属性为视图设置动画时,即使每次调用setNeedsDisplay时调用drawRect并且输入到视图实例的颜色正确,视图也不会更新在屏幕上直到我停止调用setNeedsDisplay(或者更确切地说,停止更新自定义视图颜色属性)。这就像每次调用setNeedsDisplay都会将视图推送到列表的后面,这样它就不会在屏幕上更新,直到它被停止调用(即使调用了drawRect)。

例如 - 尝试在10秒内将颜色从红色更改为蓝色,视图保持红色10秒,然后在属性更改结束时在单个帧中变为蓝色(可能是当我停止调用setNeedsDisplay时而不是在两个持续时间内缓慢淡出。

任何想法发生了什么?我猜我需要使用苹果公司自己的动画属性来制作动画,但我真的不愿意 - 如果可能的话,我试图制作这个跨平台,我不明白为什么我自己的方法不起作用。

基础知识:

如果重要,我的复合视图实例是UIImageView的子视图。 (我知道imageview drawRect没有被调用,但我无法想象这是它的子视图的问题 - 毕竟,我的Composite :: drawRect肯定被调用了。)

我在我的视图实例上设置了正确的颜色 - 我已经调试了这个以确保 - 所以提供给视图的颜色在很多秒/帧之间从红色变为蓝色。

我正在设置setNeedsDispay并且每次调用drawRect - 再次,调试打印确认了这一点。

这发生在多个框架上,应用程序在每个帧的结尾处经历了绘图更新 - 即我没有阻止渲染线程或任何东西 - 应用程序运行良好,它只是不更新​​视图屏幕即使正在调用drawRect,直到我停止操作属性。有人提到了一个类似的问题,他们在一个帧中阻止渲染线程,但我绝对不会做那样的事情。

我已尝试弄乱以下内容,但它们都产生了相同的结果(即视图在单帧中从红色变为蓝色而不是缓慢变化)。

  • 每帧更新颜色,但每隔第X帧(5,10,20,30等)只在我的视图上调用setNeedsDisplay

  • 每帧更新颜色但不调用setNeedsDisplay,除非从最后一个setNeedsDisplay发出相应的drawRect调用(即在SetColour func中将标志设置为false,在drawRect中将相同标志设置为true,在决定时对其进行测试调用setNeedsDisplay) - 结果相同。

  • 设置视图边界,将ContentMode设置为重绘以强制更新 - 结果相同

  • 尝试在父图像视图上调用setNeedsDisplay - 没有变化。

我猜这是不可能的 - 有人可以解释为什么即使正在调用drawRect,它也不会更新屏幕上的v视图?任何想法我应该怎么做?如果我使用苹果的内部动画系统尝试动画的默认视图属性之一,但是如果我必须使用它,我认为我不能做我想做的事情。

谢谢!

: - )

0 个答案:

没有答案