【发布时间】:2011-03-23 16:09:06
【问题描述】:
在我的应用程序中,我有许多小的子视图。当用户点击一个子视图时,我将一个单独的视图放在点击的子视图的顶部(相同大小),然后将这个单独的视图动画化为全屏大小。
放大视图是自定义绘制的,这给这种方法带来了很大的问题。如果我在主视图的 viewDidLoad 方法中创建放大视图并将其框架设置为全屏大小,则立即调用视图的 drawRect 方法,并且视图正确呈现全尺寸。如果我在动画中使用这个视图,一切都会按预期进行。
但是,我需要这个放大视图根据被点击的子视图而有所不同,所以我每次都需要重新创建/重新绘制它。问题是,当我为响应触摸事件执行此操作时,视图的 drawRect 方法在动画开始之前不会被调用,此时视图的框架很小而不是全屏,因此一切都是画错了。
在我的触摸事件代码中,我明确地将视图的框架设置为全屏并在开始动画之前调用setNeedsDisplay,但这没有任何效果 - 只是在动画开始之前不会调用drawRect。
有没有办法强制重绘,以便在视图的框架是我想要的大小时绘制视图?
【问题讨论】:
-
我相信乔在他的问题Is there a way to make drawRect work right NOW??! 中提出了类似的问题,Tom's answer 可能会实现您的目标。
-
@Brad:效果很好,谢谢。如果您将评论作为实际答案,我会选择它。这是有效的代码行:
[[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: [NSDate date]]; -
很高兴工作。我之所以发表评论,是因为我不太确定我是否理解您的要求,至于何时需要进行重绘。此外,
[CATransaction flush]可以做你想做的事,而不需要你操纵运行循环。但是,您应该在触发动画之前使用它,因为它可能会干扰它们。 -
@Joe:如果你能在我的 iPhone 问题出现时更加努力地回答它们,我实际上也许可以回到我的音乐软件上。 :)
-
在 setNeedsDisplay 在类似情况下为我工作后调用 [CATransaction flush]。