使用非零原点初始化UIImageView的更好方法

时间:2012-02-29 14:36:04

标签: iphone objective-c ios cocoa-touch ipad

在代码中构建接口时,创建具有一些偏移量的UIImageView是一项非常常见的任务。 我可以看到两种初始化UIImageView的方法,其原点不等于(0,0):

第一种方式只需要图像文件名和原点,但包含很多代码(我们可以使用frame.origin = CGPointMake(x,y);将行数减少一个):

UIImageView *imgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image_filename"]];
CGRect frame = imgView.frame;
frame.origin.x = 150;
frame.origin.y = 100;
undoBg.frame = frame;

第二种方法代码少得多,看起来更干净但我们需要对图像大小进行硬编码:

UIImageView *shadowView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 150, 800, 600)];
shadowView.image = [UIImage imageNamed:@"image_filename"];

您的最佳做法是什么?为什么? 感谢。

4 个答案:

答案 0 :(得分:4)

对图片大小进行硬编码是Unnamed numerical constants的一种形式,表示Code Smell

应该尽可能避免这种事情,因为它可以生成更难维护的代码,并且容易出现人为引入的错误。例如,当您的图形艺术家改变图像的大小时会发生什么?您现在必须更改许多内容(图像以及代码中图像大小已经硬编码的每个位置),而不是只更改一件事(图像)

请记住,您不是为今天编写代码,而是为了那些将来到您身边并维护代码的人。

如果有的话,如果你真的担心额外的代码行,那么你就抽象地将UIImageView加载到一个类别中,这样就可以在任何地方使用它(注意这段代码没有经过测试):

@interface UIImageView (MyExtension)
-(UIImageView*)myLoadImage:(NSString*)named at:(CGPoint)location;
@end

@implementation
-(UIImageView*)myLoadImage:(NSString*)named at:(CGPoint)location
{
  UIImageView *imgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:named]];
  CGRect frame = imgView.frame;
  frame.origin.x = location.x;
  frame.origin.y = location.y;
  return imgView;
}
@end

然后你可以这样做:

UIImageView* imageView = [UIImageView myLoadImage:@"image_filename" at:CGPointMake(150,100)]; 

答案 1 :(得分:1)

我使用第二个稍作修改,

UIImageView *shadowView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 150, 800, 600)];
shadowView.image = [UIImage imageWithData:[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:fileName ofType:extension]  ];

因为imageNamed:缓存图像并导致内存泄漏。

答案 2 :(得分:0)

我通常希望我的代码易于阅读。另一方面,我希望尽快完成工作。在这种情况下,代码很少,我会用更少的代码。这是因为无论如何我都能快速理解它。如果它是一个更大的例子,我会使用易于阅读的代码。

答案 3 :(得分:0)

当然这取决于您的要求。如果我需要在偏移量可能改变的类中创建一个imageView,那么我可能会做类似的事情:

int myX = 10;
int myY = 100;
int myWidth = 200;
int myHeight = 300;

UIImageView *shadowView = [[UIImageView alloc] initWithFrame:CGRectMake(myX, myY, myWidth, myHeight)];
shadowView.image = [UIImage imageNamed:@"image_filename"];

但是如果我不需要改变偏移量而且我知道这个值不会改变而且没有其他人需要读取或重新使用我的代码那么可能没有错(imho) )只使用数字代替int vars。

不过,你可能想避免使用imageNamed,因为它会缓存可能导致泄漏的图像。