2009-11-02 27 views
46

Tôi có một số UIImage mà tôi muốn vẽ trên UIView. Nhưng thay vì tạo một số UIImageView và thêm số này dưới dạng chế độ xem phụ, tôi muốn ghi đè -drawRect: và trực tiếp vẽ UIView của tôi.Cách vẽ UIImage hoặc trực tiếp trong -drawRect :?

Ví dụ, mã của tôi trông giống như:

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

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

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

Trả lời

83

Gọi [img drawInRect:rect];.

+4

Ngoài ra còn có '[img drawAtPoint: point]' nữa, mặc dù tôi thích 'drawInRect:'. –

+0

cố gắng tránh kỹ thuật này nếu bạn có thể; drawInRect và drawAtPoint có hiệu suất khá khủng khiếp. – TomSwift

+1

Cảm ơn. Tôi thấy những thứ này đặc biệt hữu ích (kết hợp với các tiện ích vẽ NSString UIKit tương tự) cho các khung nhìn có chứa hình ảnh nền & văn bản và sau đó được thêm vào dạng xem cuộn. Vẽ hình nền và văn bản với nhau trong drawRect: tránh Quartz pha trộn các lớp (vì nó sẽ làm nếu bạn sử dụng phương pháp tiếp cận phụ UIImageView & UILabel) có tác động đáng kể đến hiệu suất cuộn – cidered

30

BTW, bạn không nên tải tệp hình ảnh trong phương thức drawRect. Bởi vì phương thức này được gọi bất cứ khi nào chế độ xem được yêu cầu cập nhật. Do đó, nó (tất nhiên, quá trình tải) có thể được gọi nhiều lần trong khi chạy. (Hơn nữa, phương pháp imageNamed của OS2.x có lỗi - không được lưu trong bộ nhớ cache và bị rò rỉ.)

Do đó, bạn nên tải tệp theo phương thức khởi tạo chứ không phải trong drawRect.

+0

Cảm ơn thông tin hữu ích đó. Thật không may, bạn có nghĩa là phương pháp "khởi tạo" nào? – geforce

+0

Có lẽ anh ta có nghĩa là '+ (void) initialize', hoặc phương thức' init' thông thường, tùy thuộc vào việc bạn đang làm. – Mason

Các vấn đề liên quan