2014-02-11 45 views
2

我正在写一个应用程序,通过不同的条件改变图像。当我调试所有设置,但我没有看到我的屏幕上的图像。任何人都可以帮我吗?我的UIImage被加载,但没有出现在屏幕上

-(void)setLuminanceImageSource 

{ 
    self.luminanceImageView.image = nil; 
    UIImage *image; 
    switch (self.luminanceImageSource) { 
     case FULL_LIGHT: 
      image = [UIImage imageNamed:@"belichting-goed"]; 
      [self.luminanceImageView setImage:image]; 
      NSLog(@"full"); 
      break; 
     case HALF_LIGHT: 
      image = [UIImage imageNamed:@"belichting-matig"]; 
      [self.luminanceImageView setImage:image]; 
      NSLog(@"half"); 
      break; 
     case BAD_LIGHT: 
      image= [UIImage imageNamed:@"belichting-slecht"]; 
      [self.luminanceImageView setImage:image]; 
      NSLog(@"bad"); 
      break; 
     default: 
      image = [UIImage imageNamed:@"belichting-goed"]; 
      break; 
    } 
    [self.luminanceImageView setImage:image]; 
    [self.luminanceImageView setNeedsDisplay]; 
    [self.view addSubview:self.luminanceImageView]; 
    [self.view bringSubviewToFront:self.luminanceImageView]; 
} 

这是我的方法来控制图像。我在.xib文件中有一个UIImageView,当我运行该应用程序时,我看到了在属性检查器中选择的图像,但在调用此方法时它会消失。

编辑:我已经改变了传统的命名风格的名称。

这是我的调试控制台,图像对象不是零,但luminanceImageView保持nildebug-console

我已经创建了一个github仓库,我克隆了我的项目,以便您可以看到我的代码。 CameraApp repository 唯一的区别是luminaceImageView的位置,现在它位于屏幕的中间,所以我可以确定它是在设备的视图中。

+0

检查您的图像名称扩展名..是否是'png'?或不 ? – iPatel

+0

为什么你这样称呼[self.luminanceImage setNeedsDisplay];如果您调用setNeedsDisplay,则UIImageView类(及其子类)不会调用drawRect。这就是为什么你没有得到你的imageview框架 – Pawan

+0

@iPatel,是的。我应该把这个名字放在名字后面吗?编辑:我用这个选项,仍然没有图像.. – Woudwijk84

回答

0

你说:

图像目标是不为零,但luminanceImageView保持为零。

当然,您需要先创建图像视图,然后才能设置其图像。你的情况,最简单的可能是创建它,并一气呵成设置它的图像,然后将其添加到您的视图: 您当前设置的观点是这样的:

self.luminanceImageView = [[UIImageView alloc] initWithImage:image]; 
[self.view addSubview:self.luminanceImageView]; 

EDIT(查看GitHub的后) :

self.luminanceImageView = [[UIImageView alloc] init]; 
[self.luminanceImageView setImage:image]; 

这意味着如果你在xib中设置它(我没有检查过),那么你在这里覆盖它。 有三个问题是:

  1. 的luminanceImageView仍然需要添加到您的看法,因为我 上面已经
  2. 指出平原初始化与 大小创建一个ImageView的(0,0)。这与initWithImage不同:它创建一个具有图像大小的imageView。
  3. setImage:不会调整imageView的大小。从 UIWebView documentation

设置图像属性不会改变一个UIImageView的大小。调用sizeToFit来调整视图的大小以匹配图像。

如果您已正确设置其在XIB大小ImageView的,然后离开了一切,只是做:

[self.luminanceImageView setImage:image]; 

如果大小是不正确的,然后按照这个:

[self.luminanceImageView sizeToFit]; 

EDIT(调试代码后):

你的问题是,你从后台线程设置图像。 iOS中几乎所有的视图操作都需要从主线程完成。这样做可以解决您的问题:

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self.luminanceImageView setImage:image]; 
    [self.view bringSubviewToFront:self.luminanceImageView]; 
}); 

顺便说一句,您还可以在代码中更改self.layer。这可能不是一个好主意,以后可能会导致问题。为相机使用单独的视图,并使用[cameraView.layer addSublayer:newLayer]来解决这个问题。

+0

感谢您的回复。我尝试了你的解决方案,但它不适合我。不过谢谢。 – Woudwijk84

+0

当然,您仍然需要将它添加到您的视图中,而您将在示例代码中显示该视图,但不能在控制台图片中显示,因此您不清楚实际上在做什么。或者你的意思是说,self.luminanaceImageView仍然是零后? – fishinear

+0

我在'.xib'文件中创建'luminanceImageView',将它连接到正确的视图。我不知道我是如何做到的,但对象不再是'无',但我仍然无法在我的屏幕上看到它。我已经将我的项目添加到了上面问题中添加的github存储库,以便您可以看到我的代码。 – Woudwijk84

0

试试这个编辑从您的代码

-(void)setLuminanceImageSource 
{ 
[self.sess stopRunning]; 
//[self.layer removeFromSuperlayer]; 

UIImage *image; 
switch (self.luminanceImageSource) { 
    case FULL_LIGHT: 
    { 
     image = [UIImage imageNamed:@"belichting-goed.png"]; 
     NSLog(@"full"); 
     break; 
    } 
    case HALF_LIGHT: 
    { 
     image = [UIImage imageNamed:@"belichting-matig.png"]; 
     NSLog(@"half"); 
     break; 
    } 
    case BAD_LIGHT: 
    { 
     image= [UIImage imageNamed:@"belichting-slecht.png"]; 
     NSLog(@"bad"); 
     break; 
    } 
    default: 
    { 
     image = [UIImage imageNamed:@"belichting-goed.png"]; 
     break; 
    } 
} 
[self.luminanceImageView setImage:image]; 
[self.layer addSublayer: self.luminanceImageView.layer]; 
//[self.view bringSubviewToFront:self.luminanceImageView]; 
// NSLog(@"%@", self.luminanceImageView.image); 
// NSLog(@"lumi X:%f, Y:%f", self.luminanceImageView.frame.origin.x, self.luminanceImageView.frame.origin.y); 
// NSLog(@"view X:%f, Y:%f",self.view.frame.origin.x, self.view.frame.origin.y); 
// NSLog(@"window %@", self.view.window); 
} 
+0

我唯一的意见是在最后一条语句之前添加日志或断言,以确保映像不是零。也可以使用更直接的说法:'自我。 luminanceImage = image;' - 更现代的语法。 –

+0

@DavidH luminanceImage(错误的命名约定)是一个UIImageView。所以它应该是self.luminanceImage.image = image; – Pawan

+0

@DavidH,我用调试器来检查它是否为零,它不是零。点击调试控制台中变量的眼睛图标时,我甚至可以看到正确的图像。 – Woudwijk84

相关问题