Лучший способ инициализировать UIImageView с ненулевым происхождением - PullRequest
0 голосов
/ 29 февраля 2012

Создание 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 ]

4 голосов
/ 29 февраля 2012

Жесткое кодирование размеров изображений - это форма Безымянные числовые константы , что является признаком Кодовый запах

Такого рода вещей следует избегать, насколько это возможно, поскольку он может генерировать код, который намного сложнее поддерживать и который подвержен ошибкам, вносимым человеком. Например, что происходит, когда ваш художник-график меняет размер изображения? Вместо того, чтобы менять только одну вещь (изображение), теперь вам нужно изменить много вещей (изображение и каждое место в коде, где размер изображения был жестко задан)

Помните, что вы пишете код не на сегодня, а для людей, которые придут за вами и поддержат ваш код.

Во всяком случае, если вы действительно беспокоились о дополнительных строках кода, то вы бы абстрагировали загрузку 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 голос
/ 29 февраля 2012

Я использую второй с небольшой модификацией,

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

, потому что imageNamed: кэширует изображение и вызывает утечку памяти.

0 голосов
/ 29 февраля 2012

Конечно, это зависит от ваших требований. Если мне нужно создать 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.

Кстати, вы можете избежать imageNamed, поскольку он кэширует изображение, которое может привести к утечкам.

0 голосов
/ 29 февраля 2012

Я обычно хочу, чтобы мой код был легко читаемым. С другой стороны, я хочу, чтобы работа выполнялась как можно быстрее. В этом случае кода так мало, я бы пошел с меньшим количеством кода. Это потому, что я могу понять это так быстро, в любом случае. Если бы это был гораздо более крупный пример, я бы использовал легко читаемый код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...