Iphone 如何重新绘制UIView
在loadDidLoad控制器中,使用线程调用方法,如下所示:Iphone 如何重新绘制UIView,iphone,objective-c,xcode,cocoa-touch,Iphone,Objective C,Xcode,Cocoa Touch,在loadDidLoad控制器中,使用线程调用方法,如下所示: - (void)viewDidLoad { [super viewDidLoad]; NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(loadImages) object:nil]; [self.operationQueue addOperation
- (void)viewDidLoad {
[super viewDidLoad];
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(loadImages) object:nil];
[self.operationQueue addOperation:operation];
[operation release];
}
loadImages方法下载图像并显示:
- (void) loadImages {
@synchronized (self) {
// download image...
// ...
// and next:
UIImageView *imageView = [imageViews objectAtIndex:currentImageIndex];
[imageView performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:YES];
[imageView performSelectorOnMainThread:@selector(setImage:) withObject:[UIImage imageWithData:imageData] waitUntilDone:YES];
}
//...
}
如果第一次显示视图,下一次我必须旋转iphone来显示图像。
为什么视图不重画
我根据以下建议尝试了此代码:
// imageButton is a UIView with button, image and label
NSData *imageData = [[HttpClient sharedInstance] getResourceWithCache:thumbPath];
[imageButton performSelectorOnMainThread:@selector(setImage:) withObject:[UIImage imageWithData:imageData] waitUntilDone:YES];
[imageButton performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:YES];
[imageButton drawRect:imageButton.frame];
但是不要工作。我假设
loadDidLoad
是一个打字错误,你的意思是viewDidLoad
视图控制器加载完成后,将调用viewDidLoad
方法。它只执行一次,除非应用程序收到内存警告并且视图控制器卸载
如果保留视图控制器,然后再次显示相同的视图控制器对象,则不会再次调用viewDidLoad
方法
如果每次将视图控制器推到视图堆栈上时都需要执行操作,则可以使用
viewwillbeen:
或viewdidebeen:
我假设loadDidLoad
是一个输入错误,您的意思是viewDidLoad
视图控制器加载完成后,将调用viewDidLoad
方法。它只执行一次,除非应用程序收到内存警告并且视图控制器卸载
如果保留视图控制器,然后再次显示相同的视图控制器对象,则不会再次调用viewDidLoad
方法
如果每次将视图控制器推到视图堆栈上时都需要执行操作,则可以使用
viewwillbeen:
或viewdidebeen:
您的问题就在眼前
[imageView performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:YES];
[imageView performSelectorOnMainThread:@selector(setNeedsDisplay),对象:nil waitUntilDone:YES];
您需要在self.view而不是self上调用setNeedsDisplay,因为这是UIView而不是UIViewController的方法
通过对视图进行子类化并在drawRect:中放置一个断点来仔细检查这一点,因为setNeedsDisplay必须调用drawRect。您的问题就在眼前 [imageView performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:YES]; [imageView performSelectorOnMainThread:@selector(setNeedsDisplay),对象:nil waitUntilDone:YES]; 您需要在self.view而不是self上调用setNeedsDisplay,因为这是UIView而不是UIViewController的方法
通过对视图进行子类化并在drawRect:(因为setNeedsDisplay必须调用drawRect)中放置断点来再次检查此问题。如果先设置图像,然后执行setNeedsDisplay,会发生什么情况?您还正在同步什么?这是非常危险的,尤其是在下载等长时间操作的情况下。使用调试器-在第二次或第三次运行时附加断点并启用它,然后检查整个loadImages代码。现在我无法检查如果更改调用选择器的顺序会发生什么,我认为它不起作用,但我会尝试。如果有人能给我演示示例代码,在将图像设置为视图后如何从线程重新绘制视图和子视图,我将不胜感激。如果先设置图像,然后进行设置需要显示,会发生什么情况?您还正在同步什么?这是非常危险的,尤其是在下载等长时间操作的情况下。使用调试器-在第二次或第三次运行时附加断点并启用它,然后检查整个loadImages代码。现在我无法检查如果更改调用选择器的顺序会发生什么,我认为它不起作用,但我会尝试。如果有人能给我演示示例代码,在将图像设置为视图后,如何从线程中重画视图和子视图,我将不胜感激。viewDidLoad和线程运行,但视图在我旋转iphone之前不会重画。根据建议,我尝试调用loadImages from views将显示,但相同的行为,视图在长时间后或在旋转iPhone后被重新绘制您确定下载图像不会花费很长时间吗?如果调用应自动旋转指针FaceOrientation:下载后按程序进行外观良好,但这并不是正确的解决方案ViewDidLoad和ThreadRun,但在我旋转iphone之前视图不会重新绘制。根据建议,我尝试调用loadImages from views将显示,但相同的行为,视图在长时间后或在旋转iPhone后重新绘制。你确定下载图像不会花费很长时间吗?如果调用应自动旋转指针FaceOrientation:下载后按程序进行看起来不错,但这不是正确的解决方案