2009-11-02 6 views
46

У меня есть UIImage, который я хочу нарисовать на UIView. Но вместо создания UIImageView и добавления этого в качестве подвью, я хочу перезаписать -drawRect: и нарисовать свой UIView напрямую.Как нарисовать UIImage или непосредственно в -drawRect :?

Например, мой код выглядит следующим образом:

- (void)drawRect:(CGRect)rect { 
    CGContextRef myContext = UIGraphicsGetCurrentContext(); 

    UIImage *img = [UIImage imageNamed:@"foo.png"]; 

    // how to draw the directly into the view now? 
} 

ответ

83

Зов [img drawInRect:rect];.

+4

Существует также '[img drawAtPoint: point]', хотя я предпочитаю 'drawInRect:'. –

+0

старайтесь избегать этой техники, если можете; DrawInRect и drawAtPoint имеют довольно ужасную производительность. – TomSwift

+1

Спасибо. Я нашел их особенно полезными (в сочетании с аналогичными надстрочными надписями NSString UIKit) для представлений, содержащих фоновые изображения и текст, а затем добавленные в список прокрутки. Рисование фонового изображения и текста вместе в drawRect: позволяет избежать кварца из смешивания слоев (как это было бы, если бы вы использовали подход UIImageView & UILabel subviews), что оказывает значительное влияние на производительность прокрутки – cidered

30

BTW, вы не должны загружать файл изображения в метод drawRect. Потому что метод вызывается всякий раз, когда требуется обновлять представление. Следовательно, это (конечно, процедура загрузки) можно назвать много раз во время работы. (Кроме того, метод image.Named OS2.x имеет ошибку - не кэшировал изображение и не просочился.)

Поэтому вам лучше загрузить файл в метод инициализации, а не в drawRect.

+0

Спасибо за эту полезную информацию. К сожалению, какой метод «инициализации» вы имеете в виду? – geforce

+0

Вероятно, он означает '+ (void) initialize' или обычный метод' init', в зависимости от того, что вы делаете. – Mason

Смежные вопросы