Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何重新绘制UIView_Iphone_Objective C_Xcode_Cocoa Touch - Fatal编程技术网

Iphone 如何重新绘制UIView

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

在loadDidLoad控制器中,使用线程调用方法,如下所示:

- (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:下载后按程序进行看起来不错,但这不是正确的解决方案