Force a UIView to redraw immediately, instead of during next run loop
I've created a UIImagePicker / camera view, with a toolbar and custom button for taking a snapshot. I can't really change to using the default way because of the custom button, and I'm drawing on top of the view.
When you hit the button, I want to take a screenshot using UIGetScreenImage(); how开发者_Python百科ever, the toolbar is showing up in the image, even if I hide it first:
//hide the toolbar
self.toolbar.hidden = YES;
// capture the screen pixels
CGImageRef screenCap = UIGetScreenImage();
I'm pretty sure this is because even though the toolbar is hidden, it gets redrawn once the function returns and we enter the next run loop - after UIGetScreenImage is called.
I tried making the following addition, but it didn't help:
//hide the toolbar
self.toolbar.hidden = YES;
[self.toolbar drawRect:CGRectMake(0, 0, 320, 52)];
// capture the screen pixels
CGImageRef screenCap = UIGetScreenImage();
I also tried using setNeedsDisplay, but that doesn't work either because once again the draw happens after the current function returns.
Any suggestions? Thanks!
The update is done in the run loop.
Simply add :
self.toolbar.hidden = YES;
[[NSRunLoop currentRunLoop] runUntilDate: [NSDate dateWithTimeIntervalSinceNow: 0.01]];
CGImageRef screenCap = UIGetScreenImage();
Try hiding the UI elements in a separate selector, and using the -performSelectorOnMainThread:withObject:waitUntilDone:
method, using YES
for the waitUntilDone
argument. Then follow that up with another selector for screen capture.
精彩评论