我的UIImage已加载但未出现在屏幕上

时间:2014-02-11 14:08:38

标签: ios objective-c uiimageview 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的位置,现在它位于屏幕的中间,所以我可以确定它是在设备的视图。

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

你这么说:

  

图像对象不是nil,但brightnessImageView保持无效。

当然,您需要首先创建图像视图,然后才能设置图像。在您的情况下最简单的可能是创建它并一次设置其图像,然后将其添加到您的视图中:

self.luminanceImageView = [[UIImageView alloc] initWithImage:image];
[self.view addSubview:self.luminanceImageView];
编辑(在查看GitHub之后): 您目前设置了如下视图:

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

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

  1. 我仍然需要将brightnessImageView添加到您的视图中 已经在上面说过了
  2. 普通的init创建了一个imageView 大小(0,0)。这与initWithImage:不同,它创建了一个具有图像大小的imageView。
  3. setImage:不调整imageView的大小。来自 UIWebView documentation
  4.   

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

    如果您已在XIB中正确设置了imageView及其大小,那么请忽略其他所有内容,然后执行以下操作:

    [self.luminanceImageView setImage:image];
    

    如果尺寸不正确,请按照以下步骤操作:

    [self.luminanceImageView sizeToFit];
    

    编辑(调试代码后):

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

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

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