UIImageView仅在我调用initWithImage时显示

Kev*_*_TA 2 iphone xcode objective-c uiimageview uiimage

出于某种原因,我只能在每次迭代时使用不同的图像分配/初始化时显示UIImageView.奇怪的是我知道正在加载图像数据,因为我正在对图像运行处理并且处理按预期工作.简而言之,这是我尝试的两种方法:

// interface
@interface ViewController : UIViewController <UIAlertViewDelegate>
{

    UIImageView *imageView;

}

@property (nonatomic, retain) UIImageView *imageView;

@end

// implementation
@implementation ViewController

@synthesize imageView;

//...

- (void) loadAndDisplayImage {

    // Load testing image
    UIImage *testImg;
    testImg = [UIImage imageNamed:@"Test.png"];

    self.imageView = [[UIImageView alloc] initWithImage:testImg];

    //size of imageView rect
    CGRect frame = self.imageView.frame;
    int ivw = frame.size.width;
    int ivh = frame.size.height;

    //...

}

@end
Run Code Online (Sandbox Code Playgroud)

当我用这个方法self.imageView = [[UIImageView alloc] initWithImage:testImg];ivw,并ivh具有有效的值并显示图像.但是,如果我将实现更改为:

// implementation
@implementation ViewController

@synthesize imageView;

//...

- (void) viewDidLoad {

    self.imageView = [[UIImageView alloc] init];
    [self loadAndDisplayImage];

}

- (void) loadAndDisplayImage {

    // Load testing image
    UIImage *testImg;
    testImg = [UIImage imageNamed:@"Test.png"];

    self.imageView.image = testImg;

    //size of imageView rect
    CGRect frame = self.imageView.frame;
    int ivw = frame.size.width;
    int ivh = frame.size.height;

    //...

}

@end
Run Code Online (Sandbox Code Playgroud)

在我使用设置图像的地方self.imageView.image = testImg;,值ivwivh都是零,没有显示图像,但对图像的后续处理仍然是准确的.在这两种情况下,我都将图像发送到使用处理[self doRecognizeImage:self.imageView.image];.我无法弄清楚这是怎么可能的.如果在无法显示图像时处理失败,对我来说会更有意义.

想法?谢谢.

occ*_*lus 7

问题是,当您image在已初始化时设置属性时UIImageView,帧大小不会更新以匹配新的图像大小(与此不同initWithImage:).

每当您遇到这样的问题时,如果您错过了某些内容,总是值得查看文档:

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

因此,sizeToFit在设置image属性后添加一个调用:

self.imageView.image = testImg;
[self.imageView sizeToFit];
Run Code Online (Sandbox Code Playgroud)

作为旁注,我只会self.在你写一个属性,而不是读它或调用一个方法时使用点符号.换句话说,你可以通过写作来逃避:

// we are not setting imageView itself here, only a property on it
imageView.image = testImg; 

// this is a method call, so "self." not needed
[imageView sizeToFit];     
Run Code Online (Sandbox Code Playgroud)