如何强制视图渲染自己?

Mus*_*sis 14 iphone ios

在我的应用程序中,我有一些小的子视图.当用户点击子视图时,我会在点击的子视图(相同大小)的顶部放置一个单独的视图,然后将此单独视图设置为全屏大小.

放大视图是自定义绘制的,这对这种方法造成了很大的问题.如果我在主视图的viewDidLoad方法中创建放大视图并将其框架设置为全屏大小,drawRect则立即调用视图的方法,并且视图正确呈现为全尺寸.如果我然后在动画中使用此视图,一切都按预期工作.

但是,我需要这个放大视图根据所拍摄的子视图而有所不同,所以我需要每次重新创建/重新绘制它.问题是当我这样做以响应触摸事件时,视图的drawRect方法在动画开始之前不会被调用,此时视图的帧很小而不是全屏,因此一切都被绘制错误.

在我的触摸事件代码中,我明确地将视图的帧设置为全屏并setNeedsDisplay在开始动画之前调用,但这没有任何效果 - drawRect直到动画开始才调用.

有没有办法强制重绘,以便绘制视图,而其框架是我想要的大小?

Bra*_*son 25

正如我上面的评论,乔问类似的(作为一个更普遍的问题)的东西在这里,到汤姆·斯威夫特给出了一个答案操纵当前运行的循环.

他的建议是在-setNeedsDisplay使用以下代码调用后立即强制运行循环完成一次迭代:

[[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: [NSDate date]];
Run Code Online (Sandbox Code Playgroud)

这种方法有一些注意事项,在那里的评论中讨论过.

此外,有人指出

[CATransaction flush];
Run Code Online (Sandbox Code Playgroud)

也可以实现强制立即重绘视图的相同效果.

  • `[CATransaction flush];`也适合我. (2认同)