出于某种原因,我在每次迭代时使用不同的图像分配/初始化时只能显示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
当我使用此方法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
在使用self.imageView.image = testImg;
设置图片的位置,值ivw
和ivh
均为零且未显示图像,但对图像的后续处理仍然准确。在这两种情况下,我都会使用[self doRecognizeImage:self.imageView.image];
将图像发送到处理中。我无法弄清楚这是怎么可能的。如果在无法显示图像时处理失败,对我来说会更有意义。
想法?谢谢。
答案 0 :(得分:7)
问题是,当您在已初始化的image
上设置UIImageView
属性时,不会更新帧大小以匹配新的图片大小(与initWithImage:
不同)。
每当你遇到这样的问题时,如果你错过了某些内容,总是值得查看docs:
设置image属性不会改变UIImageView的大小。 调用sizeToFit调整视图的大小以匹配图像。
因此,在设置图像属性后添加对sizeToFit
的调用:
self.imageView.image = testImg;
[self.imageView sizeToFit];
作为旁注,当你写一个属性,而不是阅读它或调用一个方法时,我只会使用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];
答案 1 :(得分:2)
图像视图可能没有为图像调整大小,因此您将图像加载到具有零大小框架的UIImageView中。尝试手动将图像视图的框架设置为其他值。有点像:
UIImageView* test = [[UIImageView alloc] init];
[test setFrame:CGRectMake(0, 0, 100, 100)];